数据库模式设计和外键

Database schema design and foreign keys

我很困惑在以下情况下应该实施什么模式:

我有两个核心 tables usercompany 和一组 'inherited'(就 ORM 而言)tables 像 user_type_1user_type2 扩展 user table 具有自己独特的字段集。 company_type_1company_type_2 table 也是如此,它们扩展了 company table 并具有自己独特的字段集。

我还有一个addresstable。系统中的每个用户和公司都可以有自己的地址。

我最初的想法是添加 address_id FK 到 address(id) PK 到根 usercompany tables。这样,系统中的每个用户或公司都可以与自己的地址相关联。

我的同事提出了另一种数据库架构设计,其中必须将 user_idcompany_id FK 添加到 address table.

我现在对这个提议真的很困惑。你能解释一下吗,或者这个设计可以代替吗?

如果您将 address_id 添加到 usercompany table,您将添加函数依赖项 user_id -> address_idcompany_id -> address_id .这意味着每个用户或公司可以与一个地址相关联,但每个地址可能与多个用户或公司相关联(除非您添加约束以防止这种情况发生)。

您的同事建议将 user_idcompany_id 添加到 address table 添加功能依赖项 address_id -> user_idaddress_id -> company_id 表示每个地址可以与一个用户、一个公司或两者相关联,但每个用户或公司可能与多个地址相关联(除非您添加约束以防止这种情况发生)。

在您列出的两个选项之间,还有第三个 - 单独的 tables 用于关联,例如user_addresses (user_id FK, address_id FK)company_addresses (company_id FK, address_id FK)。这可以处理任何基数 (one-to-one/one-to-many/many-to-one/many-to-many),具体取决于 PK(address_iduser_id/company_id 或两者)和可能的唯一约束。

哪种设计是正确的取决于您的要求。