假设用户有3种不同的付款方式。现金,IBAN,并通过提供某些文件。每种付款方式都需要自己不同的详细信息。
如何将其存储在数据库中?
假设用户选择使用自己的IBAN进行付款,假设this picture是当前数据库,我是否填写与IBAN选项相关的字段并将其他字段设置为Null?还是有一种更专业的方式来存储数据而没有这些Null值?
更新
我在此question的答案中找到了解决此问题的方法,但是答案仍然不够。如果有人链接到更详细的文档,请告诉我。
答案 0 :(得分:0)
正如@philipxy所指出的,您正在询问有关在RDBMS中表示继承的问题。有几种不同的方法可以做到这一点:
NULL
存储在不适用的列中-否则,InnoDB表的默认设置将使用紧凑的行格式,这意味着NULL列不会占用额外的空间存储。当然,您的查询可能会变得复杂,并且维护这些表可能会变得很麻烦。具有子表来存储您的详细信息:
Payments (PaymentID, PaymentDate, etc.)
CashPaymentDetails(PaymentID, Cash_Detail_1, Cash_Detail_2, etc.)
IBANPaymentDetails(PaymentID, IBAN_Detail_1, etc.)
通过将基本付款表与“子公司”表之一结合起来,可以获得每笔付款的信息:
SELECT *
FROM Payments P INNER JOIN CashPaymentDetails C ON
C.PaymentID = P.PaymentID
您的第三个选择是使用实体属性值(EAV)模型。与选项2一样,您有一个基本的付款表。但是,您没有一个包含付款明细的附属表,而不是每种付款方式都有一个表。有关更多信息,请here's the Wiki page和here's a blog以及一些其他信息。