我对外键的大量应用 -- 两个凡是

宏哥 发布于 2016/11/23 10:53
阅读 1K+
收藏 2

码农间有一种流行的说法, 尽量不用外键......

但是这些没有脑子的码农,没有一个能说清为什么....

两个凡是在系统当中大量应用外键, 原因如下:

1: 外键对查询性能没有负面影响..

2: 任何数据的检查, 程序里面吧数据拖出来, 再检查性能极其低下, 而且错误百出.  在数据库做这种检查, 效率高, 质量高.. 省去大量的时间校对数据质量.

当然, 码农普遍没有脑子, 无法理解两个凡是..

如果不用外键, 有个理由的话, 那就是, mysql 不是数据库 -- 他们都用mysql..

加载中
4
dy810810
dy810810
看到楼主还在数据库上跟水友干仗,我就放心了。
3
eechen
eechen
ON DELETE CASCADE  级联删除(删除主键表student表里记录时,外键表score里对应的记录会跟着删除,默认)
ON UPDATE CASCADE  级联更新(更新主键表student表里记录时,外键表score里对应的记录会跟着更新)
ON DELETE RESTRICT 限制删除(删除主键表student表里记录时,如果外键表score里存在对应的记录时会被拒绝)
ON UPDATE RESTRICT 限制更新(更新主键表student表里记录时,如果外键表score里存在对应的记录时会被拒绝)
ON DELETE CASCADE 和 ON DELETE RESTRICT 是冲突的,不能同时使用.
ON UPDATE CASCADE 和 ON UPDATE RESTRICT 也是如此.
删除和更新受到限制约束(RESTRICT)时,需要先删除外键表score里的记录,再删除主键表student里的记录.
感觉外键约束像是通过触发器实现的.

且不说每次UPDATE/DELETE给数据库带来额外的逻辑压力.
如果RESTRICT这种限制类型的外键约束太多,你删一条记录就得先手动删掉其他相关记录,是不是显得很麻烦.
如果CASCADE 这种级联类型的外键约束太多,你删一条记录系统会自动删掉其他相关记录,但可能有一些记录你不一定要删.
总而言之,外键约束像一把双刃剑,用不到位会反而会伤到自己.
快速开发师
快速开发师
呵呵,可以这样简单理解:因为一个局部出了问题,就把整个给删了,因此想弱弱地问一句宏哥和e神,是delete整个记录还是置外键字段null,实在是很久没用过外键了?
春药之王
可以看出,换个业务的话,宏哥的开发维护成本比我们要高几倍,并且质量上没有有意义的优势
2
tonysb
tonysb
你真的越来越像是OSCHINA的一个小丑了,发帖就是为了给我们带来欢乐
1
dy810810
dy810810

引用来自“dy810810”的评论

看到楼主还在数据库上跟水友干仗,我就放心了。

引用来自“宏哥”的评论

你还在搞mysql ?

这么多年过去了

坚持两个凡是的, 最差也上了几个台阶了

该反省了

从早年mysql3 pgsq7 oracle8i到现在的最新版本一直都在用,根据项目实际应用需求来定。数据库选型和使用早已不是项目的核心因素。

数据库只不过是数据持久化的一种方式。这一点,懂的人自然会懂。

1
放牛娃1988
放牛娃1988

我很好奇,是不是mysql的开发人员给宏x戴了绿帽子?

0
qgymje
luokery
luokery
我也不理解, 为什么不用外键。 个人觉得他们删除的时候删不掉把。怕麻烦?
0
游客
游客
但愿你是对的
0
百世经纶之傲笑红尘
百世经纶之傲笑红尘
eechen PK 宏哥,大伙买谁会赢?
0
宏哥
宏哥

引用来自“百世经纶之傲笑红尘”的评论

eechen PK 宏哥,大伙买谁会赢?

我已经搬新办公楼了

你可以考虑来面试了. 


0
雨翔河
雨翔河

宏哥拿着一把ak47带对内方向的刺刀在突突突,搞不好那刺刀久怼心脏上了。

返回顶部
顶部