Files
AIclinicalresearch/docs/00-系统总体设计/03-数据库架构说明.md
HaHafeng 31d555f7bb docs: Update architecture docs with platform infrastructure details
- 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
2025-11-17 08:36:10 +08:00

449 lines
11 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.
# 数据库架构说明
> **创建日期:** 2025-11-06
> **文档目的:** 澄清数据库部署方式和架构
---
## 📋 核心澄清
### ✅ 您有自己独立的PostgreSQL数据库
**关键事实:**
1. ✅ PostgreSQL是通过Docker部署的`docker-compose.yml`
2. ✅ 这是您项目的独立数据库不是Dify的
3. ✅ Dify有自己完全独立的数据库`dify/docker/`目录下)
4. ✅ 您不需要手动安装PostgreSQLDocker会自动创建
---
## 🐳 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
- **主机:** localhostDocker映射到本地
- **端口:** 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 APIHTTP 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如何管理数据库迁移