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

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

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

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

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

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

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

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

谢不吝赐教。

25013 次点击
所在节点    程序员
117 条回复
SpicyCat
2016-11-22 14:44:44 +08:00
没有设计过数据库,比较好奇完全不用外键的数据库怎么搞。就拿课本上的例子来说吧,一个选课系统,有学生信息,课程信息,还有选课信息。学生信息和课程信息可以没有外键,是独立的,那选课信息怎么搞?
xgfan
2016-11-22 14:47:15 +08:00
@SpicyCat 存学生和课程的 id 啊。
windowsma
2016-11-22 14:48:21 +08:00
约束一般在逻辑里实现。
SpicyCat
2016-11-22 14:50:25 +08:00
@xgfan 那不是有外键了?
slowindy
2016-11-22 14:54:18 +08:00
@SpicyCat 说的是不在数据里设置外键,而是通过逻辑关联来实现外键
BakCshi
2016-11-22 14:54:41 +08:00
@SpicyCat 那个是中间表
ljk
2016-11-22 14:54:59 +08:00
@windowsma 所以新浪的数据库也是不用外键的?
tabris17
2016-11-22 14:58:00 +08:00
对数据一致性要求不严格的场景都不应该使用外键
xrlin
2016-11-22 14:59:00 +08:00
外键会用,但约束在程序逻辑中实现。
helloccav
2016-11-22 14:59:13 +08:00
除了大学学数据库的时候了解过外键,工作几年来写代码从来没用过外键
ljk
2016-11-22 15:00:05 +08:00
@tabris17 请问理由?
windowsma
2016-11-22 15:01:29 +08:00
@ljk 企业内应用一般会用外键、触发器、存储过程等,互联网服务很少用,维护起来复杂。目前数据库能用到的约束也就是唯一索引了。
ljk
2016-11-22 15:01:45 +08:00
@xrlin 外键用了,自然有约束了。为什么你还要在程序逻辑中实现约束呢?
ljk
2016-11-22 15:05:01 +08:00
@windowsma 请问不使用外键的话,数据库里出现的一些垃圾数据,比如一些"外键"指向不存在的记录,怎么处理?定时执行脚本清理吗?
tabris17
2016-11-22 15:06:11 +08:00
@ljk 理由就是不要“作”
tabris17
2016-11-22 15:06:31 +08:00
@ljk 人生苦短,不要作
allenhu
2016-11-22 15:08:55 +08:00
@ljk 如果出现你说的垃圾数据,那是代码逻辑有问题,比如,你删除记录的时候,忘记删除某些关联的数据
hyuwang
2016-11-22 15:10:31 +08:00
性能啊
这都分布式了 当然不考虑外键
外键本身是为了实现强一致性 跟大规模并发和分布式都是冲突的

我觉得完全取决于架构如何设计
一些对性能没追求或者数据极其重要,可靠性要求高的业务外键是不可少的
windowsma
2016-11-22 15:18:00 +08:00
@ljk 额,你这是有数据库数据洁癖啊~~也没有绝对的舍弃外键,像金融、供应链等场景还是需要优先保证数据完整性的。不过在互联网业务场景下,会尽量减少连接查询,降低表之间的逻辑耦合,当所谓的外键记录不存在时,指定默认值或者直接报错。
ljk
2016-11-22 15:19:24 +08:00
@hyuwang 多谢赐教。

再问一下,如果不使用数据库外键,程序中想在插入一条记录时验证某个"外键"是否合法有效,一般的做法是怎样?

是先做一次 sql 查询外键有有效性,再做一次 sql 插入?抑或是一句 sql 把校验和插入给完成了?

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

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

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

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

© 2021 V2EX