[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
背景
目前很多公司都不考虑加入外键了,很多人工作中也不怎么使用外键了,毕竟每次做DELETE
或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
在笔者看来,在相应的场景下,如果使用的一个功能弊大于利,可能就不会选择了。所以是否使用外键取决相应的场景,也不可去完全抛弃外键。
为什么会很少使用外键呢?
目前使用外键确实存在一些不便,这也是大多数人不使用的原因所在。我具体总结了会存在这么几个原因:
1、增加数据库压力
外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增、删、更新操作之后,需要触发相关操作去检查,而不得不消耗资源。
2、死锁问题
若是高并发大流量事务场景,使用外键还可能容易造成死锁。
3、开发不方便
有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素。
4、数据刷库
实际开发过程中,免不了要经常刷库,导入或删除数据,外键的存在会让表删除或插入失败(表数据变更有顺序要求)。
5、外键维护
随着项目的迭代,表之间的关系也会发生变化,比如有个外键需要删除;或是要新增一个外键,但由于现有数据不准,导致外键加不上去,久而久之,ER图也不能完整的显示表关系,这ER图看还是不看?
外键真的就没有用了吗?
存在即合理,每一个产品,每一个功能既然存在,在某些地方也是存在优势的。笔者总结了一下外键的几个优势点:
1、数据库的一致性
由数据库自身保证数据一致性、完整性会更可靠,程序很难100%保证数据的一致性、完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
2、ER图可靠性
有主外键的数据库设计可以增加ER图的可读性(也有特别的公司产品特别注重的这一方面)。
总结
1、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键,如学校的,保证数据的一致性与完整,基数也不大。
2、如果为了高并发,分布式,使系统性能更优,以及更好维护,则不要去使用外键。