POFA 数据模型规范 v1

2026-11-03 · 状态:已定,实施中 · English: Data Model Spec v1 · 关联文档:多租户数据库架构设计(商业化阶段)

1. 为什么写这份

2026-11-03 对生产库做了一次只读关系审计,结论三条:

本规范只解决「下一场真实赛事出生形状要正」的问题,不重构生产库,不拆表。

2. 规范字段(赛事 data)

新字段取值含义旧字段(继续同步)
disciplinesingles(预留 doubles)单打 / 双打——「打几个人」无(新增维度)
draw_typesingle_elimination / double_elimination / round_robin签表类型——「怎么淘汰」format:single / double / rr
draw_random_seed整数或 null随机排种时的洗牌种子,仅 seeding=random 时生效seed

同步规则:服务器(POST /api/tournaments 与 PATCH)负责双向同步——来文带任一侧字段,就补齐另一侧。存量页面与工具继续读旧字段不受影响;新代码只读新字段。历史值 se 只做读映射(= single_elimination),不回写老数据。

3. 选手 ID

4. 锁定

5. 比分完整性与 DUPR 提交门槛

6. 核心数据链现状(审计时点)

环节现状
赛事 → 报名entries 独立表仅 MCP 链在用,活跃赛事报名记录为 0
报名 → 签表页面链由名单实时推导;MCP 链物化为 mcp_bracket,双轨并存
签表 → 比赛比赛无独立表,是签表推导结果或 mcp_bracket 内嵌对象
比赛 → 比分 → 晋级MCP 已实现(比分、胜者、自动晋级、撤销级联、mcp_audit),未在真实赛事用过
完赛归档缺失,目前终点是 deleted_at 软删除

7. 分层路线

现在做(本规范):字段规范化、player_id、锁定。三者只动服务器一处咽喉,老数据不批量迁移。

第一场真实赛事测试前:报名审核与签到状态、退赛、裁判分配、排程字段(court / scheduled_at)、比分纠错流程。

商业化再做:organizers 多租户、matches 独立表、DUPR 账户关联、通知系统。matches 拆独立实体的触发条件:一场真实赛事完整跑完,且出现跨场查询或多裁判并发记分的实际需求。

原则:不是所有信息都进赛事 JSON。比分、报名、选手身份终将是独立实体;但拆分时机由真实赛事的使用证据决定,不由想象决定。