数据库设计 -- 外键设计
- 外键的目的:通过数据库去保证数据的完整性,提高关联查询的效率
- 外键的副作用:插入或更新的效率下降。
为何说外键有性能问题
- 数据库需要维护外键的内部管理;
- 外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
- 有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
- 外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;
外键命名
- fk_业务:例如,注册业务,user表有一个外键,可以命名为,fk_user_register
- fk_当前表名_主表名:例如,登陆,user_session表有一个user_id外键,可以命名为,fk_user_session_user
该不该用外键
要用
通过数据库保证数据完成性。两个表关联查询很多的时候,并且数据量不大,可以不考虑插入或更新的效率时候。
例如:
- 软件应用的人数有限,换句话说是可控的;
- 数据库服务器的数据量也一般不会超大,且活跃数据有限;
可用,可以不用
可以忍受数据不完整性。或认为程序已经可以控制数据的完整性。
两个表关联查询很多的时候,但两个表的数据量不大或两个表关联查询很多,对查询效率不高,对插入或更新的效率要求高。
不用
两个表无任何逻辑关系,对插入或更新效率要求及高;或者有逻辑关系,但是可以通过中间业务层控制逻辑关系的,这样的扩展性更好。
例如:
互联网应用:用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;