本人前端,最近在学 mysql。
今天问同事关于外键问题,他说最好不要用外键,查询慢。。(他比较忙,我就没打扰他了)
这里想问问大佬们:
- 不用外键 就不知道子表、主表的关系,ER图是不是就废了。在维护上是不是就变的困难了(如果有新人进来,看到表里有外键就知道跟谁关联)。
- 还有 如果没有外键关联 增删改查相较于有外键有什么要注意的地方?
本人前端,最近在学 mysql。
今天问同事关于外键问题,他说最好不要用外键,查询慢。。(他比较忙,我就没打扰他了)
这里想问问大佬们:
外键不会造成查询慢,但会造成插入更新删除变慢,但这也不是主要理由。
我了解的不用外键是因为外键会造成很多麻烦。如:数据导入导出备份恢复必须遵循一定顺序, 如果有自关联的外键数据也要遵循一定顺序。有时多表循环引入外键,顺序也帮不上忙。这时通常是要把外键检查停掉,导完再开启。
类似这种三明治的方式:
SET FOREIGN_KEY_CHECKS=0;
-- do something
SET FOREIGN_KEY_CHECKS=1;
但很多语言框架下并不自动支持这种方式,加上使用连接池,回调等方式,并不直接用数据库连接,造成想每次都支持这种方式都很麻烦。加上这种方式本身也是和数据库耦合的,难以移植,所以慢慢的就不用了。程序员们更喜欢用语言代码控制一切,而不是和数据库较劲,所以类似存储过程和数据库函数很多人也不用,虽然使用的好处是显而易见的。
业务层面上, 很多数据是通过标志位来决定的显示不显示, 物理删除用得不多,级联更新和级联删除带来的好处也不大。有时还可能起副作用(性能低,需要锁定大量记录等)。
外键保证了数据一致性,缺点是更新(增删改)慢(并不是查询慢),在大型系统中对性能要求极致,而一致性又有其它手段保证,所以慢慢就比较少人用外键。其实在中小系统中外键不失为一个好的选择。
ER图是你的设计,就是用来确认你真实的表关联的,就好比一个好的概要设计,会使维护更简单,并不是靠看代码。
用了外键,增删改时如果有破坏一致性,操作会报错。不用的话,就靠人工(或者框架、中间件)判断,需要增加事务保证一致
15 回答8.4k 阅读
5 回答4.8k 阅读✓ 已解决
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
曾经我也推崇使用外键进行约束,因为其在 MySQL 管理工具中,可以方便快捷的定位到关联的表,当对数据进行删除操作时也能做到同步,但是在实际使用过程中,同事间沟通和业务业务间,总是瞬息万变,外键可以带来的坑有很多,包括就不限于事务、数据保全。
如果你不熟悉外键约束会遇到的各种问题,其实使用程序去做外键做的事情是更佳的选择。
当然,我也建议你去尝试,因为只有多踩坑才会有提升。