为什么大多数项目的数据库都取消外键了(外键取消原因)
弹指间bug灰飞烟灭 2020-05-26 14:03:02 458 收藏 1
分类专栏: 数据库 文章标签: 数据库
版权
数据库外键
如果一个字段a在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段a称为表二的外键;
主键表和外键表的理解
(1)以公共关键字(也就是两张表共有的字段)作主键的表为主键表(父表,主表)
(2)以公共关键字(也就是两张表共有的字段)作外键的表为外键表(从表,外表)
外键的作用
主键保证了数据的唯一性,外键保证了数据的完整性。
主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
以上是对数据库外键简单的概括,但是我们会发现,其实真正在互联网企业中工作的时候,往往项目中的数据库很少用到外键(物理外键),大多数用到的都是(逻辑外键)至于为什么主要有以下几点。
大并发的时候会对性能造成影响
外键就想其他类型的索引一样,性能方面的影响,主要是写入操作(比如,UPDATE/INSERT/DELETE),但是它与单表索引不同的是,它会引用一张或多张父表,这样当对子表进行写入操作(UPDATE/INSERT)的时候,父表就会被加上“共享锁”,这样在对子表高并发进行写入操作的情况下,对父表的写入操作就会由于“共享锁”的存在,而会长时间不能得到更新!当然查询是可以的,但是企业中大多数项目都是有一定的并发量的,所以在选择的时候,大多数还是取消了物理外键的约束。
项目无法支持热更新(也就是不停机去进行维护)
分布式的项目,绝大多数都需要热更新的,热更新就是不停机去进行维护。不管是互联网产品,还是一些游戏 手游。大多都会采用热更新的方式。如果数据库有外键,可能会造成新更新的代码 无法运行。 因为要匹配现有的外键,可能要重启服务器。那么这样就达不到热更新的目的了。因为外键是强力执行的。注意点和分布式绝对是冲突的。
为了降低耦合度
删除了外键,并不是我们不要外键,而是物理的外键,物理的这一层关系我们不需要了。但是逻辑上的话,这样的外键还是存在的。这样子适当的降低了表和表之间的耦合度。
后期很难进行分库分表操作
项目中如果数据库表不多还好说,如果说我们的数据库有上百张表甚至上千张表的时候,有几十个外键甚至几百个外键以及更多关联。这个时候分库分表该怎么做呢,真的是难以进行,难以去实现。所以如果一个互联网项目在前期没有做到很好的控制,无法控制我们的外键关系。当业务上来以后。物理的外键一定会让运维人员欲仙欲死,所以很多的架构师 数据库DBA 都会弃用数据库的外键。
总结
如果你设计的是传统的小型项目的话,物理的外键存不存在都可以 。
如果你设计的是一个互联网项目,或者是一个大型项目的时候,我们是绝对不能用数据库外键的,一定要为以后的架构多多考虑。