如何在数据库中正确维护 SSOT(Single Source Of Truth)?
How to correctly maintain SSOT (Single Source Of Truth) in database?
我是数据库的新手,我来自前端世界,我非常感谢 SSOT。毕竟,我不想在 UI 上看到 'weird' 的事情,因为它会影响用户的行为。
现在我使用 postgres 设计了自己的后端,我真的很难决定如何处理 SSOT。
假设我有 5 个 table。 user
、order
、order_status
、payment
和 payment_cancellation
.
关系是:
user
- order
: 1-n
order
- order_status
: 1-n
order
- payment
: 1-n
payment
- payment_cancellation
: 1-1
order_status
有 status
列,这是一个 ENUM('UNPAID', 'PAID', 'CANCELLED')
.
第一题:
order_status
table 不是完全多余的吗?因为我可以完全从 order
table 是否与 payment
有任何关系来推导出 order_status.status
列,对吗?考虑这些场景:
UNPAID
= 没有付款的订单
PAID
= 有任何付款的订单
CANCELLED
= 有任何付款的订单最后一次付款有 payment_cancellation
第二题:
我不会通过 order_status
table 来打破 SSOT 吗?因为如果我没有正确处理任何关系更改,那么数据无论如何都不会有效?
第三题:
但是,如果我没有 order_status
table,那么我将需要加入许多 table 才能检索最终状态。对此有什么建议吗?
非常感谢您的阅读和回答。
首先,认真思考事物的命名。值 UNPAID、PAID 和 CANCELLED 似乎处理不同的事情。例如,取消订单是一回事。取消付款是完全不同的事情。仔细想想你需要知道哪些事情的状态:账单、订单、付款、发票等
其次,在数据库世界中,我们没有像谈论规范化那样谈论单一事实来源。我已经看到过分关注 SSOT 和 DRY(不要重复自己)导致应用程序程序员走上糟糕的道路。
最后,您可能不需要 order_status table。 (但这取决于应用程序。)规范化本身并不意味着您需要加入许多 table 来检索最终状态。但是在每个 table 中使用代理 ID 号码都可以。
我是数据库的新手,我来自前端世界,我非常感谢 SSOT。毕竟,我不想在 UI 上看到 'weird' 的事情,因为它会影响用户的行为。
现在我使用 postgres 设计了自己的后端,我真的很难决定如何处理 SSOT。
假设我有 5 个 table。 user
、order
、order_status
、payment
和 payment_cancellation
.
关系是:
user
-order
: 1-norder
-order_status
: 1-norder
-payment
: 1-npayment
-payment_cancellation
: 1-1
order_status
有 status
列,这是一个 ENUM('UNPAID', 'PAID', 'CANCELLED')
.
第一题:
order_status
table 不是完全多余的吗?因为我可以完全从 order
table 是否与 payment
有任何关系来推导出 order_status.status
列,对吗?考虑这些场景:
UNPAID
= 没有付款的订单PAID
= 有任何付款的订单CANCELLED
= 有任何付款的订单最后一次付款有 payment_cancellation
第二题:
我不会通过 order_status
table 来打破 SSOT 吗?因为如果我没有正确处理任何关系更改,那么数据无论如何都不会有效?
第三题:
但是,如果我没有 order_status
table,那么我将需要加入许多 table 才能检索最终状态。对此有什么建议吗?
非常感谢您的阅读和回答。
首先,认真思考事物的命名。值 UNPAID、PAID 和 CANCELLED 似乎处理不同的事情。例如,取消订单是一回事。取消付款是完全不同的事情。仔细想想你需要知道哪些事情的状态:账单、订单、付款、发票等
其次,在数据库世界中,我们没有像谈论规范化那样谈论单一事实来源。我已经看到过分关注 SSOT 和 DRY(不要重复自己)导致应用程序程序员走上糟糕的道路。
最后,您可能不需要 order_status table。 (但这取决于应用程序。)规范化本身并不意味着您需要加入许多 table 来检索最终状态。但是在每个 table 中使用代理 ID 号码都可以。