大家设计数据库时使用外键吗?

今天在思考权限管理的时候,突然想到这个问题。设计数据库时候要使用外键么?在实验室的项目过程中在db这个层面我都是没有使用外键关联的,而是在上层做了一层事务。而标准的RBAC的权限控制是在db在这层面做了外键关联?那到底需不需要外键关联呢?什么时候需要外键关联呢?本人才疏学浅,只能借助于google大帝了。

以下回答转自于知乎

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:

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

2.传统行业
1>.软件应用的人数有限,换句话说是可控的;
2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;

综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

自己总结了一下各位大神的回答,大概的思想就是:

db的外键关系相当于是在数据的最底层做了一层约束,在互联网时代,面向Web的应用完全可以在Brower端完成事务等外键实现的功能,这样反而更加灵活。本人db门外汉一个,以后有机会在补充,这里纯记录用,勿喷。。。

原文地址:https://www.cnblogs.com/babybluevino/p/3843269.html