Files
ai-contract-platform/project-docs/V2-database-engineering-baseline-2026-06-24.md
T
yuqei a3bb78e06b
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Failing after 16m35s
release: freeze V2 release candidate
2026-07-12 15:32:24 +08:00

176 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI 合同平台 V2 数据库工程基线
日期:2026-06-24
本文对应 DB-1:最终数据库工程基线。目标是在继续开发业务功能前,把 V2 的数据库边界、环境变量、迁移责任、启动顺序、性能和安全原则固定下来。
## 总体原则
V2 不再沿用 V1 的“一个后端库承载所有领域”的方式。
最终结构一次规划到位:
- 合同产品平台使用独立合同业务库。
- AI 中台使用独立 AI 能力库。
- 基础设施和运维数据预留独立运维库。
- 跨平台只通过 API、SDK、事件引用和审计 ID 关联,不直接跨库 join。
## 数据库清单
| 数据库 | 归属平台 | 主要内容 | 连接变量 |
| --- | --- | --- | --- |
| `yuqei_contract` | `yuqei-contract-platform` | 合同、审批、台账、附件元数据、审查任务业务结果、合同事件 | `CONTRACT_API_DATABASE_URL` |
| `yuqei_ai` | `yuqei-ai-platform` | 模型网关、Prompt、知识库、RAG、向量、AI Trace、质量评测、配置执行 | `AI_PLATFORM_DATABASE_URL`、`YUQEI_WORKER_DATABASE_URL` |
| `yuqei_ops` | `yuqei-infra` | 发布记录、备份记录、运行审计、监控扩展预留 | 后续按运维服务单独配置 |
## Compose 基线
本地 compose 仍使用一个 PostgreSQL 实例,降低部署复杂度;但实例内必须创建三个数据库:
- `yuqei_contract`
- `yuqei_ai`
- `yuqei_ops`
`postgres` 服务只作为数据库实例。`postgres-init-databases` 服务负责在每次启动时幂等检查并创建缺失数据库。
迁移顺序:
1. `postgres` 启动并健康。
2. `postgres-init-databases` 创建数据库。
3. `ai-platform-api-migrate` 升级 `yuqei_ai`。
4. `contract-api-migrate` 升级 `yuqei_contract`。
5. AI 平台、合同 API、worker、前端启动。
## 迁移责任
合同平台:
- Alembic 目录:`yuqei-contract-platform/services/contract-api/migrations`
- 只允许修改 `yuqei_contract`
- Alembic version table:`contract_api_alembic_version`
AI 平台:
- Alembic 目录:`yuqei-ai-platform/services/ai-platform-api/migrations`
- 只允许修改 `yuqei_ai`
- Alembic version table:`ai_platform_alembic_version`
运维平台:
- 当前只预留 `yuqei_ops`
- 后续如增加运维服务,必须独立迁移目录,不复用合同或 AI 的迁移链。
## 表设计原则
所有核心业务表默认遵循:
- 主键使用稳定字符串 ID 或 UUID,不使用有业务含义的自然键。
- 需要企业隔离的表必须有 `tenant_id`。
- 需要审计的表必须有 `created_at`、`updated_at`,重要业务表补 `created_by`、`updated_by`。
- 用户可删除的业务数据优先软删除,使用 `deleted_at`。
- 状态字段保存事实状态,不保存前端展示文案。
- 大文件、原始上传文件、导出文件不进数据库,只保存对象存储 key、hash、大小、MIME、版本和来源。
- JSON 字段只能用于扩展元数据,不能长期承载核心查询字段。
- 需要统计、筛选、排序、权限判断的字段必须结构化。
## 索引原则
合同库优先索引:
- `(tenant_id, status, updated_at)`
- `(tenant_id, owner_id, updated_at)`
- `(tenant_id, approval_status, updated_at)`
- `(tenant_id, lifecycle_state, next_due_at)`
- `contract_files(contract_id, created_at)`
- `review_tasks(contract_id, status, updated_at)`
- `contract_audit_events(contract_id, created_at)`
AI 库优先索引:
- `ai_run_audits(created_at)`
- `ai_run_audits(trace_id)` 或等价 trace 主键。
- `(tenant_id, capability, created_at)`
- `knowledge_chunks(document_id, chunk_index)`
- `knowledge_chunks(embedding)` 使用 pgvector 索引。
- `quality_labels(status, code, created_at)`
- `provider_config_changes(provider_id, created_at)`
- `worker_run_executions(worker_name, started_at)`
## 安全原则
- 生产必须禁用自动建表:`*_DATABASE_AUTO_CREATE=false`。
- 生产必须禁用 demo seed:`CONTRACT_API_SEED_DEMO_DATA=false`。
- 生产数据库密码不得使用默认值。
- Provider API Key、对象存储密钥、数据库密码不入库明文;需要入库时必须加密或交给密钥服务。
- 合同库与 AI 库使用不同数据库名称,生产环境优先使用不同账号授权。
- AI Trace 中的 Prompt、输入、输出需要保留脱敏策略和保留周期。
- 所有下载、上传、审批、配置发布、模型回滚、知识库重建索引都必须留审计事件。
## 性能原则
- 合同列表、待办、搜索、台账必须走索引字段,不依赖 JSON 全表扫描。
- 合同正文、审查全文、AI 输出全文可以保存为文本,但列表页只读取摘要字段。
- 文件预览读取对象存储,不从数据库拉大对象。
- AI 知识库检索使用关键词 + 向量 + 混合排序,向量检索在生产使用 pgvector。
- 长流程如合同审查、文档解析、OCR、知识库索引进入 worker,不阻塞 API 请求。
- 批量导入、批量下载、批量导出必须有任务状态,不做长时间同步请求。
## 环境变量基线
本地默认:
```text
POSTGRES_DB=postgres
CONTRACT_POSTGRES_DB=yuqei_contract
AI_PLATFORM_POSTGRES_DB=yuqei_ai
OPS_POSTGRES_DB=yuqei_ops
CONTRACT_API_DATABASE_URL=postgresql+psycopg://yuqei:yuqei-local@postgres:5432/yuqei_contract
AI_PLATFORM_DATABASE_URL=postgresql+psycopg://yuqei:yuqei-local@postgres:5432/yuqei_ai
YUQEI_WORKER_DATABASE_URL=postgresql+psycopg://yuqei:yuqei-local@postgres:5432/yuqei_ai
```
生产默认:
```text
POSTGRES_DB=postgres
CONTRACT_POSTGRES_DB=yuqei_contract
AI_PLATFORM_POSTGRES_DB=yuqei_ai
OPS_POSTGRES_DB=yuqei_ops
CONTRACT_API_DATABASE_URL=postgresql+psycopg://CHANGE_ME:CHANGE_ME@postgres:5432/yuqei_contract
AI_PLATFORM_DATABASE_URL=postgresql+psycopg://CHANGE_ME:CHANGE_ME@postgres:5432/yuqei_ai
YUQEI_WORKER_DATABASE_URL=postgresql+psycopg://CHANGE_ME:CHANGE_ME@postgres:5432/yuqei_ai
```
## DB-1 完成标准
- compose 不再默认使用 `yuqei_v2` 单库。
- 本地环境样例明确合同库、AI 库、运维库。
- 生产环境样例明确合同库、AI 库、运维库。
- 基础设施 README 说明数据库拓扑和迁移顺序。
- 运行验证至少覆盖 YAML 解析和已有 API 测试;如本机没有 Docker,应在结果中明确说明无法执行 compose 启动验证。
## 本轮落地记录
已完成:
- `yuqei-infra/compose/docker-compose.yml` 增加 `postgres-init-databases`,启动时幂等创建 `yuqei_contract`、`yuqei_ai`、`yuqei_ops`。
- PostgreSQL 默认镜像改为 `pgvector/pgvector:pg16`,保证 `yuqei_ai` 可以执行 `CREATE EXTENSION vector`。
- 合同 API、合同审查 worker 默认连接 `yuqei_contract`。
- AI Platform API、AI worker 默认连接 `yuqei_ai`。
- `yuqei-infra/compose/.env.example` 增加三库本地配置。
- `yuqei-infra/compose/.env.production.example` 增加三库生产配置。
- `yuqei-infra/README.md` 更新数据库拓扑、迁移顺序和跨平台引用原则。
验证结果:
- YAML 解析通过,服务清单和数据库连接默认值符合三库基线。
- `rg` 检查 `yuqei-infra`、合同 API、AI API、worker 范围内不再出现 `yuqei_v2`。
- `python -m pytest yuqei-contract-platform\services\contract-api\tests -q` 通过。
- `python -m pytest yuqei-ai-platform\services\ai-platform-api\tests -q` 通过。
- `python -m pytest yuqei-ai-platform\services\worker\tests -q` 通过。
- `python -m pytest yuqei-ai-sdk-python\tests -q` 通过。
未执行:
- 本机未安装 Docker,`docker --version` 不可用,因此没有在本机执行 `docker compose up --build` 级别的容器启动验证。后续在装有 Docker 的开发机或服务器上需要执行 compose 启动与迁移验证。