是什么理由让你彻底抛弃数据库的外键?

2016-11-22 14:28:29 +08:00
 ljk

初涉后台开发未深,诚惶诚恐看 <SQL 反模式>,学习最佳实践。

发现现在这个项目应用了不少反模式,其中最让我困惑的是,完全不使用外键,涉及到外键的逻辑全部在应用代码里实现。

询问项目负责人,告知不使用数据库外键主要有两原因:

  1. 多台服务器不停机升级时,有可能数据库新加入的外键限制导致新程序没办法在旧数据库上跑
  2. 运维人员对数据库外键深恶痛绝(举例说唯品会就是这样做的)

听起来只要是分布式的服务器热升级(第一点原因)、或者团队里有运维人员,就应该抛弃数据库外键了。

业界都是这样做的吗?书上说的当真脱离了实际?

谢不吝赐教。

25569 次点击
所在节点    程序员
117 条回复
duola
2016-11-23 00:50:53 +08:00
@wind3110991 这是不是所说的 中间表 呢?
feather12315
2016-11-23 01:04:29 +08:00
@wind3110991 这是数据库设计的问题,删除异常。并不是外键的锅
vibbow
2016-11-23 01:31:24 +08:00
ifhwhlwpto
2016-11-23 03:09:02 +08:00
@sunsh217 跟中国的教科书有什么关系,国外的教科书难道就不教你规范?
beidouxun
2016-11-23 03:39:40 +08:00
@wind3110991 删除 b 班级肯定把关联此班级学生表的外键清空!等待分配班级!程序的问题!
q397064399
2016-11-23 05:41:46 +08:00
realpg
2016-11-23 08:04:51 +08:00
@ljk 合格的程序根本不会出现这种情况
我公司曾开除多次搞出这种问题的程序员
ebony0319
2016-11-23 08:20:50 +08:00
我觉得外键大多数存在于教科书。实际项目中比较少(基本上不用)外键,主要是表多了不好维护。用一定的存储过程,一定的视图等。很少在数据库中(至少在我见到的十几万行 sql 中)使用控制流语句。数据库不适合干复杂的事情。
sunsh217
2016-11-23 09:06:25 +08:00
@ifhwhlwpto 国外就没有教科书一说
ren2881971
2016-11-23 09:08:08 +08:00
因为 drop 的时候太麻烦。。。
wupher
2016-11-23 09:09:11 +08:00
除非小项目,基本不使用外键。外键关系使用程序代码来维护,在数据库中不体现。

后期如果需要数据清理,数据调整时,有外键关系(尤其是复杂的外键关系)会造成表数据非常难以修改、维护。
bi168
2016-11-23 09:58:32 +08:00
外键确实在实际生产环境中比较少用,一般都在程序中实现逻辑 避免维护修改数据的复杂性
barbery
2016-11-23 10:02:18 +08:00
唯品会的确是不允许外键, db 变更如果有外键的话, 99.9%是要被驳回的。。。原因的话,我猜想是互联网企业,性能优先,使用物理外键的话,以后分表分库都会有问题。
iyangyuan
2016-11-23 10:03:12 +08:00
逻辑层面统一,物理层面分离,保障以后的可伸缩性
bi168
2016-11-23 10:11:12 +08:00
确实一方面给性能带来负担,一方面在交易系统中,删除数据就会自动删除外键数据,这个也会经常出现问题。
关于数据库,数据仓库、大数据、数据分析的问题,我这有个社区 www.bi168.cn 欢迎大家多多交流
nandaye
2016-11-23 10:13:01 +08:00
有的主键都不要得,不奇怪,看你的应用场景了
blacklee
2016-11-23 12:05:07 +08:00
在 2016 年这个节点,我觉得更早的 2006 年就差不多可以这么说了:

数据库使用外键,属于教条主义!
fortunezhang
2016-11-23 13:46:30 +08:00
从来没有用过外键:)
killerv
2016-11-23 14:03:43 +08:00
我觉的业务逻辑最好还是写在代码中,外键约束有时候不够灵活,排查问题也不方便
Balthild
2016-11-23 14:57:52 +08:00
@sunsh217 有一個英文單詞叫做 textbook

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/322370

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX