【问题标题】:Best practise for polymorphic associations in MYSQLMYSQL中多态关联的最佳实践
【发布时间】:2016-03-01 06:54:42
【问题描述】:

我有一个包含表的数据库:clients (client_id)companies (company_id)。 p>

客户和公司都可以有地址 (address_id),存储在地址表中。

最好的做法是:

  1. 有 2 个额外的表格链接到公司和地址:

    clients(client_id)
    client_addresses(client_id, address_id)
    companies(company_id)
    company_addresses(company_id, address_id)
    addresses (address_id)
    
  2. 有一个表 entities,其中有一个主键 entity_id 用于链接所有 3 个表:

    entities(entity_id)
    clients(client_id, entity_id)
    companies(company_id, entity_id)
    addresses (address_id, entity_id)
    

【问题讨论】:

  • 根据大多数 ERP 系统,它们只有一个名为 GlobalAaddressBook 之类的表,其中包含由party id 和 table ref 区分的所有地址。

标签: sql database join database-design referential-integrity


【解决方案1】:

还有另一种选择。客户和公司可以被认为是更通用实体的子类(或者,如果您愿意,也可以是子类型),这可能被称为联系人。客户是联系人,公司是联系人。我将跳过联系人是否既可以是客户也可以是公司。如果您选择以这种方式对事物进行建模,那么您将面临一个问题,因为关系模型中没有继承(没关系多态性)。有几种方法可以解决这个问题,不同的人已经实施了一些不错的结果。 您可以在 SO 中的三个标签中看到这些技术:

最后一种技术与第二种技术结合使用。

除了追查每个标签中的信息和问题,你还可以在网络上做进一步的研究。

【讨论】:

    【解决方案2】:

    我想说唯一的区别是如果您需要存储一些特定于 client_addressescompany_addresses 的数据 - 那么第一种方法会更好。否则,您可以使用第二种方法。

    例如:如果您想在某个地址存储公司的员工人数,那么您应该选择第一种方法。如果客户或公司与地址的关系是一个简单的密钥对,您可以使用第二种方法来处理更少的表。

    您必须弄清楚的另一件事是“实体”是否能给您带来任何价值。例如。 client_addresses 将客户存储在地址上(至少只有键),entities 存储什么?如果您想获取某个 ID 的客户的所有地址,则必须加入 client_addressesaddresses;而使用entities,您需要为同一件事加入 3 个表。

    如果你问我,我会选择第一种方法。

    【讨论】:

    • 呃,我希望我没有用太复杂的方式解释这个...... :)
    • 谢谢米莎。我在想“实体”表只会提供一个唯一的 ID,然后可以使用 entity_id 直接连接地址和客户端。这意味着更少的桌子,但我觉得我错过了一些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多