如何设计业务数据库
这一页只保留练习版:从需求到 schema。
设计题:做一个 Web 记账系统,用户可以记录收入、支出、转账,按月查看流水和分类统计。
| 事实 | 为什么要保存 |
| 账本 | 数据归属边界。 |
| 账户 | 钱从哪里来、到哪里去。 |
| 分类 | 月报统计口径。 |
| 账目 | 一笔收入、支出或转账事实。 |
ledgers(id, name, owner_user_id, created_at)
accounts(id, ledger_id, name, currency, archived_at)
categories(id, ledger_id, name, kind, archived_at)
entries(id, ledger_id, account_id, category_id, type, amount_cents, occurred_on, note, created_by, created_at)
| 约束 | 挡住什么错误 |
entries.ledger_id 必填。 | 账目没有归属。 |
account_id、category_id 外键。 | 账目引用不存在的账户或分类。 |
amount_cents > 0。 | 金额语义混乱。 |
| 分类和账户只归档,不硬删。 | 历史账目断链。 |
| 场景 | 设计是否撑得住 |
| 分类改名。 | 账目引用分类 ID,历史不靠名字连接。 |
| 查看本月流水。 | 按 ledger_id + occurred_on 建索引。 |
| 转账。 | 转出和转入必须同事务成功。 |
| 重复提交。 | 用业务唯一键或幂等键兜底。 |
结论:会设计数据库,不是会列很多数据库概念,而是能把一个需求变成这四样东西:表、关系、约束、查询路径。