付款表设计
Payment tables design
我有 2 个表 Payments 和 PaymentMethods。但是,根据付款方式,一些银行卡详细信息不会被存储,而一些额外的详细信息可能会被存储。因此,存储的卡详细信息取决于付款方式 - 例如电汇。最好的设计方法是什么?
+--------------+
| Payments |
+--------------+
| CardDetails |
| Amount |
| OtherDetails |
+--------------+
+---------------+
| PaymentMethods|
+---------------+
| Id |
| Type |
+---------------+
您正在处理 Supertype\Subtype 问题。所有支付都有一些共同点(至少 ID 和类型),但每种类型都有一些独特的属性。您可以通过多种方式对这种情况进行建模,每种方式各有利弊。
'Classical' 解决方案是将超类型放在一个 table(支付)中,并为每个子类型(支付方式)创建单独的 table。超类型 table 和每个子类型 table.
之间存在 1:1 关系
示例,超类型 table:
Payment (PaymentID, PaymentMethodID, Date, UserID ...)
子类型:
CreditCardPayment(PaymentID, CardNumber, ....)
PayPalPayment(PaymentID, SecurityCode, ...)
WireTransfer(PaymentID, AccountNumber, ...)
当您创建付款时,您在付款中创建记录并在一笔交易中记录在其中一个子类型中。这种实现方式是一种很好的实现方式,因为它是规范化的,可以轻松扩展和防错。但不幸的是,它非常冗长,需要比非规范化解决方案更多的努力。
非规范化解决方案是创建一个付款 table 并为所有付款方式添加一堆列。当您创建新付款时,大多数列都是空的,只有应用程序逻辑知道应该定义哪些列。这个方案实现起来简单很多,但是问题比较明显。
特殊情况下有更多选项,但我认为它们对于支付系统来说太过分了。所以这是你的电话,选择什么。作为一个数据库人,我更喜欢第一个选项。
我有 2 个表 Payments 和 PaymentMethods。但是,根据付款方式,一些银行卡详细信息不会被存储,而一些额外的详细信息可能会被存储。因此,存储的卡详细信息取决于付款方式 - 例如电汇。最好的设计方法是什么?
+--------------+
| Payments |
+--------------+
| CardDetails |
| Amount |
| OtherDetails |
+--------------+
+---------------+
| PaymentMethods|
+---------------+
| Id |
| Type |
+---------------+
您正在处理 Supertype\Subtype 问题。所有支付都有一些共同点(至少 ID 和类型),但每种类型都有一些独特的属性。您可以通过多种方式对这种情况进行建模,每种方式各有利弊。
'Classical' 解决方案是将超类型放在一个 table(支付)中,并为每个子类型(支付方式)创建单独的 table。超类型 table 和每个子类型 table.
之间存在 1:1 关系示例,超类型 table:
Payment (PaymentID, PaymentMethodID, Date, UserID ...)
子类型:
CreditCardPayment(PaymentID, CardNumber, ....)
PayPalPayment(PaymentID, SecurityCode, ...)
WireTransfer(PaymentID, AccountNumber, ...)
当您创建付款时,您在付款中创建记录并在一笔交易中记录在其中一个子类型中。这种实现方式是一种很好的实现方式,因为它是规范化的,可以轻松扩展和防错。但不幸的是,它非常冗长,需要比非规范化解决方案更多的努力。
非规范化解决方案是创建一个付款 table 并为所有付款方式添加一堆列。当您创建新付款时,大多数列都是空的,只有应用程序逻辑知道应该定义哪些列。这个方案实现起来简单很多,但是问题比较明显。
特殊情况下有更多选项,但我认为它们对于支付系统来说太过分了。所以这是你的电话,选择什么。作为一个数据库人,我更喜欢第一个选项。