外键的利弊

来源:互联网 发布:数据采样 编辑:程序博客网 时间:2024/04/30 02:52
是否使用主外键是个问题,有很多人在学习的时候知道要用外键,而在进公司做项目时发现很多人不用外键,很不理解。

 

针对这个问题我进行了搜索和整理,总结如下:

 

外键的好处

(观点来自http://topic.csdn.net/t/20020304/09/553019.html

 外键的作用我认为主要有两个  
  一个是让数据库自己通过外键来保证数据的完整性和一致性  
  一个就是能够增加ER图的可读性  
  我觉得第二点的重要性甚至比第一点还高  
   
  有些人认为外键的建立会给开发时操作数据库带来很大的麻烦  
  因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败  
  他们觉得这样很麻烦  
  其实这正式外键在强制你保证数据的完整性和一致性  
  这是好事儿  
   
  应该说如果系统比较小  
  外键的作用可能不会很明显  
  如果你的系统后台有几百个表的话  
  没有外键的数据库设计是我无法想象的  
   
  有一个基础数据的表:商品  
  其他表都保存商品ID  
  查询时需要连表来查询商品的名称  
  单据1的商品表中有商品ID字段  
  单据2的商品表中也有商品ID字段  
  如果不拉出外键的话  
  当单据1,2都使用商品ID为3的商品后  
  删除此商品后  
  再查看单据1,2的时候就会查不到商品的名称  
   
  当表很少的时候  
  有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性  
  也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品ID为3的商品  
  但是当你写完脚本之后系统有增加了一个单据3  
  他也保存商品ID找个字段  
  如果不拉出外键  
  你还是会出现查不到商品名称的情况  
  你总不能每增加一个使用商品ID的字段的单据时就回去修改你检测商品是否被使用的脚本吧  
   
   
  第二点就是增加ER图的可读性  
  这也同样是在后台数据库表非常多的时候能够体现出来的  
  外键能够明确的两个表之间的关系  
  例如一个单据的主表和单据的商品的子表  
  如果两个表没有拉出外键表明关系,且两个表的位置在ER图中很远  
  对于一个对这个系统不是非常了解的人来说  
  让他去理出两个表之间的关系是很麻烦的  
  如果你拉出外键就算两个表离的很远  
  他也能随着外键找出他们之间的关系来  
  ER图的可读性对于一个刚刚接触大型系统的新手来说是极为重要的  
   
   
  当然  
  外键的个数也不是没有个尺度  
  因为外键拉的过多会使ER图极为混乱(到处都是线)  
  所以应该掌握合适的尺度才行  
  必要的外键必须要拉出来  
  如果实在不想因为外键过多而造成ER图的混乱  
  可以对基础数据的删除用假删除的办法  
  以避免在没有外键约束和检查的情况下造成数据的不一致性  

外键给数据库移植带来的问题

观点来自  http://jake007.javaeye.com/blog/365180

 

移植数据库时的几点发现
 

  今天在做SQL Serve到Oracle的数据库移植时发现了SQL Server和Oracle的两个很大的区别.

 

     1. SQL Server支持级联更新和级联删除. Oracle却只支持级联删除.

SQL级联删除与级联更新使用格式:
CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20))
CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)
ORACLE级联删除使用格式:
CREATE TABLE A001(ID INT PRIMAY KEY,NAME VARCHAR2(20))
CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE,AGE NUMBER(2,0))

 

oracle要实现级联更新可以用trigger实现.

 

参考http://blog.csdn.net/zjlme/archive/2008/07/25/2709278.aspx

 

     2. SQL Server的外键可以引用主键或唯一索引. Oracle却只支持主键.

    

这第二个区别直接导致移植数据库的时候出现全部的外键创建失败. 只能手动修改.  不过,有时不严格要求的话,不要外键反而是一种幸福,因为这样性能上可以提高不少.

 

 

b. 另外, 发现现在oracle把原来OMWB的功能集成到了oracle sql developer里面,但是使用起来并不如OMWB效果好. 可能是sql developer对sql server的移植功能还没完善. 但是omwb加sql server的plugin后进行移植很顺畅, 就算移植时出现错误, 也会显示在日志力而且信息很完整. 相比于sql developer移植老中断的情况感觉好多.

 

使用外键的其他问题

来自http://hi.baidu.com/hitc/blog/item/2bb1d2ef51d36f33acafd59f.html

2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!