菜单

数据库和存储架构

相关源文件

本文档涵盖了 Dify 的数据库模型、关系和存储系统,包括主要的 PostgreSQL 数据库、Redis 缓存层、用于知识检索的向量数据库以及文件存储系统。有关工作流执行存储和节点执行持久化的信息,请参阅工作流引擎文档。

概述

Dify 采用多层存储架构,旨在通过适当的持久化机制处理不同类型的数据。该系统将操作数据、缓存数据、向量嵌入和文件资产分离到专门的存储系统中。

主数据库配置

来源:docker/docker-compose.yaml589-610 api/configs/middleware/__init__.py96-145

主数据库 (PostgreSQL)

该系统使用 PostgreSQL 作为主关系数据库,用于存储应用程序元数据、用户帐户、工作流和操作数据。

数据库配置

数据库连接通过环境变量配置并通过 SQLAlchemy 管理

配置默认描述
DB_HOSTlocalhost数据库服务器主机名
DB_PORT5432数据库端口
DB_USERNAMEpostgres数据库用户名
DB_PASSWORD-数据库密码
DB_DATABASEdify数据库名称
SQLALCHEMY_POOL_SIZE30连接池大小
SQLALCHEMY_POOL_RECYCLE3600连接回收时间(秒)

PostgreSQL 实例配置了优化的内存设置

来源:docker/docker-compose.yaml598-602 docker/.env.example200-241 api/configs/middleware/__init__.py96-145

核心数据库模型

数据库模式围绕几个关键实体类型组织,并具有明确定义的关联。

来源:api/models/model.py75-305 api/models/workflow.py75-171 api/models/account.py67-200 api/models/dataset.py37-120

关键模型类

App 模型(App 核心应用程序实体,代表独立的 AI 应用程序

  • 支持多种模式:completionworkflowchatadvanced-chatagent-chat
  • 通过 AppModelConfig 和可选的 Workflow 链接到配置
  • 管理 API 访问、速率限制和权限

Workflow 模型(Workflow
存储工作流定义和执行图

  • 包含带有节点和边定义的 JSON graph 字段
  • 通过 draft 和编号版本支持版本控制
  • 包含用于文件上传和其他功能的 features 配置

Dataset 模型(Dataset 管理知识库和文档集合

  • 支持不同的索引技术:high_qualityeconomy
  • 通过 collection_binding_id 链接到向量数据库
  • 存储嵌入模型配置

来源:api/models/model.py75-305 api/models/workflow.py75-171 api/models/dataset.py37-120

缓存层 (Redis)

Redis 在架构中扮演多种角色,包括缓存、会话存储和后台任务的消息代理。

Redis 配置

Redis 支持多种部署模式

模式配置用例
单一REDIS_HOSTREDIS_PORT开发、小型部署
SentinelREDIS_USE_SENTINEL=true高可用性
ClusterREDIS_USE_CLUSTERS=true水平扩展

Celery 任务队列使用单独的 Redis 数据库(通常是 db 1)将后台作业与会话数据隔离。

来源:docker/docker-compose.yaml612-624 docker/.env.example248-282 api/configs/middleware/__init__.py8

向量存储系统

Dify 支持多种向量数据库后端,用于存储和检索用于知识检索的文档嵌入。

向量数据库工厂

向量存储系统使用工厂模式来支持多种后端

Vector 类在 vector_factory.py 中,根据配置初始化相应的向量存储

  • 读取 VECTOR_STORE 环境变量
  • 回退到数据集特定的 index_struct_dict 配置
  • 支持租户级别的白名单以实现多租户部署

来源:api/core/rag/datasource/vdb/vector_factory.py28-56 api/core/rag/datasource/vdb/vector_type.py4-27

向量数据库类型

该系统按集合命名约定对向量数据库进行分类

类别数据库集合命名
大写MILVUSPGVECTORWEAVIATEELASTICSEARCHDataset.gen_collection_name_by_id()
小写CHROMAMYSCALEOPENSEARCHTIDB_VECTOR小写集合名称
特殊处理QDRANT使用 DatasetCollectionBinding

来源:api/commands.py273-342 api/core/rag/datasource/vdb/vector_type.py4-27

文件存储系统

Dify 提供了一个统一的存储抽象层,支持本地和云存储提供商。

存储抽象

存储配置

存储通过 STORAGE_TYPE 环境变量进行配置

提供商类型配置变量
OpenDAL (默认)opendalOPENDAL_SCHEMEOPENDAL_FS_ROOT
Amazon S3s3S3_BUCKET_NAME, S3_ACCESS_KEY, S3_SECRET_KEY
Azure Blobazure-blobAZURE_BLOB_ACCOUNT_NAME, AZURE_BLOB_ACCOUNT_KEY
Google Cloudgoogle-storageGOOGLE_STORAGE_BUCKET_NAME, 服务账户 JSON
Alibaba OSSaliyun-ossALIYUN_OSS_BUCKET_NAME, ALIYUN_OSS_ACCESS_KEY

存储系统处理

  • 用户上传的文件(文档、图片、音频)
  • 工作流生成的输出文件
  • 处理过程中的临时文件
  • 插件包存储

来源: api/extensions/ext_storage.py15-100 api/configs/middleware/__init__.py47-73 docker/.env.example307-396

数据库迁移与管理

数据库初始化

该系统使用 Flask-Migrate 进行数据库模式管理

管理命令

系统提供了一些用于数据库管理的 CLI 命令

  • reset-password: 更新用户账户密码
  • reset-email: 更改用户电子邮件地址
  • vdb-migrate: 在提供程序之间迁移向量数据库集合
  • reset-encrypt-key-pair: 重新生成工作区加密密钥

当切换向量数据库提供程序时,vdb-migrate 命令支持迁移知识库向量和标注向量。

来源: api/commands.py36-153 api/app_factory.py104-109

数据关系与约束

数据库通过外键关系强制执行引用完整性

  • 租户隔离:所有主要实体都包含 tenant_id 用于多租户
  • 应用生命周期:应用会级联到对话、模型配置和相关数据
  • 工作流版本控制:每个应用有多个工作流版本,带有草稿/已发布状态
  • 数据集权限:知识库的基于角色的访问控制
  • 审计跟踪:大多数实体都包含创建/更新时间戳和用户跟踪

来源:api/models/model.py75-305 api/models/workflow.py75-171 api/models/dataset.py37-120