- Add platform infrastructure chapter to frontend-backend architecture design - Update system architecture document with 6 new infrastructure modules - Update AI onboarding guide with infrastructure overview - Link to backend/src/common/README.md for detailed usage guide Key Updates: - Storage service (LocalAdapter + OSSAdapter) - Logging system (Winston + JSON format) - Cache service (Memory + Redis) - Async job queue (Memory + Database) - Health check endpoints - Monitoring metrics - Database connection pool - Environment config management All modules support zero-code switching between local and cloud environments. Related: #Platform-Infrastructure
449 lines
11 KiB
Markdown
449 lines
11 KiB
Markdown
# 数据库架构说明
|
||
|
||
> **创建日期:** 2025-11-06
|
||
> **文档目的:** 澄清数据库部署方式和架构
|
||
|
||
---
|
||
|
||
## 📋 核心澄清
|
||
|
||
### ✅ 您有自己独立的PostgreSQL数据库!
|
||
|
||
**关键事实:**
|
||
1. ✅ PostgreSQL是通过Docker部署的(`docker-compose.yml`)
|
||
2. ✅ 这是您项目的独立数据库,不是Dify的
|
||
3. ✅ Dify有自己完全独立的数据库(在`dify/docker/`目录下)
|
||
4. ✅ 您不需要手动安装PostgreSQL,Docker会自动创建
|
||
|
||
---
|
||
|
||
## 🐳 Docker部署详情
|
||
|
||
### docker-compose.yml配置
|
||
|
||
```yaml
|
||
# 位置:AIclinicalresearch/docker-compose.yml
|
||
|
||
services:
|
||
# PostgreSQL 数据库
|
||
postgres:
|
||
image: postgres:15-alpine # 使用官方PostgreSQL镜像
|
||
container_name: ai-clinical-postgres
|
||
environment:
|
||
POSTGRES_DB: ai_clinical_research # 数据库名
|
||
POSTGRES_USER: postgres # 用户名
|
||
POSTGRES_PASSWORD: postgres123 # 密码
|
||
ports:
|
||
- "5432:5432" # 端口映射
|
||
volumes:
|
||
- postgres_data:/var/lib/postgresql/data # 数据持久化
|
||
networks:
|
||
- ai-clinical-network
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
# Redis 缓存
|
||
redis:
|
||
image: redis:7-alpine
|
||
container_name: ai-clinical-redis
|
||
ports:
|
||
- "6379:6379"
|
||
volumes:
|
||
- redis_data:/data
|
||
networks:
|
||
- ai-clinical-network
|
||
|
||
volumes:
|
||
postgres_data: # PostgreSQL数据卷(数据持久化存储)
|
||
redis_data: # Redis数据卷
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 启动流程
|
||
|
||
### 一键启动脚本(一键启动.bat)
|
||
|
||
```batch
|
||
[步骤2/7] 启动PostgreSQL和Redis容器
|
||
docker-compose up -d
|
||
|
||
这个命令会:
|
||
1. 自动下载PostgreSQL 15镜像(如果本地没有)
|
||
2. 创建PostgreSQL容器
|
||
3. 创建Redis容器
|
||
4. 创建数据卷(postgres_data)用于持久化存储
|
||
5. 启动容器并在后台运行
|
||
```
|
||
|
||
**您不需要手动安装PostgreSQL!**
|
||
- ✅ Docker会自动创建和管理
|
||
- ✅ 数据存储在Docker数据卷中,不会丢失
|
||
- ✅ 可以通过`localhost:5432`连接
|
||
|
||
---
|
||
|
||
## 🗄️ 数据库连接信息
|
||
|
||
### 连接配置
|
||
|
||
**数据库连接字符串(DATABASE_URL):**
|
||
```
|
||
postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
|
||
```
|
||
|
||
**拆解:**
|
||
- **协议:** postgresql://
|
||
- **用户名:** postgres
|
||
- **密码:** postgres123
|
||
- **主机:** localhost(Docker映射到本地)
|
||
- **端口:** 5432
|
||
- **数据库名:** ai_clinical_research
|
||
|
||
### 后端配置(backend/.env)
|
||
|
||
```bash
|
||
# 数据库连接
|
||
DATABASE_URL=postgresql://postgres:postgres123@localhost:5432/ai_clinical_research
|
||
|
||
# 这个连接的是您自己的PostgreSQL,不是Dify的!
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 两个独立的数据库系统
|
||
|
||
### 系统对比
|
||
|
||
| 项目 | 您的数据库 | Dify的数据库 |
|
||
|------|----------|-------------|
|
||
| **位置** | `AIclinicalresearch/docker-compose.yml` | `dify/docker/docker-compose.yml` |
|
||
| **容器名** | `ai-clinical-postgres` | `dify-db`(猜测) |
|
||
| **端口** | `5432` | 可能是`5433`或不暴露 |
|
||
| **数据库名** | `ai_clinical_research` | `dify` |
|
||
| **用途** | 存储您项目的业务数据 | 存储Dify的数据 |
|
||
| **访问方式** | 直接Prisma访问 | 通过Dify API访问 |
|
||
|
||
### 架构图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ AIclinicalresearch项目 │
|
||
│ │
|
||
│ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ Backend │──────│ PostgreSQL │ │
|
||
│ │ (Node.js) │ SQL │ (Docker) │ │
|
||
│ │ │ │ │ │
|
||
│ │ Prisma │ │ Port: 5432 │ │
|
||
│ └──────────────┘ └──────────────┘ │
|
||
│ │ │
|
||
│ │ HTTP API │
|
||
│ ↓ │
|
||
│ ┌──────────────┐ │
|
||
│ │ Dify │──────> Dify自己的PostgreSQL │
|
||
│ │ (Docker) │ (完全独立) │
|
||
│ └──────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 当前数据库表结构
|
||
|
||
### 您的PostgreSQL中的表
|
||
|
||
```sql
|
||
-- 来源:backend/prisma/schema.prisma
|
||
|
||
-- 用户模块
|
||
users -- 用户表
|
||
|
||
-- 项目模块
|
||
projects -- 项目表
|
||
|
||
-- AI问答模块
|
||
conversations -- 对话表
|
||
messages -- 消息表
|
||
general_conversations -- 通用对话表
|
||
general_messages -- 通用消息表
|
||
|
||
-- 知识库模块
|
||
knowledge_bases -- 知识库表
|
||
documents -- 文档表
|
||
|
||
-- 批处理模块(Phase 3)
|
||
batch_tasks -- 批处理任务表
|
||
batch_results -- 批处理结果表
|
||
task_templates -- 任务模板表
|
||
|
||
-- 稿件审查模块
|
||
review_tasks -- 稿件审查任务表
|
||
|
||
-- 运营管理模块
|
||
admin_logs -- 管理员日志表
|
||
```
|
||
|
||
**总计:16张表,全部在您自己的PostgreSQL中。**
|
||
|
||
---
|
||
|
||
## 🔧 常用操作
|
||
|
||
### 查看Docker容器状态
|
||
|
||
```bash
|
||
# 查看所有容器
|
||
docker ps
|
||
|
||
# 应该能看到:
|
||
# ai-clinical-postgres (PostgreSQL)
|
||
# ai-clinical-redis (Redis)
|
||
```
|
||
|
||
### 连接到PostgreSQL
|
||
|
||
**方法1:使用Docker命令**
|
||
```bash
|
||
# 进入PostgreSQL容器
|
||
docker exec -it ai-clinical-postgres psql -U postgres -d ai_clinical_research
|
||
|
||
# 然后可以执行SQL:
|
||
\dt # 查看所有表
|
||
\d users # 查看users表结构
|
||
SELECT * FROM users LIMIT 10;
|
||
```
|
||
|
||
**方法2:使用数据库客户端**
|
||
- **DBeaver** / **pgAdmin** / **DataGrip** / **Navicat**
|
||
- 连接信息:
|
||
- Host: `localhost`
|
||
- Port: `5432`
|
||
- Database: `ai_clinical_research`
|
||
- User: `postgres`
|
||
- Password: `postgres123`
|
||
|
||
### 停止和启动数据库
|
||
|
||
```bash
|
||
# 停止(但不删除数据)
|
||
docker-compose down
|
||
|
||
# 启动
|
||
docker-compose up -d
|
||
|
||
# 重启
|
||
docker-compose restart postgres
|
||
```
|
||
|
||
### 查看数据库日志
|
||
|
||
```bash
|
||
# 查看PostgreSQL日志
|
||
docker logs ai-clinical-postgres
|
||
|
||
# 实时查看日志
|
||
docker logs -f ai-clinical-postgres
|
||
```
|
||
|
||
---
|
||
|
||
## 💾 数据持久化
|
||
|
||
### 数据存储位置
|
||
|
||
**数据卷(Volume):**
|
||
```
|
||
postgres_data:/var/lib/postgresql/data
|
||
```
|
||
|
||
**实际存储位置:**
|
||
- Windows: `C:\ProgramData\Docker\volumes\aiclinicalresearch_postgres_data\_data`
|
||
- Mac/Linux: `/var/lib/docker/volumes/aiclinicalresearch_postgres_data/_data`
|
||
|
||
**重要:**
|
||
- ✅ 即使删除容器(`docker-compose down`),数据不会丢失
|
||
- ✅ 数据存储在Docker数据卷中,持久化保存
|
||
- ⚠️ 只有执行`docker-compose down -v`(删除数据卷)才会清空数据
|
||
|
||
### 备份数据库
|
||
|
||
```bash
|
||
# 备份(导出SQL)
|
||
docker exec ai-clinical-postgres pg_dump -U postgres ai_clinical_research > backup.sql
|
||
|
||
# 恢复(导入SQL)
|
||
docker exec -i ai-clinical-postgres psql -U postgres ai_clinical_research < backup.sql
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 未来:Schema隔离计划
|
||
|
||
### 当前状态
|
||
|
||
```sql
|
||
-- 所有表都在public schema
|
||
public.users
|
||
public.projects
|
||
public.conversations
|
||
public.knowledge_bases
|
||
public.documents
|
||
public.review_tasks
|
||
...
|
||
```
|
||
|
||
### 目标架构(Schema隔离)
|
||
|
||
```sql
|
||
-- 平台层Schema
|
||
CREATE SCHEMA platform_schema;
|
||
platform_schema.users
|
||
platform_schema.roles
|
||
platform_schema.permissions
|
||
|
||
-- 业务模块Schema
|
||
CREATE SCHEMA aia_schema; -- AI智能问答
|
||
aia_schema.projects
|
||
aia_schema.conversations
|
||
aia_schema.messages
|
||
|
||
CREATE SCHEMA pkb_schema; -- 个人知识库
|
||
pkb_schema.knowledge_bases
|
||
pkb_schema.documents
|
||
|
||
CREATE SCHEMA asl_schema; -- AI智能文献
|
||
asl_schema.projects
|
||
asl_schema.literature_items
|
||
asl_schema.screening_results
|
||
|
||
CREATE SCHEMA review_schema; -- 稿件审查
|
||
review_schema.review_tasks
|
||
review_schema.review_journals
|
||
```
|
||
|
||
**实施计划:**
|
||
- **阶段一(立即):** 逻辑隔离,使用表名前缀(`aia_projects`, `asl_projects`)
|
||
- **阶段二(微服务拆分时):** 物理隔离,创建真正的Schema
|
||
|
||
---
|
||
|
||
## 🔍 Dify数据库(独立系统)
|
||
|
||
### Dify的部署
|
||
|
||
```
|
||
dify/docker/docker-compose.yml
|
||
├── dify-db (PostgreSQL)
|
||
├── dify-redis
|
||
├── dify-web
|
||
├── dify-api
|
||
└── ...
|
||
```
|
||
|
||
**关键点:**
|
||
- ✅ Dify有自己完全独立的docker-compose.yml
|
||
- ✅ Dify的PostgreSQL是独立的容器
|
||
- ✅ 您的项目不直接访问Dify的数据库
|
||
- ✅ 通过Dify API(HTTP REST)调用Dify功能
|
||
|
||
### 您的项目如何使用Dify
|
||
|
||
```typescript
|
||
// 不是直接访问Dify数据库,而是通过API
|
||
|
||
// 创建知识库
|
||
const response = await fetch('http://localhost/v1/datasets', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Authorization': `Bearer ${DIFY_API_KEY}`,
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({
|
||
name: '我的知识库'
|
||
})
|
||
});
|
||
|
||
// 上传文档
|
||
const formData = new FormData();
|
||
formData.append('file', file);
|
||
await fetch(`http://localhost/v1/datasets/${datasetId}/document/create-by-file`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Authorization': `Bearer ${DIFY_API_KEY}`
|
||
},
|
||
body: formData
|
||
});
|
||
```
|
||
|
||
**您的数据库中存储:**
|
||
```sql
|
||
-- knowledge_bases表
|
||
{
|
||
id: 'uuid',
|
||
name: '我的知识库',
|
||
dify_dataset_id: 'xxx' -- 关联Dify的dataset_id
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 总结
|
||
|
||
### 核心要点
|
||
|
||
1. ✅ **您有自己的PostgreSQL数据库**
|
||
- 通过Docker部署(`docker-compose.yml`)
|
||
- 容器名:`ai-clinical-postgres`
|
||
- 数据库名:`ai_clinical_research`
|
||
|
||
2. ✅ **您不需要手动安装PostgreSQL**
|
||
- `docker-compose up -d`会自动创建
|
||
- 数据持久化存储在Docker数据卷中
|
||
|
||
3. ✅ **Dify是完全独立的系统**
|
||
- 有自己的PostgreSQL数据库
|
||
- 您通过Dify API访问,不直接访问数据库
|
||
|
||
4. ✅ **当前16张表全部在您的PostgreSQL中**
|
||
- 用户、项目、对话、知识库、文档、批处理、稿件审查等
|
||
- 全部在`public` schema(未来需要隔离)
|
||
|
||
### 为什么您不记得安装PostgreSQL?
|
||
|
||
**因为您根本没有手动安装!** 😊
|
||
|
||
- ✅ Docker自动下载镜像
|
||
- ✅ Docker自动创建容器
|
||
- ✅ 一键启动脚本自动启动
|
||
- ✅ 您只需要运行`一键启动.bat`
|
||
|
||
**这就是Docker的魔力!**
|
||
|
||
---
|
||
|
||
**需要进一步了解的内容:**
|
||
1. 如何备份和恢复数据库?
|
||
2. 如何迁移到Schema隔离架构?
|
||
3. 如何连接数据库进行手动查询?
|
||
4. Prisma如何管理数据库迁移?
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|