“链接”表中是否使用了外键?

Eri*_*lsh 5 mysql database-design

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

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

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

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

HLG*_*GEM 4

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

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

  • +1:我只是补充一点,应用程序根本无法强制行(主键、唯一键和外键)之间的完整性,因为数据库阻止会话看到未提交的更改。两个会话可以同时输入相同的数据,而无法检测到对方已这样做。 (3认同)