数据库模式设计和外键
Database schema design and foreign keys
我很困惑在以下情况下应该实施什么模式:
我有两个核心 tables user
和 company
和一组 'inherited'(就 ORM 而言)tables 像 user_type_1
、user_type2
扩展 user
table 具有自己独特的字段集。 company_type_1
、company_type_2
table 也是如此,它们扩展了 company
table 并具有自己独特的字段集。
我还有一个address
table。系统中的每个用户和公司都可以有自己的地址。
我最初的想法是添加 address_id
FK 到 address(id) PK 到根 user
和 company
tables。这样,系统中的每个用户或公司都可以与自己的地址相关联。
我的同事提出了另一种数据库架构设计,其中必须将 user_id
和 company_id
FK 添加到 address
table.
我现在对这个提议真的很困惑。你能解释一下吗,或者这个设计可以代替吗?
如果您将 address_id
添加到 user
和 company
table,您将添加函数依赖项 user_id -> address_id
和 company_id -> address_id
.这意味着每个用户或公司可以与一个地址相关联,但每个地址可能与多个用户或公司相关联(除非您添加约束以防止这种情况发生)。
您的同事建议将 user_id
和 company_id
添加到 address
table 添加功能依赖项 address_id -> user_id
和 address_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_id
、user_id/company_id
或两者)和可能的唯一约束。
哪种设计是正确的取决于您的要求。
我很困惑在以下情况下应该实施什么模式:
我有两个核心 tables user
和 company
和一组 'inherited'(就 ORM 而言)tables 像 user_type_1
、user_type2
扩展 user
table 具有自己独特的字段集。 company_type_1
、company_type_2
table 也是如此,它们扩展了 company
table 并具有自己独特的字段集。
我还有一个address
table。系统中的每个用户和公司都可以有自己的地址。
我最初的想法是添加 address_id
FK 到 address(id) PK 到根 user
和 company
tables。这样,系统中的每个用户或公司都可以与自己的地址相关联。
我的同事提出了另一种数据库架构设计,其中必须将 user_id
和 company_id
FK 添加到 address
table.
我现在对这个提议真的很困惑。你能解释一下吗,或者这个设计可以代替吗?
如果您将 address_id
添加到 user
和 company
table,您将添加函数依赖项 user_id -> address_id
和 company_id -> address_id
.这意味着每个用户或公司可以与一个地址相关联,但每个地址可能与多个用户或公司相关联(除非您添加约束以防止这种情况发生)。
您的同事建议将 user_id
和 company_id
添加到 address
table 添加功能依赖项 address_id -> user_id
和 address_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_id
、user_id/company_id
或两者)和可能的唯一约束。
哪种设计是正确的取决于您的要求。