【问题标题】:In MySql how to design two tables with same columns but with different relationship在MySql中如何设计两个具有相同列但具有不同关系的表
【发布时间】:2019-01-11 09:19:56
【问题描述】:

我有两个表 CustomerPartner 共享相同的属性(列名),但它们没有相同的关系。

关系如下:

只有客户有帐户。

一个客户只能有一个合作伙伴。

客户有职业。

合伙人有职业。

我的解决方案

1

使用外键 (customer_id) 创建一个包含所有属性的单个表 (User),以引用合作伙伴的相关客户, 所以:

客户是具有 (account_id) NOT NULL 和 (Customer_id) NULL 的用户 合作伙伴是具有 (account_id) NULL 和 (Customer_id) NOT NULL 的用户。

2

为客户和合作伙伴创建两个单独的表,并在合作伙伴表中放置一个外键以引用他的相关客户。

3

创建一个包含所有公共属性的基表,并在客户表和合作伙伴表中添加一个外键以引用此表。

我想知道哪种方法看起来是正确的。

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    我是说你误解了一些东西。你强迫性地尝试组合不同实体(客户、合作伙伴)的属性。您可能想要或应该做的是规范化数据。 (所以你已经有了一些关键词可以进一步研究)。

    客户不是合作伙伴,而是另一个实体。如果您想将其全部放入一个表中,如解决方案 1 中所示,那么首先“用户”这个名称具有误导性。其次,您必须插入一个指定类型的属性(例如 EntityType (Customer, Partner) 并引用单独的表)。您关于某事物是否为 NULL 的建议非常容易出错,并且没有其他人会理解(3 个月后您也不会理解)。如果业务逻辑发生变化,合作伙伴可以登录,那么您已经遇到了问题。

    快乐学习... =) “授人以渔,养其一生”

    【讨论】:

      【解决方案2】:

      我在没有查看您提出的模型的情况下构建了我的模型,我最终得到了非常接近您的第二个模型的东西。唯一的区别是我将 PartnerID 作为外键放在 Customer 表中。你反其道而行之。这是一个选择题,合作伙伴是否“拥有”相反的客户?我看到的和你相反。

      对于您的 no1:您正在尝试将应用程序逻辑放入数据库模型中,我不会这样做。它很容易出现数据完整性问题(例如,您最终会得到两个字段 == Null 的用户!)。

      对于你的 no3:我知道你想“隔离”公共字段,但如果表 User 中的值无论如何都不会被重用,我不明白这一点。您将始终为每个客户提供 1 条线路,为每个合作伙伴提供 1 条线路。还不如把它放在桌子上。这仅在您从不客户和合作伙伴是同一个人时才有效。

      【讨论】:

      • 我将CustomerID作为外键放在Partner表中以避免空外键引用,因为可以在没有合作伙伴的情况下创建Customer,而Partner必须有一个相关的Customer。 No.2 解决方案是执行查询最简单的解决方案,但我想知道拥有两个具有相同列名的不同表是否是一种不好的做法。
      猜你喜欢
      • 2020-03-19
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2021-06-04
      • 2014-08-12
      • 1970-01-01
      相关资源
      最近更新 更多