让非法状态无法表示:两个数据库建模案例
作者用两个生产案例说明如何把「让非法状态无法表示」落到数据建模上。案例一:把连续时间线表示为 List (Date, Date) 会留下空隙和重叠,改为只存切分日期的 Set Date,连续与不重叠约束就天然成立,再切一刀只需往集合里加一个日期。案例二:合约系统把 fixed 与 default 合约都塞进同一张表,结束日期是可空字段,加上按单份合约修改的 API 毫无防护,线上确实出现过合约空缺,排查耗费数小时工程时间;把 default 合约从表中移除、由「没有 fixed 合约」推断得出后,空缺与可选结束日期同时消失。作者认为根源是用 OO 思维把每个概念都物化成一行,把行当作序列化对象而非命题,这会反过来污染整个系统设计。文末给出禁止合约重叠的两种做法:数据库 excludes 约束,或写模型允许重叠、读模型投影时用下一份合约的起始日截断。适合做数据建模与后端 schema 设计的工程师阅读。