# 数据库架构说明 > **创建日期:** 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如何管理数据库迁移?