MySQL - FK在Web应用程序中是否有用/可行?

yod*_*oda 3 mysql sql foreign-keys

我遇到过与FK和Web应用程序有关的讨论.基本上有些人说Web应用程序中的FK并不代表真正的改进,甚至可能在某些情况下使应用程序变慢.

你们有什么想法,你的经历是什么?

编辑:请注意,我知道FK的工作和目标,我只是不确定它们是否会对像youtube等网络应用程序的性能产生重大负面影响.

-

InnoDB引擎创始人,Innobase创始人兼首席执行官Heikki Tuuri的引述:

一旦更新了行,InnoDB就会检查外键,不会执行批处理或检查延迟到事务提交外键通常是严重的性能开销,但有助于保持数据的一致性

外键增加了行级锁定的数量,并且可以使它扩展到除了直接更新的表之外的许多表

Dan*_*llo 14

外键将保证表中order_details具有order_id引用表的字段的行orders永远不会具有表order_id中不存在的值orders.

外键不需要具有工作关系数据库,但它们对于避免破坏关系和孤立行(即参照完整性)绝对必不可少.是必需的在数据库级别实施参照完整性的能力ÇACID站.

至于您对性能的担忧,一般来说,性能损失(如果有的话)可以忽略不计.我建议你输入你所有的外键约束,如果你有其他你无法解决的真正的性能问题,只能在没有它们的情况下进行实验.

此外,作为附注,虽然与MySQL没有直接关系,但这引用了Microsoft模式和实践:第14章提高SQL Server性能:

当主键和外键在数据库模式中定义为约束时,服务器可以使用该信息来创建最佳执行计划.


Pad*_*ddy 9

保留您的外键 - 无论您为什么编写代码,它都能确保您的数据保持可用且预期的格式.除非你正在考虑严重的流量,否则我甚至不会考虑删除它们.


bob*_*nce 5

Web应用程序与任何其他类型的应用程序没有什么不同.当然,您可以通过省略数据完整性检查获得边际加速,但它不会很多,而且价格太高.

如果没有引用完整性,只要你获得一个悬空的外键(因为一些未经正确测试的代码路径或部分更新失败*),许多依赖于指向某个键的键的查询就会中断.这通常会使您的整个网站崩溃,直到您深入研究数据库并手动删除悬空参考.

(*:除非你正在使用交易.但是让我们面对现实,如果你是那种在没有参照完整性的情况下简化网页应用程序的作者,你也几乎不会使用交易.)


a_h*_*ame 5

除了这里提到的所有好理由(实际上没有理由不使用它们),还有另一个好的理由:

外键记录您的数据模型,使人们更容易理解它(这类似于cdonner提到的优势)