【问题标题】:Are foreign keys used in a "link" table?“链接”表中是否使用了外键?
【发布时间】:2013-09-10 00:06:40
【问题描述】:

关于数据库设计的快速问题!在这个例子中,有用户和时间表。每个用户可以有多个时间表,每个时间表可以属于多个用户。

我有两个表,“user”和“schedule”,每个表都有一个唯一的标识符/主键(user_id 和 schedule_id):这些表具有多对多关系。

这是我不确定/缺乏经验的地方:为了将它们连接在一起并遵守良好的数据库设计,我想创建一个包含两列 user_id 和 schedule_id 的链接表。我计划制作这两个主键(因此是复合键)。但是,我是否还要添加两个外键,一个在 user_id 上链接到 'user' 表,一个在 schedule_id 上链接到 'schedule' 表?

TLDR:我计划在连接两个表的 2 列“链接”表中使用复合键。我应该/是否还需要将它们变成外键?

【问题讨论】:

  • 所有问题的答案都是肯定的。
  • 您的想法是完全正确的 - 复合主键可确保唯一对,以及其他每个表的外键以确保它们的引用完整性。\
  • 谢谢您,尝试到处搜索,但找不到具体回复。

标签: mysql database-design


【解决方案1】:

PK 和 FK 有不同的用途。在链接表中,您需要 PK 来保持数据的唯一性。但是,如果您不同时创建 FK,那么您最终可能会遇到数据完整性问题,因为 ID 可能会从原始表而不是链接表中删除。

有时人们认为他们可以不使用 FK,因为他们将通过应用程序强制执行数据完整性。这几乎总是因为当约束不允许他们做他们想做的事情时,他们会觉得很烦人。当然,这是约束的目的,防止用户和开发人员做他们不应该做的事情。必须通过数据库保持数据完整性;冒险让应用程序处理它太重要了。我已经看到了来自数百个数据库的大量数据,而那些数据最差的数据总是开发人员认为他们可以通过应用程序管理诸如表关系之类的东西。当你这样做时总会有漏洞,最终它们会回来咬你,然后它们可能很难正确修复。

【讨论】:

  • +1:我只想补充一点,应用程序根本无法强制行之间的完整性(主键、唯一键和外键),因为数据库会阻止会话看到未提交的更改。两个会话可以同时输入相同的数据,而不会检测到另一个会话已经这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多