36

在使用处理关系的 MVC 框架时定义外键有什么好处?

我正在使用带有允许模型定义与关系的框架的关系数据库。因为外键是通过模型定义的,所以外键似乎是多余的。在开发中管理应用程序的数据库时,编辑/删除使用外键的表是一件麻烦事。

通过完全放弃使用外键来使用我放弃的外键有什么好处吗?

4

5 回答 5

43

具有约束的外键(在某些数据库引擎中)为您提供低级别(数据库级别)的数据完整性。这意味着您不能实际创建不满足关系的记录。这只是一种更安全的方法。

于 2012-04-16T23:37:18.233 回答
17

它为您提供在数据库级别强制执行的数据完整性。这有助于防止可能导致无效数据的应用程序逻辑错误。

如果任何数据操作是直接在 SQL 中绕过应用程序逻辑进行的,它还可以防止破坏这些约束的不良数据。

另一个好处是它允许工具自动生成数据库图表,其中包含从模式本身推断出的关系。现在理论上所有图表都应该在创建数据库之前完成,但是随着数据库的发展超出其最初的化身,这些图表通常不会保持最新,并且从现有数据库生成图表的能力对双方都有帮助审查,以及向加入项目的新开发人员解释结构。

在数据库结构仍在变化时禁用 FK 可能会有所帮助,但是当模式更加稳定时,它们是很好的保护措施。

于 2012-04-16T23:39:41.300 回答
15

外键保证匹配的记录存在于外部表中。想象一个名为 的表在名为 的表Books上有一个 FK 约束Authors。保证每本书都有一个Author.

现在,您可以执行以下查询:

SELECT B.Title, A.Name FROM Books B
INNER JOIN Authors A ON B.AuthorId = A.AuthorId;

如果没有 FK 约束,丢失的Author行会导致整Book行被删除,从而导致数据集中的书籍丢失。

此外,使用 FK 约束,尝试删除至少被一本书引用的作者将导致错误,而不是损坏您的数据库。

于 2012-04-16T23:43:09.330 回答
5

虽然在处理开发/测试数据时它们可能会很痛苦,但它们在生产中为我省去了很多麻烦。

将它们视为维护数据完整性的一种方式,尤其是作为防止孤立记录的保护措施。

例如,如果您有一个将许多PhoneNumber记录与一个相关联的数据库Person,那么PhoneNumberPerson记录因某种原因被删除时,记录会发生什么情况?它们仍将存在于数据库中,但与Person它们相关的 ID 将不再存在于相关Person表中,并且您有孤立记录。

是的,您可以编写一个触发器以在删除PhoneNumberaPerson时删除 a ,但如果您不小心删除 aPerson并需要回滚,这可能会变得混乱。

是的,您可能记得PhoneNumber手动删除记录,但是您在 9 个月后编写的其他开发人员或方法呢?

通过创建确保 anyPhoneNumber与现有 相关的外键Person,您既可以确保不会破坏这种关系,也可以为预期的数据结构添加“线索”。

于 2012-04-16T23:50:50.823 回答
3

主要好处是数据完整性和级联删除。当它们被定义并且这些字段被正确索引时,您还可以获得性能提升。例如,您将无法创建不属于联系人的电话号码,或者当您删除联系人时,您可以将其设置为自动删除他们的所有电话号码。是的,您可以在您的 UI 或中间层中建立这些连接,但如果有人使用 SQL 而不是您的 UI 直接针对服务器运行更新,您仍然会遇到孤立的问题。“麻烦”部分只是迫使您在进行批量更改之前考虑这些联系。FK 救了我的培根很多次。

于 2012-04-16T23:44:54.183 回答