关于数据库不用外键的想法

      在上学时学习数据库要学习数据关系模型,知道需要通过关系模式中的主码和外码建立保证模型的完整性约束,保证数据的一致性和完整性。后来有作业要让做网页项目,需要自己建立数据库,我严格按照书中创建,那时表中创有一大堆外键利用SSH框架映射,因为关系模型设计不规范 从而简单的insert的语句插入都报错,费了很大的时间,后来了解的有同学根本就没创建外键,功能也能照样运行,那时又对外键需不需要创建感到疑惑,,,,现在刚接触公司第一个项目,看到它的大工程的数据库也没有外键,很是疑惑,。

      比如不创建外键会出现各种问题,例如:两个表  bill_head 和bill_detail 相当于单据的表头和表体,如果创建外键删除表头的单据相应改表头对应的表体也会被删除,但是没外键在下图可以看出,我在head表中删除了billid = 'SCO201805150001'的数据,但是在detail表该单据对应的详细信息还存在。

 

        bill_head 表                                      bill_detail 表

于是在网上查找了类似的问题,现在记录下来。下面是网上的看法:

正方观点:
1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢? 
2,有主外键的可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面

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

个人感觉要辨证的看待加不加外键的问题。。。

我还需要继续学习,希望能找到更好解决问题的方法。

你可能感兴趣的:(关于数据库不用外键的想法)