MYSQL 中多态关联的最佳实践

Best practise for polymorphic associations in MYSQL

我有一个包含 tables 的数据库:clients (client_id)公司 (company_id).

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

更好的做法是:

  1. 有 2 个额外的 tables linking 到公司和地址:

    clients(client_id)
    client_addresses(client_id, address_id)
    companies(company_id)
    company_addresses(company_id, address_id)
    addresses (address_id)
    
  2. 有一个 table entities,它有一个主键 entity_id link 所有 3 tables:

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

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

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

您还需要弄清楚 "entity" 是否给您任何价值。例如。 client_addresses 将客户端存储在地址上(至少只有键),entities 存储什么?如果你想获取某个 ID 的客户端的所有地址,你必须加入 client_addressesaddresses;而使用 entities,您需要为同一件事连接 3 个表。

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

还有另一种选择。客户和公司可以被视为更通用实体的子类(或者,如果您愿意,子类型),可以称为联系人。客户是联系人,公司是联系人。我将跳过联系人是否既可以是客户也可以是公司。如果您选择以这种方式建模,您将面临一个问题,因为关系模型中缺少继承(更不用说多态性)。有几种方法可以解决这个问题,许多人已经实施并取得了一些不错的效果。 您可以在 SO 中的三个标签中看到这些技术概述:

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

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