关于数据库要不要建立外键的讨论 —— 大部分不使用外键

为啥网上看到,说企业数据库设计一般不考虑外键,因为会影响性能

不用外键

1、使用外键,在删除数据和添加数据时,需要先后依赖,不够灵活,容易报错

2、使用外键,影响一定的性能,数据一致性的保证,可以用事务或者通过业务逻辑去保证。

我的项目没用过外键

一般来说,很少用,因为业务关联的数据太多,一旦外键关联,会出现像删除删不掉的情况。

企业不考虑外键的,自己的小系统倒是可以考虑用一下的。

最近做项目的时候在讨论表与表之间的关系是否需要建立外键约束, 

下面是我总结的一些优缺点,欢迎大家指导,帮忙分析一下到底使用哪种方式 

建立外键的好处: 

1) 由数据库保证数据完整性,比程序保证完整性更可靠, 

多应用时(如有应用A,B,C他们之间的实体存在关联关系),由程序来保证数据完整性变得困难 

2) 外键约束使得数据库的ER图可读性变强,有助于业务逻辑设计 

不建立外键的好处: 

1) 可以用触发器或应用程序保证数据的完整性 

2) 开发变得简单,维护数据时不用考虑外键约束 

3) 性能高,大数据量插入操作时不用考虑维护外键 

讨论结果:不建立外键约束,关联关系由程序控制,另外还需要删除现有的外键关系 

从面向对象设计的角度来看。是应该取消掉外键约束的。因为数据库的作用就是高校的存取数据。而不是表达业务逻辑关系。把业务逻辑关系放到数据库中来维护是一种非常面向过程的思维。使得程序设计,用例规则直接面向数据库而不是面向业务。怎么看都不是一种好的方式。

面向对象,不用太在意数据库中的是外键还是冗余,数据库只能反映对象的持久化属性和对象之间的强关联,关注的应该是对象关系的强弱,角色、人员等应该使用强关联(数据库外键),合同、发票等即使开票人离职了,记录依然有效的情况可以考虑弱关联(数据库冗余开票人信息) 

并且对象设计的好处是当你的数据库不再是关系型数据库时,你的修改成本会比数据库设计的要低太多

外键主要为了保持数据完整, 

如果不要外键 要保持完整要靠程序逻控制,而且数据存储各方的效率得到提高 

要的的话 可以从数据库角度严格控制数据完成性。 

到底要如何主要取决系统架构设计

外键还是有必要的,如果项目是基于数据驱动的,保证数据的完整有效性,尤为重要。但如果外键过于复杂出现嵌套类似现象对于编程来说也是比较痛苦,所以建议简单的外键约束。

既然是关系型数据库,表之间的外键关系还是要的。 

如果不考虑上面说上的查询性能问题,建立表关系和不建立对我们编程无影响。同时创建了关系还能保证数据的完整性,从这一点来说建立好点。另外,对于当前我们开发来说,可能觉得建立外键关系没必要,但是到了以后维护阶段,或升级阶段,如果没有这个关系,可能就会来了维护工作的提升。表关系的建立,也阐述着具体的业务逻辑关系,更增加了可读性。

如果 hibernate框架的 如果实体类用hibernate自动创建的那种 你会发现如果用了外键约束 会更新 不了数据 

其实没有必要用外键约束 ,这些逻辑可言通过程序控制的 

主要就是 用了外键约束在某些框架下会给你程序开发带来不必要的 麻烦, 

如果你不用hibernate这种框架的话 我觉得 用外键约束还是可以的 可以保证你数据的  合理性 避免因为你程序的漏洞而导致的数据冗余

有利于数据的完整所以应该

建立外键约束几乎很少遇到

如果你不需要参照完整性(数据不完整也没关系,或者不可能不完整,其他机制保证了) 

或者无法使用参照完整性(比如分表/分库) 

或者有其他机制保证参照完整性(比如在应用中搞定) 

或者参照完整性影响性能(大批量数据插入) 

那就没必要使用。否则,根据自己的需要考虑使用,我做项目中不使用外键也不没遇到严重的问题。个人观点,多多指正

个人觉得还是需要的。理由如下:

1、一般情况数据是最重要的,离开了数据,程序系统本身什么也不是,所以数据本身完整性更好。

2、数据全部由程序维护,程序万一不用了,down掉了,程序人员全换了,升级了等,谁也不能保证后续人马能跟以前人马一样懂,这时候如果有个完整的数据,关系也清楚,更能省事点。

3、程序维护数据容易出现程序bug导致数据有错误。什么都可以不对,但数据一定要对,要是我银行卡余额多了8个0,那敢情好了。 

纯属个人理解。

我与上边几位有些不同的观点,我觉得这和你项目使用的orm框架和业务复杂程度有关,如果使用的是hibernate这样的框架而且本身的业务不复杂,还是尽可能的在数据库中建立好关系,这样在编码以及理解业务的时候,会比较方便,如果系统是维护或者遗留项目,而且业务逻辑复杂,最好利用程序维护关系。

嗯,上次参加的那个项目就是没有用到外键约书,感觉各方面数据比较灵活,所以,上次我们自己做的时候也没有建立外键。而且,也遇到了别人的项目好久以前的数据,现在要处理,由于外键约束就是删除不了数据,而且也很难改。 

所以,还是不要建立外键了吧,不过各有利弊,还是根据实际的需求来做比较好

倾向于不建立外键

数据迁移,测试等等会造成很多麻烦. 

举个例子,想要清理3年前的数据,如果结构复杂,那真是痛苦啊. 

而且应该业务的信息不应该带到数据库中,在代码层次做好事务及原因注释. 

外键约束更大程度上是对数据完整性的约束

猜你喜欢

转载自www.cnblogs.com/Koaler/p/12080035.html