【问题标题】:ERD: how to store data for three different payment typesERD:如何存储三种不同支付类型的数据
【发布时间】:2018-11-13 03:30:45
【问题描述】:

假设用户有 3 种不同的付款方式。现金、IBAN,并通过提供某些文件。每种付款类型都需要自己不同的详细信息。

如何将其存储在我的数据库中?

假设用户选择使用他的 IBAN 支付,假设 this picture 是当前数据库,我是否填写与 IBAN 选项相关的字段并将其他字段设置为 Null?或者有没有更专业的方式来存储数据而不需要这些 Null 值?

更新

我在question的答案中找到了解决这个问题的方法,但是,答案仍然不够。如果有人有更详细文件的链接,请告诉我。

【问题讨论】:

  • 嗨。这是一个常见问题解答。 (显然。)请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并采取行动minimal reproducible example
  • use text, not images/links, for text (including code, tables & ERDs)。使用链接/图像仅是为了方便补充文本和/或无法在文本中给出的内容。永远不要给出没有图例/键的图表。如果您有代表,请使用编辑功能内联,而不是链接 - 使您的帖子独立。
  • 谢谢@philipxy 如果您有任何其他问题,您可能认为可能与我的问题重复,请告诉我。再次感谢。
  • 网上有无数的Stack Overflow & Database Administrators 重复和其他资源,google 数据库/sql 子类型/超类型/继承/多态。在线查看数十本免费教科书,了解各种信息建模方法如何处理设计和数据库中的子类型化。

标签: mysql database-normalization erd rdbms


【解决方案1】:

正如@philipxy 所指出的,您询问的是在 RDBMS 中表示继承。有几种不同的方法可以做到这一点:

  1. 将所有属性放在一个表中(根据您的屏幕截图,这就是您现在所拥有的)。使用这种方法,最好将NULLs 存储在不适用的列中——如果没有别的,InnoDB 表的默认设置使用紧凑行格式,这意味着 NULL 列不会占用额外的存储空间。当然,您的查询可能会变得复杂,维护这些表可能会变得很麻烦。
  2. 有子表来存储您的详细信息:

    • 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

  3. 您的第三个选项是使用实体属性值 (EAV) 模型。与选项 2 一样,您有一个基本的付款表。但是,您有一个包含付款详细信息的子表,而不是每种付款方式都有一个表。如需更多信息,请here's the Wiki pagehere's a blog 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2013-09-08
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多