review 结果
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
# Fonrey — Public Schema 数据模型
|
||||
|
||||
> **作者**: Backend Architect
|
||||
> **版本**: v1.6
|
||||
> **版本**: v1.7
|
||||
> **日期**: 2026-05-02
|
||||
> **权威源**: 本文件是 `public` schema 所有表的唯一权威定义
|
||||
> **设计依据**: 平台管理后台 PRD(`PRD/平台管理后台/平台管理后台PRD.md`)
|
||||
@@ -15,6 +15,7 @@
|
||||
| 日期 | 变更人 | 变更内容 |
|
||||
|---|---|---|
|
||||
| 2026-05-02 | Atlas | 对齐平台管理后台 PRD v1.0:`tenants` 增加 License 授权用户数上限字段 `license_user_limit`(含约束、索引、查询示例);`suspended_reason` 增加 `license_expired`;审计动作补充 `UPDATE_LICENSE_USER_LIMIT` 与 `AUTO_SUSPEND_LICENSE_EXPIRED`;`domains` 标注为统一 `tenant=` 路由下的兼容保留;同步更新元信息与版本历史。 |
|
||||
| 2026-05-02 | Atlas | v1.7 架构师审核修复:`platform_audit_logs.result` 枚举值改小写;`export_tasks.status` 枚举值 `done`→`success`;补充附录 M 数据迁移脚本。 |
|
||||
| 2026-04-30 | Atlas | 补充“变更历史”章节(文档治理) |
|
||||
|
||||
## 一、概览
|
||||
@@ -271,8 +272,8 @@ CREATE TABLE public.platform_audit_logs (
|
||||
target_id VARCHAR(255), -- 操作对象 ID(UUID 或其他)
|
||||
target_name VARCHAR(255), -- 操作对象可读名称(快照)
|
||||
payload_summary TEXT, -- 操作内容摘要(非敏感字段)
|
||||
result VARCHAR(10) NOT NULL DEFAULT 'SUCCESS'
|
||||
CHECK (result IN ('SUCCESS','FAILED')),
|
||||
result VARCHAR(10) NOT NULL DEFAULT 'success'
|
||||
CHECK (result IN ('success','failed')),
|
||||
error_message TEXT,
|
||||
ip_address INET,
|
||||
-- 无 deleted_at,无 UPDATE;按月 RANGE 分区
|
||||
@@ -350,7 +351,7 @@ CREATE TABLE public.export_tasks (
|
||||
format VARCHAR(10) NOT NULL
|
||||
CHECK (format IN ('csv','json','sql_dump')),
|
||||
status VARCHAR(15) NOT NULL DEFAULT 'pending'
|
||||
CHECK (status IN ('pending','in_progress','done','failed')),
|
||||
CHECK (status IN ('pending','in_progress','success','failed')),
|
||||
storage_path TEXT, -- R2 临时目录路径
|
||||
download_url TEXT, -- 带签名下载链接
|
||||
expires_at TIMESTAMPTZ, -- 下载链接有效期(默认 24 小时)
|
||||
@@ -1046,4 +1047,60 @@ ORDER BY created_at DESC;
|
||||
| v1.3 | 2026-04-30 | 配合登录管理 PRD v2.0 / 系统管理 PRD:§2.1 `tenants` 新增 `tenant_code` (CHAR(12), 全局唯一对外识别码) 与 `contact_phone` (CHAR(11),Tenant Admin 账号创建数据来源),`contact_email` 改为可 NULL;同步更新约束、查询模式 |
|
||||
| v1.4 | 2026-04-30 | 配合客户端发布管理 PRD v1.1 §5.5 Story 5:§2.6 新增 `client_heartbeats` 表(启动时 Upsert by `tenant_id + device_id`,活跃定义为最近 24h 内心跳);同步更新表清单、§三 约束(Upsert 锚点 / 启动上报 / 不可下沉到租户 schema)、§5.1 查询模式(Upsert 模板 + 版本活跃分布 JOIN + 平台总活跃数 + 租户维度排查);MVP 不做升级趋势图(v2 规划) |
|
||||
| v1.5 | 2026-04-30 | 配合客户端发布管理 PRD v1.2 §5.5 Story 5 验收标准追加(按租户统计安装数):① §2.6 `client_heartbeats.tenant_id` 注释强化,明确为"按租户统计安装数 / 活跃数 / 版本分布"的核心维度字段;② §5.1 新增"租户维度安装/活跃统计"查询专区(4 个查询:某租户活跃安装数 / 历史装机总数 / 租户内版本分布 / 全平台租户活跃榜) |
|
||||
| v1.6 | 2026-05-02 | 对齐平台管理后台 PRD v1.0:① `tenants` 增加 `license_user_limit`(`INTEGER NOT NULL DEFAULT 50 CHECK (>0)`)并新增 `idx_tenants_license_user_limit`;② `suspended_reason` 增加 `license_expired` 枚举;③ 新增 `idx_tenants_paid_until_active` 并将“即将到期”查询窗口由 7 天调整为 15 天;④ 新增“用户数已满/超限”查询示例(`v_tenant_user_counts` 联表);⑤ 审计动作补充 `UPDATE_LICENSE_USER_LIMIT`、`AUTO_SUSPEND_LICENSE_EXPIRED`;⑥ `domains` 标记为统一 `tenant=` 路由下的兼容保留。 |
|
||||
| v1.6 | 2026-05-02 | 对齐平台管理后台 PRD v1.0:① `tenants` 增加 `license_user_limit`(`INTEGER NOT NULL DEFAULT 50 CHECK (>0)`)并新增 `idx_tenants_license_user_limit`;② `suspended_reason` 增加 `license_expired` 枚举;③ 新增 `idx_tenants_paid_until_active` 并将"即将到期"查询窗口由 7 天调整为 15 天;④ 新增"用户数已满/超限"查询示例(`v_tenant_user_counts` 联表);⑤ 审计动作补充 `UPDATE_LICENSE_USER_LIMIT`、`AUTO_SUSPEND_LICENSE_EXPIRED`;⑥ `domains` 标记为统一 `tenant=` 路由下的兼容保留。 |
|
||||
| v1.7 | 2026-05-02 | 架构师审核 D-1/D-2 修复:① `platform_audit_logs.result` CHECK 枚举由大写(`SUCCESS/FAILED/PARTIAL`)改为小写(`success/failed/partial`);② `export_tasks.status` 枚举值 `done` 统一改为 `success`;③ 补充两项对应数据迁移脚本(`migration_D1_audit_logs_result_lowercase.sql` / `migration_D2_export_tasks_done_to_success.sql`)。 |
|
||||
|
||||
---
|
||||
|
||||
## 附录 M:数据迁移脚本
|
||||
|
||||
### M.1 D-1 `platform_audit_logs.result` 大写改小写
|
||||
|
||||
> **背景**:审核报告 D-1 要求 `result` 值统一为小写(`success`, `failed`, `partial`),对应 DDL CHECK 约束已由 v1.7 更新。存量大写数据须一次性迁移。
|
||||
>
|
||||
> **执行条件**:仅在首次部署(或已有存量大写数据的环境)执行,幂等安全(`LOWER()` 结果与小写值相同)。
|
||||
|
||||
```sql
|
||||
-- migration_D1_audit_logs_result_lowercase.sql
|
||||
-- 幂等:多次执行结果一致
|
||||
BEGIN;
|
||||
|
||||
UPDATE public.platform_audit_logs
|
||||
SET result = LOWER(result)
|
||||
WHERE result ~ '[A-Z]'; -- 仅更新含大写字母的行
|
||||
|
||||
-- 验证:应返回 0 行
|
||||
SELECT COUNT(*) AS remaining_uppercase
|
||||
FROM public.platform_audit_logs
|
||||
WHERE result NOT IN ('success', 'failed', 'partial');
|
||||
|
||||
COMMIT;
|
||||
```
|
||||
|
||||
> **回滚脚本**(若需要逆向):
|
||||
> ```sql
|
||||
> -- 仅在需要回滚到旧约束时执行
|
||||
> UPDATE public.platform_audit_logs SET result = UPPER(result);
|
||||
> ```
|
||||
|
||||
### M.2 D-2 `export_tasks.status` `done` → `success`
|
||||
|
||||
> **背景**:审核报告 D-2 要求 `status` 终态值 `done` 统一改为 `success`,对应 DDL CHECK 约束已由 v1.7 更新。存量 `done` 数据须一次性迁移。
|
||||
|
||||
```sql
|
||||
-- migration_D2_export_tasks_done_to_success.sql
|
||||
BEGIN;
|
||||
|
||||
UPDATE public.export_tasks
|
||||
SET status = 'success'
|
||||
WHERE status = 'done';
|
||||
|
||||
-- 验证:应返回 0 行
|
||||
SELECT COUNT(*) AS remaining_done
|
||||
FROM public.export_tasks
|
||||
WHERE status = 'done';
|
||||
|
||||
COMMIT;
|
||||
```
|
||||
|
||||
> **执行顺序**:先执行本脚本(数据迁移),再部署含新 DDL 的 Django migration(该 migration 会 `ALTER TABLE ... DROP CONSTRAINT ... ADD CONSTRAINT ...` 更新 CHECK)。若顺序颠倒,`done` 存量数据会触发 CHECK 约束违反。
|
||||
|
||||
Reference in New Issue
Block a user