标准答案
- 订单表应有稳定订单 ID、用户或租户归属、金额快照、订单状态、版本、创建与更新时间,并保存关键业务唯一键。
- 库存表或库存流水要区分可售、锁定、已扣减、释放等数量与原因,扣减使用条件更新或明确的并发控制避免超卖。
- 支付表应保存支付单 ID、订单关联、渠道流水号、金额币种、支付状态、回调原文摘要和幂等信息,渠道流水号通常需唯一。
- 状态迁移要有合法前置状态、发生时间、操作者或来源,避免支付回调、超时关单和人工操作把状态倒退。
- 所有表都要考虑退款、取消、重复回调、对账和审计,金额使用精确数值类型而不是浮点。
题目解析
核心交易表最危险的设计是把“订单已支付”当成唯一事实。支付渠道可能成功但回调迟到,库存可能预占后释放,退款又是新的资金事实;这些需要各自可追溯的记录和清晰关联。
唯一约束、状态机和审计字段共同防止重复与倒退。仅靠代码里的 if 判断无法覆盖并发请求、异步回调、重试和人工修复脚本。
常见误区
- 用浮点字段存金额,累计、比较和对账出现精度误差。
- 把库存、订单、支付状态压成一个字段,无法解释失败、超时、退款和重复回调。