feat(aia): Complete AIA V2.0 with universal streaming capabilities

Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
This commit is contained in:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,7 +1,6 @@
# 数据库连接配置
> **文档版本:** v1.0
> **创建日期:** 2025-11-09
# <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>仿<EFBFBD>蝵?
> **<2A><><EFBFBD><EFB99D>𧋦嚗?* v1.0
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗?* 2025-11-09
> **蝏湔擪<E6B994><E693AA><EFBFBD>** <20><EFBFBD><E59786><EFBFBD>
> **<2A><><EFBFBD>擧凒<E693A7><EFBFBD>** 2025-11-09
@@ -9,26 +8,20 @@
## <20><> <20><>﹝霂湔<E99C82>
本文档记录Schema隔离架构实施相关的数据库连接和配置信息包括
- 当前数据库状态
- Schema隔离迁移配置
- 迁移过程的连接方式
- 验证和回滚方案
<EFBFBD><EFBFBD><EFBFBD>扇敶笌chema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>摰墧鴌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈墧𦻖<EFBFBD><EFBFBD>蝵桐縑<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡠺嚗?- 敶枏<E695B6><E69E8F>唳旿摨梶𠶖<E6A2B6>?- Schema<6D>𠉛氖餈<E6B096><EFBFBD>滨蔭
- <EFBFBD>宏餈<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>交䲮撘?- 撉諹<E69289><E8ABB9><EFBFBD><EFBFBD>皛𡁏䲮獢?
---
## 🗄️ 当前数据库状态
### 数据库基本信息
**连接信息:**
## <EFBFBD><EFBFBD>儭?敶枏<E695B6><E69E8F>唳旿摨梶𠶖<E6A2B6>?
### <20>唳旿摨枏抅<E69E8F>砌縑<E7A08C>?
**餈墧𦻖靽⊥<E99DBD>嚗?*
```
<EFBFBD>唳旿摨梶掩<EFBFBD><EFBFBD>PostgreSQL 15+
<EFBFBD>唳旿摨枏<EFBFBD>蝘堆<EFBFBD>ai_clinical_research
主机地址: localhost
端口: 5432
銝餅㦤<EFBFBD><EFBFBD>嚗? localhost
蝡臬藁嚗? 5432
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> postgres
密码: postgres
<EFBFBD><EFBFBD>嚗? postgres
```
**摰峕㟲餈墧𦻖摮㛖泵銝莎<E98A9D>**
@@ -40,19 +33,16 @@ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
### 敶枏<E695B6>Schema蝏𤘪<E89D8F>
**现有Schema**
- **public** - 所有13个表都在这里
**<EFBFBD><EFBFBD>Schema嚗?*
- <EFBFBD>?**public** - <EFBFBD><EFBFBD><EFBFBD>?3銝芾”<E88ABE>賢銁餈䠷<E9A488>
**表清单13个**
**銵冽<EFBFBD><EFBFBD>𤏪<EFBFBD>13銝迎<EFBFBD>嚗?*
#### 1. 平台基础2个表
```sql
public.users -- 用户表
public.admin_logs -- 管理日志
#### 1. 撟喳蝱<EFBFBD><EFBFBD>嚗?銝芾”嚗?```sql
public.users -- <20><EFBFBD>銵?public.admin_logs -- 蝞∠<E89D9E><E288A0><EFBFBD>
```
#### 2. AI智能问答5个表
```sql
#### 2. AI<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?銝芾”嚗?```sql
public.projects -- 憿寧𤌍蝞∠<E89D9E>
public.conversations -- 憿寧𤌍撖寡<E69296>
public.messages -- 撖寡<E69296><EFBFBD><E798A8>
@@ -60,42 +50,29 @@ public.general_conversations -- 通用对话
public.general_messages -- <20>𡁶鍂瘨<E98D82><E798A8>
```
#### 3. 个人知识库2个表
```sql
public.knowledge_bases -- 知识库
public.documents -- 文档
#### 3. 銝芯犖<EFBFBD><EFBFBD>摨橒<EFBFBD>2銝芾”嚗?```sql
public.knowledge_bases -- <20><EFBFBD>摨?public.documents -- <20><>
```
#### 4. 批处理系统3个表
```sql
public.batch_tasks -- 批处理任务
public.batch_results -- 批处理结果
public.task_templates -- 任务模板
#### 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>頂蝏<EFBFBD><EFBFBD>3銝芾”嚗?```sql
public.batch_tasks -- <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD>?public.batch_results -- <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD>?public.task_templates -- 隞餃𦛚璅⊥踎
```
#### 5. 稿件审查1个表
```sql
#### 5. 蝔蹂辣摰⊥䰻嚗?銝芾”嚗?```sql
public.review_tasks -- 摰⊥䰻隞餃𦛚
```
---
### 数据库统计信息
**表数量:** 13个
**索引数量:** 约40个
**外键约束:** 约15个
### <EFBFBD>唳旿摨梶<EFBFBD>霈∩縑<EFBFBD>?
**銵冽㺭<E586BD>𧶏<EFBFBD>** 13銝?
**<EFBFBD><EFBFBD><EFBFBD>嚗?* 蝥?0銝?
**憭㚚睸蝥行<EFBFBD>嚗?* 蝥?5銝?
**敶枏<E695B6><E69E8F>唳旿<E594B3>𧶏<EFBFBD>隡啁<E99AA1>嚗㚁<E59A97>**
- users: ~10
- projects: ~20条
- conversations: ~50条
- messages: ~500条
- knowledge_bases: ~5条
- documents: ~30条
- 其他表:测试数据
- users: ~10<EFBFBD>?- projects: ~20<32>?- conversations: ~50<35>?- messages: ~500<30>?- knowledge_bases: ~5<>?- documents: ~30<33>?- <20><EFBFBD>銵剁<E98AB5>瘚贝<E7989A><E8B49D>唳旿
**总数据量:** < 10MB测试环境
**<EFBFBD>餅㺭<EFBFBD><EFBFBD>嚗?* < 10MB嚗<42><E59A97>霂閧㴓憓<E3B493><E68693>
---
@@ -103,13 +80,13 @@ public.review_tasks -- 审查任务
### 10銝芰𡠺蝡喹chema
#### 需要详细设计+数据迁移5个
#### <EFBFBD><EFBFBD><EFBFBD>祕蝏<EFBFBD>挽霈?<3F>唳旿餈<E697BF>宏嚗?銝迎<E98A9D>
**1. platform_schema嚗<61><EFBFBD>啣抅蝖<E68A85><EFBFBD><E69285>**
```sql
-- 餈<>宏銵剁<E98AB5>
public.users platform_schema.users
public.admin_logs platform_schema.admin_logs
public.users <EFBFBD>?platform_schema.users
public.admin_logs <EFBFBD>?platform_schema.admin_logs<><E59A97>蝻橒<E89DBB><EFBFBD>霈歹<E99C88>
```
**2. common_schema嚗<61><E59A97>𡁶鍂<F0A181B6><EFBFBD><EFBFBD><E69285>**
@@ -119,7 +96,7 @@ common_schema.llm_usage -- LLM使用记录
common_schema.feature_flags -- Feature Flags
```
**3. asl_schemaAI智能文献**
**3. asl_schema嚗㇁I<EFBFBD><EFBFBD><EFBFBD><EFBFBD>讃嚗?*
```sql
-- <20>啣遣銵剁<E98AB5>
asl_schema.literature_projects -- <20><>讃憿寧𤌍
@@ -128,38 +105,36 @@ asl_schema.literature_items -- 文献条目
-- <20><EFBFBD>銵刻<E98AB5>ASL霈曇恣<E69B87><E681A3>
```
**4. aia_schemaAI智能问答**
**4. aia_schema嚗㇁I<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
```sql
-- 餈<>宏銵剁<E98AB5>
public.projects aia_schema.projects
public.conversations aia_schema.conversations
public.messages aia_schema.messages
public.general_conversations aia_schema.general_conversations
public.general_messages aia_schema.general_messages
public.projects <EFBFBD>?aia_schema.projects
public.conversations <EFBFBD>?aia_schema.conversations
public.messages <EFBFBD>?aia_schema.messages
public.general_conversations <EFBFBD>?aia_schema.general_conversations
public.general_messages <EFBFBD>?aia_schema.general_messages
```
**5. pkb_schema(个人知识库)**
**5. pkb_schema<EFBFBD>葵鈭箇䰻霂<EFBFBD><EFBFBD>嚗?*
```sql
-- 餈<>宏銵剁<E98AB5>
public.knowledge_bases pkb_schema.knowledge_bases
public.documents pkb_schema.documents
public.knowledge_bases <EFBFBD>?pkb_schema.knowledge_bases
public.documents <EFBFBD>?pkb_schema.documents
```
#### 只创建空Schema5个
**6. dc_schema数据清洗** - 暂无表结构
**7. rvw_schema审稿系统** - 暂无表结构
**8. admin_schema运营管理** - 暂无表结构
**9. ssa_schema智能统计分析** - 暂无表结构
**10. st_schema统计分析工具** - 暂无表结构
#### <EFBFBD><EFBFBD>撱箇征Schema嚗?銝迎<E98A9D>
**6. dc_schema嚗<61><EFBFBD><EFBFBD>瘣梹<E798A3>** - <20><><EFBFBD>銵函<E98AB5><E587BD>?
**7. rvw_schema嚗<61>恣蝔輻頂蝏<E9A082><E89D8F>** - <20><><EFBFBD>銵函<E98AB5><E587BD>?
**8. admin_schema嚗<61><E59A97><EFBFBD>亦恣<E4BAA6><E681A3><EFBFBD>** - <20><><EFBFBD>銵函<E98AB5><E587BD>?
**9. ssa_schema嚗<61><EFBFBD><EFBFBD><E99C88><E288AA><EFBFBD>** - <20><><EFBFBD>銵函<E98AB5><E587BD>?
**10. st_schema嚗<61><E59A97><E99C88><E288AA>𣂼極<F0A382BC><EFBFBD>** - <20><><EFBFBD>銵函<E98AB5><E587BD>?
---
## <20><><>宏餈<E5AE8F><E9A488>餈墧𦻖<E5A2A7>滨蔭
### 迁移前准备
**1. 备份当前数据库**
### <EFBFBD><EFBFBD><EFBFBD>憭?
**1. 憭<>遢敶枏<E695B6><E69E8F>唳旿摨?*
```bash
# Windows PowerShell
cd D:\MyCursor\AIclinicalresearch\backend
@@ -173,11 +148,9 @@ pg_dump -h localhost -U postgres -d ai_clinical_research > backup_before_schema_
**2. 撉諹<E69289><EFBFBD>**
```bash
# 检查备份文件大小
ls -lh backup_*.dump
# <EFBFBD><EFBFBD><EFBFBD>隞賣<EFBFBD>隞嗅之撠?ls -lh backup_*.dump
# 验证备份内容SQL格式
head -n 50 backup_*.sql
# 撉諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>捆嚗𠄎QL<EFBFBD><EFBFBD>嚗?head -n 50 backup_*.sql
```
---
@@ -186,43 +159,40 @@ head -n 50 backup_*.sql
#### <20><EFBFBD>1嚗帋蝙<E5B88B>沌risma Migrate嚗<65><EFBFBD><EFBFBD>
**连接配置:**
**餈墧𦻖<EFBFBD>滨蔭嚗?*
```env
# backend/.env
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
```
**执行迁移:**
**<EFBFBD><EFBFBD><EFBFBD>宏嚗?*
```bash
cd backend
# <20>𥕦遣<F0A595A6><EFBFBD><EFBFBD>
npx prisma migrate dev --name schema_isolation_10_schemas
# 查看迁移状态
npx prisma migrate status
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?npx prisma migrate status
```
---
#### <20><EFBFBD>2嚗𡁶凒<F0A181B6><EFBFBD>銵玺QL<51>𡁏𧋦
**连接方式:**
**餈墧𦻖<EFBFBD><EFBFBD>嚗?*
```bash
# 雿輻鍂psql餈墧𦻖
psql -h localhost -U postgres -d ai_clinical_research
# 或使用环境变量
export PGPASSWORD=postgres
# <EFBFBD>碶蝙<EFBFBD>函㴓憓<EFBFBD><EFBFBD><EFBFBD>?export PGPASSWORD=postgres
psql -h localhost -U postgres -d ai_clinical_research -f migration_script.sql
```
**执行迁移脚本:**
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡁏𧋦嚗?*
```bash
cd docs/09-<2D><EFBFBD>摰墧鴌/migration-scripts
# 按顺序执行
psql -h localhost -U postgres -d ai_clinical_research -f 001-create-all-10-schemas.sql
# <EFBFBD>厰◇摨𤩺<EFBFBD>銵?psql -h localhost -U postgres -d ai_clinical_research -f 001-create-all-10-schemas.sql
psql -h localhost -U postgres -d ai_clinical_research -f 002-migrate-platform.sql
psql -h localhost -U postgres -d ai_clinical_research -f 003-migrate-aia.sql
psql -h localhost -U postgres -d ai_clinical_research -f 004-migrate-pkb.sql
@@ -233,31 +203,28 @@ psql -h localhost -U postgres -d ai_clinical_research -f 004-migrate-pkb.sql
#### <20><EFBFBD>3嚗帋蝙<E5B88B>典虾閫<E899BE><E996AB>撌亙<E6928C>
**pgAdmin 4**
1. 连接信息:
- 主机localhost
- 端口5432
**pgAdmin 4嚗?*
1. 餈墧𦻖靽⊥<EFBFBD>嚗? - 銝餅㦤嚗饝ocalhost
- 蝡臬藁嚗?432
- <20>唳旿摨橒<E691A8>ai_clinical_research
- <20><EFBFBD>嚗䮝ostgres
-<><E69296>嚗䮝ostgres
2. 执行迁移:
- 打开Query Tool
2. <EFBFBD><EFBFBD><EFBFBD>宏嚗? - <20><EFBFBD>Query Tool
- <20>㰘蝸SQL<51>𡁏𧋦
- <20><EFBFBD>
**DataGrip / DBeaver**
- 同样的连接信息
- 支持事务管理
**DataGrip / DBeaver嚗?*
- <EFBFBD>峕甅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>乩縑<EFBFBD>?- <20><EFBFBD>鈭见𦛚蝞∠<E89D9E>
- <20>嫣噶<E5ABA3><EFBFBD>
---
## ✅ 迁移验证
## <EFBFBD>?餈<>宏撉諹<E69289>
### 1. 璉<><E79289>兄chema<6D>𥕦遣
**SQL验证:**
**SQL撉諹<EFBFBD>嚗?*
```sql
-- <20><EFBFBD><E4BAA6><EFBFBD><EFBFBD>农chema
SELECT schema_name
@@ -265,8 +232,7 @@ FROM information_schema.schemata
WHERE schema_name NOT IN ('pg_catalog', 'information_schema')
ORDER BY schema_name;
-- 预期结果:
-- admin_schema
-- <EFBFBD><EFBFBD>蝏𤘪<EFBFBD>嚗?-- admin_schema
-- aia_schema
-- asl_schema
-- common_schema
@@ -283,32 +249,29 @@ ORDER BY schema_name;
### 2. 璉<><E79289>亥”餈<E2809D>
**验证platform_schema**
**撉諹<EFBFBD>platform_schema嚗?*
```sql
-- 查看表
SELECT table_name
-- <EFBFBD><EFBFBD>銵?SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'platform_schema';
-- 撉諹<E69289><E8ABB9>唳旿
SELECT COUNT(*) FROM platform_schema.users;
-- 预期与原public.users的数量一致
```
-- <EFBFBD><EFBFBD>嚗帋<EFBFBD><EFBFBD>ublic.users<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?```
**验证aia_schema**
**<EFBFBD>aia_schema嚗?*
```sql
-- <20><EFBFBD><E4BAA6><EFBFBD><EFBFBD>㕑”
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'aia_schema';
-- 验证数据完整性
SELECT COUNT(*) FROM aia_schema.projects;
-- 撉諹<EFBFBD><EFBFBD>唳旿摰峕㟲<EFBFBD>?SELECT COUNT(*) FROM aia_schema.projects;
SELECT COUNT(*) FROM aia_schema.conversations;
SELECT COUNT(*) FROM aia_schema.messages;
```
**验证pkb_schema**
**撉諹<EFBFBD>pkb_schema嚗?*
```sql
SELECT COUNT(*) FROM pkb_schema.knowledge_bases;
SELECT COUNT(*) FROM pkb_schema.documents;
@@ -318,10 +281,9 @@ SELECT COUNT(*) FROM pkb_schema.documents;
### 3. 撉諹<E69289>憭㚚睸<E39A9A>喟頂
**检查跨Schema外键:**
**<EFBFBD><EFBFBD>亥楊Schema憭㚚睸嚗?*
```sql
-- 查看所有外键约束
SELECT
-- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>桃漲<EFBFBD>?SELECT
tc.table_schema,
tc.table_name,
kcu.column_name,
@@ -344,8 +306,7 @@ ORDER BY tc.table_schema, tc.table_name;
**璉<><E79289>亦揣撘閙糓<E99699>行迤蝖株<E89D96>蝘鳴<E89D98>**
```sql
-- 查看某个Schema的所有索引
SELECT
-- <EFBFBD><EFBFBD><EFBFBD>𣂷葵Schema<EFBFBD><EFBFBD><EFBFBD><EFBFBD>厩揣撘?SELECT
schemaname,
tablename,
indexname,
@@ -376,7 +337,7 @@ npx ts-node -e "import { PrismaClient } from '@prisma/client'; const p = new Pri
### <20>箸艶1嚗朞<E59A97>蝘餉<E89D98>蝔衤葉<E8A1A4>𤑳緵<F0A491B3><EFBFBD>
**立即回滚:**
**蝡见朖<EFBFBD><EFBFBD>嚗?*
```bash
# 憒<><E68692>雿輻鍂Prisma Migrate
npx prisma migrate reset
@@ -391,8 +352,7 @@ psql -h localhost -U postgres -d ai_clinical_research < backup_before_schema_mig
**<EFBFBD><EFBFBD>A嚗帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
```bash
# 1. 删除当前数据库
dropdb -h localhost -U postgres ai_clinical_research
# 1. <EFBFBD>𣳇膄敶枏<EFBFBD><EFBFBD>唳旿摨?dropdb -h localhost -U postgres ai_clinical_research
# 2. <20>齿鰵<E9BDBF>𥕦遣
createdb -h localhost -U postgres ai_clinical_research
@@ -403,8 +363,7 @@ pg_restore -h localhost -U postgres -d ai_clinical_research backup_before_schema
**<EFBFBD><EFBFBD>B嚗𡁏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>斗鰵Schema嚗䔶<EFBFBD><EFBFBD>炠ublic**
```sql
-- 删除新建的Schema慎重
DROP SCHEMA IF EXISTS platform_schema CASCADE;
-- <EFBFBD>𣳇膄<EFBFBD>啣遣<EFBFBD><EFBFBD>chema嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?DROP SCHEMA IF EXISTS platform_schema CASCADE;
DROP SCHEMA IF EXISTS aia_schema CASCADE;
DROP SCHEMA IF EXISTS pkb_schema CASCADE;
DROP SCHEMA IF EXISTS asl_schema CASCADE;
@@ -420,35 +379,24 @@ DROP SCHEMA IF EXISTS st_schema CASCADE;
---
## 📊 迁移检查清单
## <EFBFBD><EFBFBD><>宏璉<E5AE8F><E79289><EFBFBD><E4BAA4>?
### 餈<><EFBFBD>齿<EFBFBD><E9BDBF>?
- [ ] <20>?<3F>唳旿摨枏歇憭<E6AD87>遢嚗Ê̄ackup_before_schema_migration_*.dump嚗?- [ ] <20>?憭<><EFBFBD><E981A2>辣撌脤<E6928C>霂?- [ ] <20>?Prisma<6D>滨蔭撌脫凒<E884AB><EFBFBD>datasource.schemas嚗?- [ ] <20>?餈<><EFBFBD>𡁏𧋦撌脣<E6928C><EFBFBD><E686AD>001-010.sql嚗?- [ ] <20>?瘚贝<E7989A><E8B49D><EFBFBD>撌脤<E6928C><EFBFBD><E99C82>蝘餅郊撉?
---
### 迁移前检查
- [ ] ✅ 数据库已备份backup_before_schema_migration_*.dump
- [ ] ✅ 备份文件已验证
- [ ] ✅ Prisma配置已更新datasource.schemas
- [ ] ✅ 迁移脚本已准备001-010.sql
- [ ] ✅ 测试环境已验证迁移步骤
### <EFBFBD>宏銝剜<EFBFBD><EFBFBD>?
- [ ] <20>?10銝杵chema<6D>𥕦遣<F0A595A6>𣂼<EFBFBD>
- [ ] <EFBFBD>?銵刻<E98AB5>蝘餅<E89D98><E9A485>躰秤嚗?銝芣<E98A9D><E88AA3>唳旿<E594B3><E697BF>chema嚗?- [ ] <20>?<3F>唳旿摰峕㟲<E5B395><EFBFBD><EFBFBD><E99C82><EFBFBD>
- [ ] <EFBFBD>?憭㚚睸蝥行<E89DA5><EFBFBD>
- [ ] <EFBFBD>?蝝<E89D9D><EFBFBD><EFBFBD>𥕦遣
---
### 迁移中检查
- [ ] ✅ 10个Schema创建成功
- [ ] ✅ 表迁移无错误5个有数据的Schema
- [ ] ✅ 数据完整性验证通过
- [ ] ✅ 外键约束正确
- [ ] ✅ 索引正确创建
---
### 迁移后检查
- [ ] ✅ Prisma Client生成成功
- [ ] ✅ 后端服务启动正常
- [ ] ✅ 现有功能测试通过AIA、PKB
- [ ] ✅ API调用正常
- [ ] ✅ 前端功能正常
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- [ ] <20>?Prisma Client<6E><74><EFBFBD><EFBFBD>𣂼<EFBFBD>
- [ ] <EFBFBD>?<3F>𡒊垢<F0A1928A>滚𦛚<E6BB9A>臬𢆡甇<F0A286A1>
- [ ] <EFBFBD>?<3F><EFBFBD><E594B3><EFBFBD>瘚贝<E7989A><E8B49D><EFBFBD>嚗㇁IA<49><41>KB嚗?- [ ] <20>?API靚<49>鍂甇<E98D82>
- [ ] <EFBFBD>?<3F>滨垢<E6BBA8><EFBFBD><EFBFBD>
---
@@ -456,84 +404,67 @@ DROP SCHEMA IF EXISTS st_schema CASCADE;
### <20><EFBFBD>1嚗锭chema<6D>𥕦遣憭梯揖
**错误:**
**<EFBFBD>躰秤嚗?*
```
ERROR: schema "platform_schema" already exists
```
**解决:**
**<EFBFBD><EFBFBD>嚗?*
```sql
-- 璉<><E79289>兄chema<6D>臬炏摮睃銁
SELECT schema_name FROM information_schema.schemata
WHERE schema_name = 'platform_schema';
-- 如果存在但为空,可删除重建
DROP SCHEMA platform_schema CASCADE;
-- <EFBFBD><EFBFBD>摮睃銁雿<EFBFBD>蛹蝛綽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撱?DROP SCHEMA platform_schema CASCADE;
CREATE SCHEMA platform_schema;
```
---
### 问题2数据迁移失败
**错误:**
### <EFBFBD><EFBFBD>2嚗𡁏㺭<EFBFBD><EFBFBD>蝘餃仃韐?
**<2A>躰秤嚗?*
```
ERROR: duplicate key value violates unique constraint
```
**解决:**
**<EFBFBD><EFBFBD>嚗?*
1.<><E79289>交㺭<E4BAA4>格糓<E6A0BC>血歇<E8A180><EFBFBD><EFBFBD>
2.<><E79A9C><EFBFBD><EFBFBD>Schema
3. <20>齿鰵<E9BDBF><EFBFBD><EFBFBD>
---
### 问题3外键约束错误
**错误:**
### <EFBFBD><EFBFBD>3嚗𡁜<EFBFBD><EFBFBD>桃漲<EFBFBD><EFBFBD>霂?
**<2A>躰秤嚗?*
```
ERROR: foreign key constraint "fk_user_id" cannot be implemented
```
**解决:**
1. 确保被引用的表已先迁移
2. 检查外键字段类型匹配
3. 考虑先禁用外键,迁移后重建
**<EFBFBD><EFBFBD>嚗?*
1. 蝖桐<EFBFBD>鋡怠<EFBFBD><EFBFBD><EFBFBD>銵典歇<EFBFBD><EFBFBD><EFBFBD>蝘?2. 璉<><E79289><EFBFBD><E4BA99><EFBFBD>畾萇掩<E89087>见龪<E8A781>?3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E585B8><EFBFBD><EFBFBD><EFBFBD>𡡞<EFBFBD>撱?
---
## 🔧 云原生连接池配置2025-11-16 新增)
> **⭐ 重要更新**:为支持阿里云 Serverless 部署,新增连接池配置
## <EFBFBD>圲 鈭穃<E988AD><E7A983><EFBFBD><E8A098><EFBFBD><E4BAA4>滨蔭嚗?025-11-16 <EFBFBD><EFBFBD>嚗?
> **潃?<3F><EFBFBD><E6BBA9>湔鰵**嚗帋蛹<E5B88B><EFBFBD><E88880><EFBFBD>鈭?Serverless <20>函蔡嚗峕鰵憓噼<E68693><E599BC><EFBFBD><E4BAA4>滨蔭
> **霂衣<E99C82><E8A1A3><EFBFBD>﹝**嚗靀撟喳蝱<E596B3><EFBFBD>霈暹鴌閫<E9B48C><E996AB>](./04-撟喳蝱<E596B3><EFBFBD>霈暹鴌閫<E9B48C><E996AB>.md)
### 背景:为什么需要连接池?
**问题场景**
```
阿里云 SAE 自动扩容:
- 初始1个实例10个连接
- 高峰100个实例1000个连接
- RDS最大连接数400 ❌ 超限!
结果:数据库连接耗尽,应用崩溃
```
**解决方案**:动态计算每实例连接数
### <EFBFBD>峕艶嚗帋蛹隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
**<2A><EFBFBD><E6A185>箸艶**嚗?```
<EFBFBD><EFBFBD>鈭?SAE <20>芸𢆡<E88AB8>拙捆嚗?- <20><EFBFBD>嚗?銝芸<E98A9D>靘页<E99D98>10銝芾<E98A9D><E88ABE>?- 擃睃陸嚗?00銝芸<E98A9D>靘页<E99D98>1000銝芾<E98A9D><E88ABE>?- RDS<44><53>憭扯<E686AD><E689AF>交㺭嚗?00 <20>?頞<><E9A09E>嚗?
蝏𤘪<EFBFBD>嚗𡁏㺭<EFBFBD><EFBFBD>餈墧𦻖<EFBFBD>堒偷嚗<EFBFBD><EFBFBD><EFBFBD>典援皞?```
**閫<><E996AB><EFBFBD><EFBFBD>**嚗𡁜𢆡<F0A1819C><F0A286A1>恣蝞埈<E89D9E>摰硺<E691B0>餈墧𦻖<E5A2A7>?
```typescript
瘥誩<EFBFBD>靘贝<EFBFBD><EFBFBD>交㺭 = RDS<44><53>憭扯<E686AD><E689AF>交㺭 / SAE<41><45>憭批<E686AD>靘𧢲㺭
400 / 20 = 20/
蝷箔<EFBFBD>嚗?00餈墧𦻖 / 20摰硺<E691B0> = 20餈墧𦻖/摰硺<E691B0>
```
---
### Prisma连接池配置
### Prisma餈墧𦻖瘙𣳇<EFBFBD>蝵?
**<2A><>辣雿滨蔭**嚗䫤backend/src/config/database.ts`
**配置代码**
**<EFBFBD>滨蔭隞<EFBFBD><EFBFBD>**嚗?
```typescript
import { PrismaClient } from '@prisma/client'
@@ -542,7 +473,7 @@ const dbMaxConnections = Number(process.env.DB_MAX_CONNECTIONS) || 400
const maxInstances = Number(process.env.MAX_INSTANCES) || 20
const connectionLimit = Math.floor(dbMaxConnections / maxInstances)
console.log(`📊 数据库连接池配置:每实例最多${connectionLimit}个连接`)
console.log(`<EFBFBD><EFBFBD> <20>唳旿摨栞<E691A8><E6A09E><EFBFBD><E4BAA4>滨蔭嚗𡁏<E59A97>摰硺<E691B0><E7A1BA><EFBFBD>憭?{connectionLimit}銝芾<E98A9D><E88ABE>匝)
// <20>𥕦遣<F0A595A6><EFBFBD>Prisma Client
export const prisma = new PrismaClient({
@@ -559,24 +490,23 @@ export const prisma = new PrismaClient({
// 隡㗛<E99AA1><E3979B>喲𡡒餈墧𦻖
process.on('SIGTERM', async () => {
console.log('📊 正在关闭数据库连接...')
console.log('<27><><><EFBFBD>喲𡡒<E596B2>唳旿摨栞<E691A8><E6A09E>?..')
await prisma.$disconnect()
console.log('✅ 数据库连接已关闭')
console.log('<27>?<3F>唳旿摨栞<E691A8><E6A09E>亙歇<E4BA99>喲𡡒')
process.exit(0)
})
process.on('SIGINT', async () => {
console.log('📊 正在关闭数据库连接...')
console.log('<27><><><EFBFBD>喲𡡒<E596B2>唳旿摨栞<E691A8><E6A09E>?..')
await prisma.$disconnect()
console.log('✅ 数据库连接已关闭')
console.log('<27>?<3F>唳旿摨栞<E691A8><E6A09E>亙歇<E4BA99>喲𡡒')
process.exit(0)
})
// 启动时测试连接
prisma.$connect()
.then(() => console.log('✅ 数据库连接成功'))
// <EFBFBD>臬𢆡<EFBFBD><EFBFBD>霂閗<EFBFBD><EFBFBD>?prisma.$connect()
.then(() => console.log('<27>?<3F>唳旿摨栞<E691A8><E6A09E><EFBFBD><E4BAA4>?))
.catch((err) => {
console.error('❌ 数据库连接失败:', err)
console.error('<27>?<3F>唳旿摨栞<E691A8><E6A09E>亙仃韐?', err)
process.exit(1)
})
```
@@ -585,8 +515,7 @@ prisma.$connect()
### <20><EFBFBD><E887AC><EFBFBD><E3979B>滨蔭
**本地开发环境**
**<EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>𤑳㴓憓?*嚗?
```bash
# backend/.env.development
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
@@ -596,37 +525,33 @@ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
# MAX_INSTANCES=N/A
```
**云端生产环境**
**鈭𤑳垢<EFBFBD>煺漣<EFBFBD><EFBFBD>**嚗?
```bash
# SAE控制台 -> 环境变量配置
# SAE<EFBFBD><EFBFBD><EFBFBD>?-> <20><EFBFBD><E887AC><EFBFBD><E3979B>滨蔭
DATABASE_URL=postgresql://user:password@rm-xxx.aliyuncs.com:5432/prod_db
DB_MAX_CONNECTIONS=400 # <20><EFBFBD>鈭駵DS<44><53>憭扯<E686AD><E689AF>交㺭
MAX_INSTANCES=20 # SAE<41><45>憭批<E686AD>靘𧢲㺭
```
**不同RDS规格的连接数**
| RDS规格 | 最大连接数 | 建议SAE实例数 | 每实例连接数 |
**銝滚<EFBFBD>RDS閫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>交㺭**嚗?
| RDS閫<53>聢 | <20><>憭扯<E686AD><E689AF>交㺭 | 撱箄悅SAE摰硺<E691B0><E7A1BA>?| 瘥誩<E798A5>靘贝<E99D98><E8B49D>交㺭 |
|---------|-----------|--------------|-------------|
| 2核4GB | 200 | 10 | 20 |
| 4核8GB | 400 | 20 | 20 |
| 8核16GB | 800 | 40 | 20 |
| 2<EFBFBD>?GB | 200 | 10 | 20 |
| 4<EFBFBD>?GB | 400 | 20 | 20 |
| 8<EFBFBD>?6GB | 800 | 40 | 20 |
---
### <20>烐綉<E78390>唳旿摨栞<E691A8><E6A09E>交㺭
**实时查询连接数**
**摰墧𧒄<EFBFBD>亥砭餈墧𦻖<EFBFBD>?*嚗?
```typescript
// backend/src/common/monitoring/metrics.ts
import { prisma } from '@/config/database'
import { logger } from '@/common/logging'
export class DatabaseMetrics {
// 查询当前连接数
static async getConnectionCount(): Promise<number> {
// <EFBFBD>亥砭敶枏<EFBFBD>餈墧𦻖<EFBFBD>? static async getConnectionCount(): Promise<number> {
const result = await prisma.$queryRaw<Array<{ count: bigint }>>`
SELECT count(*) as count
FROM pg_stat_activity
@@ -635,13 +560,12 @@ export class DatabaseMetrics {
return Number(result[0].count)
}
// 监控并告警
static async monitorConnections() {
// <EFBFBD>烐綉撟嗅<EFBFBD>霅? static async monitorConnections() {
const currentConnections = await this.getConnectionCount()
const maxConnections = Number(process.env.DB_MAX_CONNECTIONS) || 400
const usagePercent = (currentConnections / maxConnections) * 100
logger.info('数据库连接监控', {
logger.info('<EFBFBD>唳旿摨栞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?, {
current: currentConnections,
max: maxConnections,
usage: `${usagePercent.toFixed(1)}%`
@@ -653,7 +577,7 @@ export class DatabaseMetrics {
current: currentConnections,
max: maxConnections,
usage: `${usagePercent.toFixed(1)}%`,
action: '建议增加RDS规格或减少SAE实例数'
action: '𧼮<EFBFBD>RDS閫<EFBFBD><EFBFBD><EFBFBD>AE摰硺<EFBFBD><EFBFBD>?
})
}
@@ -662,14 +586,12 @@ export class DatabaseMetrics {
}
```
**定时监控**(可选):
**摰𡁏𧒄<EFBFBD>烐綉**嚗<><EFBFBD><EFBFBD>嚗?
```typescript
// backend/src/index.ts
import { DatabaseMetrics } from '@/common/monitoring/metrics'
// 每5分钟监控一次
setInterval(async () => {
// 瘥?<3F><><EFBFBD><EFBFBD>烐綉銝<E7B689>甈?setInterval(async () => {
await DatabaseMetrics.monitorConnections()
}, 5 * 60 * 1000)
```
@@ -680,21 +602,16 @@ setInterval(async () => {
**<EFBFBD><EFBFBD>1嚗朞<EFBFBD><EFBFBD>交㺭<EFBFBD>堒偷**
**症状**
```
**<EFBFBD><EFBFBD>𠶖**嚗?```
Error: P1001: Can't reach database server
Error: remaining connection slots are reserved
```
**原因**
- SAE实例数过多
- 每实例连接数配置过高
**<EFBFBD><EFBFBD>**嚗?- SAE摰硺<E691B0><E7A1BA><EFBFBD>憭?- 瘥誩<E798A5>靘贝<E99D98><E8B49D>交㺭<E4BAA4>滨蔭餈<E894AD><E9A488>
- 摮睃銁餈墧𦻖瘜<F0A6BB96><E7989C>
**解决方案**
```bash
# 1. 查看当前连接数
SELECT count(*) FROM pg_stat_activity
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?```bash
# 1. <20><EFBFBD>敶枏<E695B6>餈墧𦻖<E5A2A7>?SELECT count(*) FROM pg_stat_activity
WHERE datname = 'ai_clinical_research';
# 2. <20><EFBFBD>餈墧𦻖<E5A2A7><EFBFBD>
@@ -705,29 +622,24 @@ GROUP BY client_addr;
# 3. 靚<><EFBFBD>滨蔭
# <20><EFBFBD>A嚗𡁜<E59A97>撠騌AE<41><45>憭批<E686AD>靘𧢲㺭
MAX_INSTANCES=10 # 从20改为10
MAX_INSTANCES=10 # 隞?0<>嫣蛹10
# <20><EFBFBD>B嚗𡁜<E59A97>蝥刪DS閫<53>
# 从2核4GB200连接升级到4核8GB400连接
```
# 隞?<3F>?GB嚗?00餈墧𦻖嚗匧<E59A97>蝥批<E89DA5>4<EFBFBD>?GB嚗?00餈墧𦻖嚗?```
---
**问题2连接泄漏**
**<EFBFBD><EFBFBD>2嚗朞<EFBFBD><EFBFBD><EFBFBD>瞍?*
**症状**
- 连接数持续增长
- 即使流量降低,连接数不下降
**排查**
```typescript
// ❌ 错误:每次创建新实例
**<EFBFBD><EFBFBD>𠶖**嚗?- 餈墧𦻖<E5A2A7><EFBFBD>蝏剖<E89D8F><E58996>?- <20>喃蝙瘚<E89D99><E7989A><EFBFBD><EFBFBD>嚗諹<E59A97><E8ABB9>交㺭銝滢<E98A9D><E6BBA2>?
**<2A>埝䰻**嚗?```typescript
// <20>?<3F>躰秤嚗𡁏<E59A97><E79488>撱箸鰵摰硺<E691B0>
function getUser() {
const prisma = new PrismaClient() // 餈墧𦻖瘜<F0A6BB96><E7989C>
return prisma.user.findMany()
}
// ✅ 正确:使用全局实例
// <EFBFBD>?甇<>嚗帋蝙<E5B88B><EFBFBD><EFBFBD>摰硺<E691B0>
import { prisma } from '@/config/database'
function getUser() {
@@ -737,43 +649,35 @@ function getUser() {
---
### 最佳实践
**DO ✅**
1. ✅ 使用全局 `prisma` 实例
2. ✅ 配置 `SIGTERM` 优雅关闭
3. ✅ 定期监控连接数
4. ✅ 设置连接数告警80%阈值)
5. ✅ 使用连接池Prisma默认启用
**DON'T ❌**
1. ❌ 每次请求新建 `PrismaClient`
2. ❌ 不关闭连接就退出进程
3. ❌ 忽略连接数监控
4. ❌ 设置过大的 `MAX_INSTANCES`
5. ❌ 在业务代码中直接执行 `$disconnect()`
### <EFBFBD><EFBFBD>雿喳<EFBFBD>頝?
**DO <20>?*嚗?1. <20>?雿輻鍂<E8BCBB><EFBFBD> `prisma` 摰硺<E691B0>
2. <20>?<3F>滨蔭 `SIGTERM` 隡㗛<E99AA1><E3979B>喲𡡒
3. <20>?摰𡁏<E691B0><F0A1818F>烐綉餈墧𦻖<E5A2A7>?4. <20>?霈曄蔭餈墧𦻖<E5A2A7><EFBFBD>霅佗<E99C85>80%<25><><EFBFBD><EFBFBD>
5. <20>?雿輻鍂餈墧𦻖瘙𩤃<E79899>Prisma暺䁅恕<E48185>舐鍂嚗?
**DON'T <20>?*嚗?1. <20>?瘥𤩺活霂瑟<E99C82><E7919F>啣遣 `PrismaClient`
2. <20>?銝滚<E98A9D><E6BB9A><EFBFBD><E5899B>亙停<E4BA99><E5819C><EFBFBD><EFBFBD>蝔?3. <20>?敹賜裦餈墧𦻖<E5A2A7><EFBFBD><E59581>?4. <20>?霈曄蔭餈<E894AD><EFBFBD>?`MAX_INSTANCES`
5. <20>?<3F><EFBFBD><E585B6>∩誨<E288A9><E8AAA8><EFBFBD>湔𦻖<E6B994><EFBFBD> `$disconnect()`
---
## <20><> <20><EFBFBD><E8A9A8><EFBFBD>
- [撟喳蝱<EFBFBD><EFBFBD>霈暹鴌閫<EFBFBD><EFBFBD>](./04-撟喳蝱<E596B3><EFBFBD>霈暹鴌閫<E9B48C><E996AB>.md) - 摰峕㟲<E5B395><E39FB2><EFBFBD><EFBFBD><EFBFBD>霈曇恣
- [云原生开发规范](../04-开发规范/08-云原生开发规范.md) - 数据库使用规范
- [环境配置指南](../07-运维文档/01-环境配置指南.md) - 环境变量配置
- [Schema隔离架构设计](../00-系统总体设计/03-数据库架构说明.md)
- [鈭穃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD>(../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?08-鈭穃<E988AD><E7A983><EFBFBD><E7AC94>𤏸<EFBFBD><F0A48FB8>?md) - <20>唳旿摨㮖蝙<E3AE96><EFBFBD><E588BB>?- [<5B><EFBFBD><E887AC>滨蔭<E6BBA8><E894AD><EFBFBD>](../07-餈鞟輕<E99E9F><E8BC95>﹝/01-<2D><EFBFBD><E887AC>滨蔭<E6BBA8><E894AD><EFBFBD>.md) - <20><EFBFBD><E887AC><EFBFBD><E3979B>滨蔭
- [Schema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>霈曇恣](../00-蝟餌<E89D9F><E9A48C><EFBFBD>霈曇恣/03-<2D>唳旿摨𤘪沲<F0A498AA><E6B2B2><EFBFBD>?md)
---
## <20><> <20>湔鰵霈啣<E99C88>
| 日期 | 更新内容 | 更新人 |
| <EFBFBD><EFBFBD> | <20>湔鰵<E6B994><E9B0B5>捆 | <20>湔鰵鈭?|
|------|---------|--------|
| 2025-11-09 | <20><EFBFBD><E598A5><EFBFBD><EFBFBD>𥕦遣 | <20><EFBFBD><E59786><EFBFBD> |
| 2025-11-16 | <20><EFBFBD>鈭穃<E988AD><E7A983><EFBFBD><E8A098><EFBFBD><E4BAA4>滨蔭蝡㰘<E89DA1> | <20><EFBFBD><E59786><EFBFBD> |
---
**文档版本:** v1.0
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?* v1.0
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD>** 2025-11-09
**蝏湔擪<E6B994><E693AA><EFBFBD>** <20><EFBFBD><E59786><EFBFBD>