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

5
快速提出关于数据库设计的问题!在这个例子中有用户和日程安排。每个用户可以有多个日程安排,每个日程安排也可以属于多个用户。
我有两个表,“用户”和“日程安排”,每个表都有一个唯一标识符/主键(user_id和schedule_id):这些表具有多对多的关系。
在这里,我不确定/没有经验:为了连接它们并遵循良好的数据库设计,我想创建一个链接表,它有两个列,user_id和schedule_id。我计划将它们都设置为主键(因此是复合键)。但是,我是否还需要添加两个外键,一个在user_id上连接到“用户”表,另一个在schedule_id上连接到“日程安排”表吗?
简而言之:我计划在连接两个表的2列“链接”表中使用复合键。我是否需要将它们变成外键?

3
你所有问题的答案都是“是”。 - dcaswell
2
你的想法完全正确 - 使用复合主键来确保唯一性,同时使用外键与其他表建立关联以确保引用完整性。 - Michael Berkowski
谢谢,我尝试在各个地方搜索但没有找到确切的答复。 - Eric Walsh
1个回答

4

PK和FK有不同的作用。在链接表中,您需要PK来保留数据的唯一性。然而,如果您不创建FK,则可能会出现数据完整性问题,因为ID可能会从原始表中删除,而没有从链接表中删除。

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


3
+1:我只想补充一点,应用程序不能强制在行之间执行完整性(主键、唯一键和外键)的原因是数据库会阻止会话看到未提交的更改。两个会话可以同时输入相同的数据,而无法检测到另一个会话已经这样做了。 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接