如何在数据库中正确维护 SSOT(Single Source Of Truth)?

How to correctly maintain SSOT (Single Source Of Truth) in database?

我是数据库的新手,我来自前端世界,我非常感谢 SSOT。毕竟,我不想在 UI 上看到 'weird' 的事情,因为它会影响用户的行为。

现在我使用 postgres 设计了自己的后端,我真的很难决定如何处理 SSOT。

假设我有 5 个 table。 userorderorder_statuspaymentpayment_cancellation.

关系是:

order_statusstatus 列,这是一个 ENUM('UNPAID', 'PAID', 'CANCELLED').

第一题: order_status table 不是完全多余的吗?因为我可以完全从 order table 是否与 payment 有任何关系来推导出 order_status.status 列,对吗?考虑这些场景:

第二题: 我不会通过 order_status table 来打破 SSOT 吗?因为如果我没有正确处理任何关系更改,那么数据无论如何都不会有效?

第三题: 但是,如果我没有 order_status table,那么我将需要加入许多 table 才能检索最终状态。对此有什么建议吗?

非常感谢您的阅读和回答。

首先,认真思考事物的命名。值 UNPAID、PAID 和 CANCELLED 似乎处理不同的事情。例如,取消订单是一回事。取消付款是完全不同的事情。仔细想想你需要知道哪些事情的状态:账单、订单、付款、发票等

其次,在数据库世界中,我们没有像谈论规范化那样谈论单一事实来源。我已经看到过分关注 SSOT 和 DRY(不要重复自己)导致应用程序程序员走上糟糕的道路。

最后,您可能不需要 order_status table。 (但这取决于应用程序。)规范化本身并不意味着您需要加入许多 table 来检索最终状态。但是在每个 table 中使用代理 ID 号码都可以。