系统集成数据库外键

是否有必要使用外键?为什么不用外键?

正方(需要)

     1.数据一致性
     由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
     eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?

     2.ER图可靠性
     有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。

     3.使设计更全面
     外键在一定程度上说明的业务逻辑,会使设计周到具体全面

     4.级联性能未必最低
     除非能证明触发器的性能和可维护性比外键更优,否则凭什么一定要否定外键呢?
   
     5.程序能完全保证安全性吗?
     使用应用程序来维护数据完整性,则是严重降低数据库安全性的一种做法。连接字符串里如果有uid和pwd或者类似的这两个东西,可以使用工具获取你数据库的帐号。因为每次建立数据库联接的时候都会在网线上以标准格式传递这些信息。从此编码内的任何保证都是空的。

     6.导致冗余
     不使用外键,会导致数据冗余,在级联最底层的表可能会重复好几层的数据 必然导致最底层的表数据量翻倍,IO瓶颈是数据库性能瓶颈之一。

_____________________________________________________________________

反方(不需要)
   
   1.程序逻辑
      某些程序逻辑中,程序的逻辑已经足够保证完整性,我会在存储过程或包等地方做严谨的判断;

   2.性能问题
   这是很多人不喜欢用的关键原因,比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很常,虽然外键指向的关联表的字段肯定是索引,但是我觉得很多时候,这样的判断本来就在程序里控制好了,通过外键再判断一次,就是降低性能;而且其实有的地方判不判断也无所谓的,但是用了外键,就必须化时间去判断,无论oracle内部多么优化外键对于数据的检索速度,它总是一个不小的消耗;

   3.维护麻烦
  很多公司的软件都是定制的,这种定制的东西,随意性相对较大,项目开发实施过程中,需要经常对表修修补补;还有就是业务逻辑有bug或者其他情况,需要经常手工维护数据,有错综复杂的外键关联着,很是麻烦;

    4.外键定死了先后生成关系
    外键定死了两个表之间数据的先后生成关系,最常见的是单据主从表,有的时候,在生成单据的时候,是先生成明细,再生成主表;如果钉死了外键,这个就没法实现;

     PS: 当然有些关键的业务,确实需要外键;
参与4

4同行回答

kaka101000kaka101000软件实施顾问浪潮
学习了。显示全部
学习了。收起
IT咨询服务 · 2014-12-31
浏览940
新数科技新数科技IT顾问北京新数科技有限公司
关系型理论很完善,但实际使用时还是需要从业务角度考虑。如果本身业务很复杂,使用外键就不合适,应靠应用保持完整性,但如果业务都在数据库中,且比较简单,可以考虑使用外键。外键使用的好可以减轻应用端检查的压力,使用不好就很苦恼。因此,需要看具体场景了。...显示全部
关系型理论很完善,但实际使用时还是需要从业务角度考虑。如果本身业务很复杂,使用外键就不合适,应靠应用保持完整性,但如果业务都在数据库中,且比较简单,可以考虑使用外键。外键使用的好可以减轻应用端检查的压力,使用不好就很苦恼。因此,需要看具体场景了。收起
IT咨询服务 · 2014-12-31
浏览936
苏州易博创云苏州易博创云CTO苏州易博创云网络科技有限公司
说到底,外键仅仅约束了数据之间的主次关系,但是数据是由业务产生的,数据之间的主外键关系应由业务逻辑去保障是比较合理的,所以很多的大型的应用系统都不建议在表级创建外键。显示全部
说到底,外键仅仅约束了数据之间的主次关系,但是数据是由业务产生的,数据之间的主外键关系应由业务逻辑去保障是比较合理的,所以很多的大型的应用系统都不建议在表级创建外键。收起
IT咨询服务 · 2014-12-29
浏览948
新数科技新数科技IT顾问北京新数科技有限公司
数据库级的外键影响性能,而且缺乏通用性,用应用程序直接控制更灵活。比如 SAP 这样大型应用程序,在数据库级都没有外键。SAP去掉数据库级的外键约束,是将这种约束关系的维护工作从数据库层转移到应用层(SAP服务器上),是系统整体性能上考虑的。是因为随访问量的增加,可以扩充应...显示全部
数据库级的外键影响性能,而且缺乏通用性,用应用程序直接控制更灵活。
比如 SAP 这样大型应用程序,在数据库级都没有外键。
SAP去掉数据库级的外键约束,是将这种约束关系的维护工作从数据库层转移到应用层(SAP服务器上),是系统整体性能上考虑的。是因为随访问量的增加,可以扩充应用层,进行集群等,以前在数据层去做集群很困难,所以这么做尽可能的减少数据库的压力(外键约束的校验消耗数据资源),使数据库只做数据的存取,尽量减少其他运算(外键约束校验、数据库级的存储过程、自定义函数等)。收起
IT咨询服务 · 2014-12-29
浏览917

提问者

ce97
ce974612
软件开发工程师某某某
擅长领域: 数据库大数据中间件

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2014-12-29
  • 关注会员:0 人
  • 问题浏览:12311
  • 最近回答:2014-12-31
  • X社区推广