`
dannyhz
  • 浏览: 366792 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

外键的必要性

    博客分类:
  • DB
 
阅读更多
引用



平常需要使用外键吗?
数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用

1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;
为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;



知乎的回答
https://www.zhihu.com/question/46739040


个人理解:多方面来考虑。不加外键肯定会提高性能,但是提升如何还得看具体场景。后台应用程序一般情况是可以做到满足外键的一些约束条件。但是极端情况,以及多团队多模块协作的时候,并不能保证这一点。数据一致性要求高,用外键业务逻辑比较复杂,团队,模块复杂,用外键数据量大,不用外键数据删除更改插入频率高,不用外键




我的数据库设计上基本不会用外键约束,关联关系交给程序处理,这样比较灵活


MySQL对外键支持不好,所以可以不加,但是数据库实体图上一定要画好。


学院派会告诉你在设计的时候把应该有的约束都加上
而实践派得出的结论是主键一定加,非空约束尽量加,外键最好依赖于程序逻辑,而不是数据库,从而更好的拥抱变化,快速响应,数据库也会有相对较好的性能
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics