领域模型的统一建模规则
状态:working-draft;治理依据:AGENTS.md。日期:2026-09-18。
1. 从场景推出对象
每个对象先说明使用者希望完成的动作、对象身份是否延续、哪些规则必须一起满足,再决定它是实体、值对象、聚合根、事实、投影还是流程记录。名称来自业务语言,不能因为旧表存在就沿用,也不能将每个名词都变成聚合根。
| 分类 | 判定依据 | 例子 |
|---|---|---|
| 实体 | 属性变化后仍是同一业务对象 | Order、Task |
| 值对象 | 按值解释、不可变,无独立业务身份 | Money、Quantity、时间窗口 |
| 聚合根 | 负责一组状态与规则的合法改变,是修改入口 | Order 维护订单行与成交规则 |
| 不可变事实 | 某件事已经发生并有来源依据 | 经验证收款、已接受测量、账本分录 |
| 快照 | 某次承诺接受的源数据副本 | 成交地址与规格 |
| 投影 | 从其他事实派生、可重建 | 可用量、订单旅程、总账汇总 |
| 流程对象 | 跟踪步骤、重试与恢复,不替代源事实 | 订单确认、外部订单导入 |
不可变事实也可能属于聚合或作为独立根管理;分类服务于责任分析,不能机械认为只有可变对象才有一致性边界。
2. 基础值与公共语义候选
本表只确定业务含义及必须明确的约束,编码与字段格式由后续唯一契约定义。
| 概念 | 语义与约束 | 定义责任 |
|---|---|---|
| Money | 金额与币种不可分;精度、舍入、分摊与换算必须明确;禁止浮点误差污染资金结果 | 公共契约维护者;交易与财务提供业务约束 |
| Quantity / Unit | 数量必须带单位;计数、重量、容量不能无依据换算 | 公共单位语义;各事实 Owner 定义允许操作 |
| TypedId / SourceRef | 标识注明对象类型与业务作用范围,外部标识包含必要渠道账号维度 | 各 Owner 定义,消费者引用 |
| VersionRef | 说明版本属于对象、政策、契约还是授权,不能混用 | 对应版本 Owner |
| TimeWindow | 区分发生、接收、生效时间及业务时区,明确截止端点含义 | 业务 Owner 与公共时间契约 |
| Address/Spec/Price Snapshot | 保存承诺时接受的内容及来源,不随当前主数据回写 | 接受承诺的 Owner |
| IdempotencyIdentity | 一次请求身份与一次业务目标身份分别定义 | 技术去重机制 + 业务 Owner |
| CurrentActor | 授权上下文的有时效快照,不是共享可变用户实体 | Identity |
| ObservationRef / EvidenceRef | 原始观察与证据的引用,明确来源与接受决定 | 接收方与事实判断 Owner |
不得把旧 UUID 版本、分钟数、包装规格或价格公式当作本轮已批准的公共约束。基础类型唯一不意味着所有上下文采用一个巨大的共享模型。
3. 生命周期与动作必须配套
每条精确迁移后续至少列:
- 发起角色或系统、对象及数据范围。
- 原状态、业务前置条件、授权与审批要求。
- 采用的对象和政策版本、校验与写入的原子范围。
- 新状态、追加事实、输出和需要通知的消费者。
- 重复、冲突、条件不满足、超时、未知结果及恢复方式。
“取消”“完成”“确认”等词必须有上下文。订单商业取消、容量释放、退款到账和停止作业可以处于不同阶段;只能按明确关闭规则认定全链完成。
4. 模型更新纪律
2026-09-29 补充:订单终态不可逆,重购、替换、补发、更正使用新的关联对象;不能将一般主数据的可逆状态套在订单上。资金、每日授权、执行门禁和协调进度分别建模。单根 CAS 不替代来源唯一性、原收款额度与执行数量谱系守卫;具体主讲见交易级严谨性。六类候选精确迁移以机器定义为单源,正文仅解释责任和条件,未决 guard 不能直接生成生产逻辑。
引用优先稳定 ID 和不可变版本;跨域引用允许业务快照,但不允许 ORM 级联写对方实体。旧版本更正采用新版本或有依据的调整,不能删除历史掩盖错误。
聚合不无限包含会话、事件、消息、任务或历史列表。需要分页或独立演进的集合先判断是否为独立实体/记录,再设计其一致性关系。一个 BC 可以拥有多个本地事务边界;任何跨根强约束都必须显式处理,不能仅写“最终一致”跳过风险。