数据库建表,该不应使用外键?

  最近学习过程当中,产生了一个疑问,到底该不应使用外键?
  不能本身瞎想,为此,去了知乎,搜索相关话题,总结出下面内容。

 
一:使用外键
优势:
(1)实现表与关联表之间的数据一致性;
(2)能够迅速的创建一个可靠性很是高的数据库结构,而不用让应用程序层去作过多的检查;
(3)能够提升系统鲁棒性、健壮性;
(4)能够实现开发人员和数据库设计人员的分工;
 
  缺点:
(1)数据库须要维护外键的内部管理;
(2)外键等于把数据的一致性事务实现,所有交给数据库服务器完成;
(3)有了外键,当作一些涉及外键字段的增,删,更新操做以后,须要触发相关操做去检查,而不得不消耗资源;
(4)外键还会由于须要请求对其余表内部加锁而容易出现死锁状况;
(5)容易出现数据库I/O的瓶颈;
 
 
 
二:不使用外键
优势:
(1)减小了数据库表与表之间各类关联的复杂性;
(2)牺牲应用服务器资源,换取数据库服务器的性能;
(3)将主动权把控在本身手里;
(4)去掉外键至关于优化数据库性能;
 
  缺点:
(1)全部外键的约束,须要本身在逻辑层本身实现;
(2)会出现数据错误覆写,错误数据进库的状况;
(3)消耗了服务器的性能;
(4)业务层里夹带持久层特性,耦合;
 
 
总结:
1. 互联网行业: 不推荐使用外键。
    理由:1)用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤为受IO能力限制,且不能轻易地水平扩展;
       2)如果把数据一致性的控制放到事务中,即让应用服务器承担此部分的压力;
          3)应用服务器通常都是能够作到轻松地水平的伸缩;
 
  2. 传统行业: 可使用。
  理由:1)软件应用的人数有限,换句话说是可控的;
        2   数据库服务器的数据量也通常不会超大,且活跃数据有限;
 
相关文章
相关标签/搜索