【问题标题】:Database schema design and foreign keys数据库模式设计和外键
【发布时间】:2016-11-03 16:55:12
【问题描述】:

我很困惑在以下情况下应该实现什么架构:

我有两个核心表 usercompany 以及一组“继承”(就 ORM 而言)表,如 user_type_1user_type2 扩展 user 表并具有自己独特的字段集. company_type_1company_type_2 表也是如此,这些表扩展了 company 表并具有自己独特的字段集。

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

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

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

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

【问题讨论】:

  • 每个用户/公司可以有多少个地址?每个地址可以属于多少个用户/公司?

标签: database database-design architecture database-schema


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您的解释!
  • @reaanb (& @alexanoid) 向表中添加列不会导致 FD 保持不变。这个答案似乎假设在不影响 CK 的情况下添加了该列。这与假设列在功能上由 CK 确定是一样的。因此,在假设下,FD 成立。请记住,表只包含使其谓词为真的行。如果 entity:address 恰好是 many:many,那么就这样吧,在该对出现的任何表中。(当然,这样的设计可能会受到不需要的 FD 和/或 JD 的影响。)这个答案没有问题的特征和合理性。
  • @philipxy 你说得对,我认为 CK 不受影响。我还假设用户、公司和地址表是并且应该保留在 3NF 中。这个问题对我来说似乎相当清楚,即使措辞不严谨。
猜你喜欢
  • 2011-10-10
  • 2011-04-14
  • 1970-01-01
  • 2012-08-10
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多