# 数据库架构说? > **创建日期?* 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 -- 管理员日志表 ``` **总计?6张表,全部在您自己的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如何管理数据库迁移?