data_access_repositories 模块
概述
data_access_repositories 模块是系统的数据访问层,负责管理所有与数据持久化相关的操作。它提供了统一的数据访问抽象,支持多种存储后端(包括关系型数据库、向量数据库、图数据库等),并实现了租户隔离、资源共享和数据检索等核心功能。
架构概览
这个模块采用分层架构设计,将数据访问逻辑划分为几个主要子模块:
- 内容与知识管理仓库:处理知识、文档块、会话和消息等核心业务数据
- 身份、租户与组织仓库:管理用户、租户、组织和资源共享权限
- 代理配置与外部服务仓库:存储自定义代理配置和外部服务连接信息
- 向量检索后端仓库:提供多种向量数据库的实现
- 图检索与记忆仓库:管理知识图谱和会话记忆
核心设计理念
1. 多租户数据隔离
模块通过在所有数据操作中强制使用租户 ID 过滤器,实现了严格的多租户数据隔离。每个仓库的查询方法都接受 tenantID 参数,确保租户间的数据完全隔离。
2. 统一接口抽象
模块为每种数据类型定义了清晰的接口契约(位于 types/interfaces 包),使得上层业务逻辑可以依赖抽象而非具体实现,提高了系统的可测试性和可扩展性。
3. 多种存储后端支持
对于向量检索,模块提供了多种数据库实现(Elasticsearch、Milvus、PostgreSQL、Qdrant),允许根据不同的部署场景选择最适合的存储方案。
4. 资源共享模型
模块实现了组织级别的资源共享机制,支持知识和代理在组织内部共享,并通过细粒度的权限控制确保数据安全。
子模块概览
content_and_knowledge_management_repositories
负责管理系统的核心业务数据,包括知识文档、文档块、会话记录和消息历史等。该子模块是系统数据层的核心,提供了完整的 CRUD 操作和复杂查询能力。
详细内容请参考:content_and_knowledge_management_repositories
identity_tenant_and_organization_repositories
管理用户身份、租户配置、组织架构和资源共享权限。实现了完整的用户认证、授权和资源访问控制机制。
详细内容请参考:identity_tenant_and_organization_repositories
agent_configuration_and_external_service_repositories
存储自定义代理的配置信息和外部服务(如 MCP 服务)的连接参数。
详细内容请参考:agent_configuration_and_external_service_repositories
vector_retrieval_backend_repositories
提供向量检索功能的多种实现,支持不同的向量数据库后端。每个实现都提供统一的接口,但针对特定数据库进行了优化。
详细内容请参考:vector_retrieval_backend_repositories
graph_retrieval_and_memory_repositories
管理知识图谱和会话记忆数据,使用图数据库存储和检索实体关系。
详细内容请参考:graph_retrieval_and_memory_repositories
数据流向
典型的数据操作流程如下:
-
写入流程:应用服务 → 仓库层 → 数据库
- 应用服务调用仓库接口
- 仓库实现使用 GORM 或特定数据库客户端执行操作
- 数据持久化到相应的存储后端
-
读取流程:数据库 → 仓库层 → 应用服务
- 应用服务通过仓库接口发起查询
- 仓库实现构建查询条件并执行
- 结果映射为领域模型返回给应用服务
-
向量检索流程:查询 → 向量数据库 → 相似度计算 → 结果返回
- 应用服务构建检索参数
- 仓库实现将查询向量化
- 在向量数据库中执行相似度搜索
- 返回最相关的结果
关键设计决策
1. 租户隔离的实现方式
选择:在每个查询中显式传递租户 ID 并应用过滤条件 替代方案:使用数据库级别的租户隔离(如 PostgreSQL 的行级安全策略)
理由:
- 显式传递租户 ID 使隔离逻辑更加透明和可测试
- 支持跨租户的管理操作(如超级管理员功能)
- 不依赖特定数据库的特性,保持数据库无关性
2. 向量检索的多后端支持
选择:为每个向量数据库提供独立的仓库实现,通过统一接口抽象 替代方案:使用向量数据库抽象层(如 LangChain 的向量存储)
理由:
- 可以充分利用每个数据库的独特特性
- 避免过度抽象导致的功能限制
- 便于针对特定数据库进行性能优化
3. 软删除策略
选择:使用 GORM 的软删除功能,保留删除记录 替代方案:物理删除或归档到历史表
理由:
- 支持数据恢复和审计需求
- 保持引用完整性
- 符合现代应用的数据保留最佳实践
与其他模块的依赖关系
该模块被系统的其他核心模块广泛依赖:
- application_services_and_orchestration:主要消费者,使用仓库进行所有数据操作
- http_handlers_and_routing:通过服务层间接使用仓库
- core_domain_types_and_interfaces:定义了仓库接口和数据模型
使用指南
基本使用模式
// 初始化仓库
db := // 获取 GORM 数据库连接
knowledgeRepo := repository.NewKnowledgeRepository(db)
// 创建记录
knowledge := &types.Knowledge{
TenantID: tenantID,
KnowledgeBaseID: kbID,
FileName: "example.pdf",
// ... 其他字段
}
err := knowledgeRepo.CreateKnowledge(ctx, knowledge)
// 查询记录
result, err := knowledgeRepo.GetKnowledgeByID(ctx, tenantID, knowledgeID)
// 更新记录
knowledge.FileName = "updated.pdf"
err = knowledgeRepo.UpdateKnowledge(ctx, knowledge)
// 删除记录
err = knowledgeRepo.DeleteKnowledge(ctx, tenantID, knowledgeID)
注意事项
- 租户隔离:始终确保在调用仓库方法时传递正确的租户 ID
- 事务管理:对于需要原子性的操作,使用 GORM 的事务支持
- 批量操作:对于大量数据操作,使用批量方法以提高性能
- 错误处理:注意处理仓库方法返回的特定错误类型(如
ErrKnowledgeNotFound)
扩展性
模块设计了多个扩展点:
- 新的仓库实现:可以通过实现
interfaces包中定义的接口来添加新的仓库实现 - 新的向量数据库:可以通过实现
RetrieveEngineRepository接口来添加新的向量数据库支持 - 查询扩展:可以在现有仓库中添加新的查询方法以支持特定的业务需求
总结
data_access_repositories 模块是系统的数据基石,提供了统一、安全、高效的数据访问能力。通过清晰的接口抽象和多后端支持,它既满足了当前的业务需求,也为未来的扩展留下了充足的空间。