背景
目前很多公司都不考虑加入外键了,很多人工作中也不怎么使用外键了,毕竟每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
在笔者看来,在相应的场景下,如果使用的一个功能弊大于利,可能就不会选择了。所以是否使用外键取决相应的场景,也不可去完全抛弃外键。
为什么会很少使用外键呢?
目前使用外键确实存在一些不便,这也是大多数人不使用的原因所在。我具体总结了会存在这么几个原因:
1、增加数据库压力
外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增、删、更新操作之后,需要触发相关操作去检查,而不得不消耗资源。
2、死锁问题
若是高并发大流量事务场景,使用外键还可能容易造成死锁。
3、开发不方便
有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素。
4、数据刷库
实际开发过程中,免不了要经常刷库,导入或删除数据,外键的存在会让表删除或插入失败(表数据变更有顺序要求)。
5、外键维护
随着项目的迭代,表之间的关系也会发生变化,比如有个外键需要删除;或是要新增一个外键,但由于现有数据不准,导致外键加不上去,久而久之,ER图也不能完整的显示表关系,这ER图看还是不看?
外键真的就没有用了吗?
存在即合理,每一个产品,每一个功能既然存在,在某些地方也是存在优势的。笔者总结了一下外键的几个优势点:
1、数据库的一致性
由数据库自身保证数据一致性、完整性会更可靠,程序很难100%保证数据的一致性、完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
2、ER图可靠性
有主外键的数据库设计可以增加ER图的可读性(也有特别的公司产品特别注重的这一方面)。
总结
1、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键,如学校的,保证数据的一致性与完整,基数也不大。
2、如果为了高并发,分布式,使系统性能更优,以及更好维护,则不要去使用外键。