Files
doodle-store/apps/server/prisma/sql
2026-10-12 16:56:42 +08:00
..
2026-10-12 16:56:42 +08:00
2026-10-12 16:56:42 +08:00
2026-10-12 16:56:42 +08:00

v3.5 PostgreSQL 初始化 SQL

基于 数据库设计,面向 PostgreSQL 18。缩进统一 4 个空格;文件是普通 PostgreSQL SQL,可使用 psql 或数据库客户端执行。

2026-10-12 已在本地 PostgreSQL 18.6 临时数据库执行 001/002/003,并重复执行 003 验证不覆盖 enabled=false;10 张表与 19 项关键约束检查通过,历史 NULL 事件、标识大小写及资产所有者删除行为符合设计。验证库已删除;随后已在用户授权下正式初始化 doodle_dev,10 张表与两条配置记录核对通过。

文件 作用 执行位置
001-create-database.sql 创建 UTF-8 / C locale / UTC 的 doodle_dev 连接 postgres 管理数据库,有 CREATEDB 权限;不能包在事务里
002-create-tables.sql 创建 10 张表、约束、索引与注释 连接目标空数据库;单事务执行
003-initialize-settings.sql 初始化 current 页面配置及 homeAutoRefresh 开关 连接已建表数据库;可重复执行且不覆盖旧值

Docker 已在首次启动时创建 doodle_dev,当前本地跳过 001。其他环境显式修改 001 的数据库名并用对应角色执行;本次不自动创建云端数据库、生产账号或测试库,不在 SQL 中硬编码密码。生产角色和权限在部署时落实。

本地执行

从 doodle-store 根目录执行,使用根 .env 指定的本地数据库:

pnpm infra:up

docker compose --env-file .env -f infra/compose.yaml exec -T postgres \
    sh -c 'exec psql -X -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB"' \
    < apps/server/prisma/sql/002-create-tables.sql

docker compose --env-file .env -f infra/compose.yaml exec -T postgres \
    sh -c 'exec psql -X -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB"' \
    < apps/server/prisma/sql/003-initialize-settings.sql

002 用显式 CREATE TABLE 而非 IF NOT EXISTS;已有同名表时返回错误并回滚,不覆盖已有结构或数据。它是空库基线,不是可反复执行的增量迁移;后续结构修改写新迁移文件。003 的重复执行不会覆盖导入内容、已递增版本或 enabled=false。

SELECT tablename FROM pg_tables WHERE schemaname = 'public' ORDER BY tablename;
SELECT id, version FROM public.page_configs;
SELECT id, value FROM public.settings;

预期业务表共 10 张,页面配置有 current,设置有 homeAutoRefresh。2026-10-12 已在本地 doodle_dev 执行 002/003 并核对通过,当前已有 10 张表;不要再次执行 002。独立临时库验证与正式本地初始化分别记录,未连接云服务器。

实施边界

  • 字符串主键保留旧 ID,应用生成新 ID;所有身份/对象标识使用 C 排序规则。
  • 收藏/下载的用户外键限制直接删除;注销需先清关系、处理计数,再删用户。题型仅逻辑关联,保留缺失题型历史。
  • 资产 ready 必填元数据、avatar 必须 private;资产归属、用途匹配、签名地址、远程 URL 白名单和文件存在性仍由服务端校验。
  • 下载 NULL exportId 只允许 import 来源;非空事件按 userId + exportId 去重。计数不会通过触发器自动更新,由后续业务事务实现。
  • tags 元素类型、分类多层循环、任务租约/锁、JWT 失效与管理员权限由后续业务实现;SQL 不代表业务 API 已完成。
  • updatedAt 和 contentUpdatedAt 由服务显式维护,不添加把两者混为一谈的更新时间触发器。
  • Prisma 尚未安装,Schema 和迁移历史尚未接入。后续接入时将本 SQL 纳入正式基线;已有表的库须采用基线登记流程,不能直接再次执行同一 DDL。