sql - MYSQL 中多态关联的最佳实践

标签 sql database join database-design referential-integrity

我有一个包含表的数据库:客户 (client_id)公司 (company_id)

客户和公司都可以有地址 (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)
    

最佳答案

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

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

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

关于sql - MYSQL 中多态关联的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35716497/

相关文章:

sql - 无法重置 Azure SQL 服务器的密码(灰显)

database - Oracle 通用数据库链接不工作

mysql - 如何使用额外条件连接表

mysql - drupal7通过手动sql获取内容

mysql - 如何查找一列以返回我需要在一个 mysql 调用中连接表的列

php - 小于运算符给出奇怪的结果

mysql - 编写触发器以使用其自身行中的值更新值

php - php mysql中的计算

mysql - 聚合具有可能空值的列

SQL Server 聚集索引 - 索引问题的顺序