假设一个用户有3种不同的支付方式。现金,iban,并通过提供一定的文件。每种支付类型都需要自己不同的详细信息。如何将其存储在数据库中?假设用户选择使用他的iban付款,假设这张图片是当前数据库,我是否填充与iban选项相关联的字段并将其他字段设置为null?或者有没有更专业的方法来存储数据而不必使用这些空值?更新我在对这个问题的回答中找到了解决这个问题的办法,然而,答案仍然不够。如果有人有一个更详细的文件链接,请让我知道。
4c8rllxm1#
正如@philipxy所指出的,您正在询问如何在rdbms中表示继承。有几种不同的方法可以做到这一点:将所有属性放在一个表中(根据您的屏幕截图,这就是您现在拥有的属性)。使用这种方法,最好存储 NULL 在不适用的列中,如果没有其他设置,innodb表的默认设置使用紧凑的行格式,这意味着空列不会占用额外的存储空间。当然,您的查询可能会变得复杂,维护这些表可能会变得很麻烦。有子表来存储您的详细信息: 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一样,您有一个基本付款表。但是,不是每个付款方法都有一个表,而是有一个包含付款详细信息的辅助表。更多信息,这里是wiki页面,这里是一个包含一些附加信息的博客。
NULL
Payments (PaymentID, PaymentDate, etc.)
IBANPaymentDetails(PaymentID, IBAN_Detail_1, etc.)
SELECT * FROM Payments P INNER JOIN CashPaymentDetails C ON C.PaymentID = P.PaymentID
1条答案
按热度按时间4c8rllxm1#
正如@philipxy所指出的,您正在询问如何在rdbms中表示继承。有几种不同的方法可以做到这一点:
将所有属性放在一个表中(根据您的屏幕截图,这就是您现在拥有的属性)。使用这种方法,最好存储
NULL
在不适用的列中,如果没有其他设置,innodb表的默认设置使用紧凑的行格式,这意味着空列不会占用额外的存储空间。当然,您的查询可能会变得复杂,维护这些表可能会变得很麻烦。有子表来存储您的详细信息:
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一样,您有一个基本付款表。但是,不是每个付款方法都有一个表,而是有一个包含付款详细信息的辅助表。更多信息,这里是wiki页面,这里是一个包含一些附加信息的博客。