数据表设计为什么不用外键
作者:互联网
目前所负责公司的大部分系统里,数据表的逻辑结构设计都不使用外键约束,纳闷了,书上说外键约束不是很好的保护了数据完整性吗?
其实不以为然,下面看看为什么数据表逻辑设计不使用外键。
先看看某互联网大厂,在编程手册里写 “不得使用外键与级联,一切外键概念必须在应用层(代码)解决”
为什么会有这个规定?目前本人所在公司也有这规定(DBA会审核检视所有移交的DB脚本)。外键约束的存在,保障了数据完整性,一致性的同时,但是也带来性能和使用上的问题。
什么是外键? 数据表B表的主键是数据表A表的候选键,例如如下数据表
由图中两个关系表可见,外键card_id表示了两个关系实体的相关联系。外键约束的好处显然易见,例如对A表操作一个不存在的实体,那么就会报错,
同时删除A表一个实体,会同步删除对应B表的实体,这样保持了数据的完整性和一致性,把数据完整性和一致性交由数据库来控制和判断,减少了程序员的代码
开发量。
外键约束带来好处的同时,也有不少的缺点。例如以上的场景有高并发的时候,会出现严重的性能问题。因为每次操作数据的时候,数据库都要去判断关联表中
是否存在相应的数据,即使数据在逻辑上必然存在的。另外外键约束可能会导致死锁的问题。这里描述一下死锁发生的条件,“互斥”,“占用且等待”,“不可强占”,“循环等待”,四个条件缺一不可。还有如遇到系统扩展,需要分库分表的时候,会带来非常多的额外困难。
一切外键的概念在应用层(代码)解决
标签:数据完整性,不用,外键,约束,数据表,死锁,一致性 来源: https://www.cnblogs.com/yinzone/p/16372804.html