MYSQL 中多态关联的最佳实践
Best practise for polymorphic associations in MYSQL
我有一个包含 tables 的数据库:clients (client_id) 和 公司 (company_id).
客户和公司都可以有 地址 (address_id),存储在地址 table 中。
更好的做法是:
有 2 个额外的 tables linking 到公司和地址:
clients(client_id)
client_addresses(client_id, address_id)
companies(company_id)
company_addresses(company_id, address_id)
addresses (address_id)
有一个 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_addresses
或 company_addresses
的数据 - 那么第一种方法会更好。否则,您可以使用第二种方法。
例如:如果您想存储公司在某个地址的员工人数,那么第一种方法应该是您的选择。如果客户或公司与地址的关系是一个简单的密钥对,您可以使用第二种方法来处理更少的表。
您还需要弄清楚 "entity" 是否给您任何价值。例如。 client_addresses
将客户端存储在地址上(至少只有键),entities
存储什么?如果你想获取某个 ID 的客户端的所有地址,你必须加入 client_addresses
和 addresses
;而使用 entities
,您需要为同一件事连接 3 个表。
如果你问我,我会选择第一种方法。
还有另一种选择。客户和公司可以被视为更通用实体的子类(或者,如果您愿意,子类型),可以称为联系人。客户是联系人,公司是联系人。我将跳过联系人是否既可以是客户也可以是公司。如果您选择以这种方式建模,您将面临一个问题,因为关系模型中缺少继承(更不用说多态性)。有几种方法可以解决这个问题,许多人已经实施并取得了一些不错的效果。
您可以在 SO 中的三个标签中看到这些技术概述:
single-table-inheritance class-table-inheritance shared-primary-key
最后一种技术与第二种技术结合使用。
除了追查每个标签中的信息和问题之外,您还可以在网络上做进一步的研究。
我有一个包含 tables 的数据库:clients (client_id) 和 公司 (company_id).
客户和公司都可以有 地址 (address_id),存储在地址 table 中。
更好的做法是:
有 2 个额外的 tables linking 到公司和地址:
clients(client_id) client_addresses(client_id, address_id) companies(company_id) company_addresses(company_id, address_id) addresses (address_id)
有一个 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_addresses
或 company_addresses
的数据 - 那么第一种方法会更好。否则,您可以使用第二种方法。
例如:如果您想存储公司在某个地址的员工人数,那么第一种方法应该是您的选择。如果客户或公司与地址的关系是一个简单的密钥对,您可以使用第二种方法来处理更少的表。
您还需要弄清楚 "entity" 是否给您任何价值。例如。 client_addresses
将客户端存储在地址上(至少只有键),entities
存储什么?如果你想获取某个 ID 的客户端的所有地址,你必须加入 client_addresses
和 addresses
;而使用 entities
,您需要为同一件事连接 3 个表。
如果你问我,我会选择第一种方法。
还有另一种选择。客户和公司可以被视为更通用实体的子类(或者,如果您愿意,子类型),可以称为联系人。客户是联系人,公司是联系人。我将跳过联系人是否既可以是客户也可以是公司。如果您选择以这种方式建模,您将面临一个问题,因为关系模型中缺少继承(更不用说多态性)。有几种方法可以解决这个问题,许多人已经实施并取得了一些不错的效果。 您可以在 SO 中的三个标签中看到这些技术概述:
single-table-inheritance class-table-inheritance shared-primary-key
最后一种技术与第二种技术结合使用。
除了追查每个标签中的信息和问题之外,您还可以在网络上做进一步的研究。