为啥网上看到,说企业数据库设计一般不考虑外键,因为会影响性能
不用外键
1、使用外键,在删除数据和添加数据时,需要先后依赖,不够灵活,容易报错
2、使用外键,影响一定的性能,数据一致性的保证,可以用事务或者通过业务逻辑去保证。
我的项目没用过外键
一般来说,很少用,因为业务关联的数据太多,一旦外键关联,会出现像删除删不掉的情况。
企业不考虑外键的,自己的小系统倒是可以考虑用一下的。
最近做项目的时候在讨论表与表之间的关系是否需要建立外键约束,
下面是我总结的一些优缺点,欢迎大家指导,帮忙分析一下到底使用哪种方式
建立外键的好处:
1) 由数据库保证数据完整性,比程序保证完整性更可靠,
多应用时(如有应用A,B,C他们之间的实体存在关联关系),由程序来保证数据完整性变得困难
2) 外键约束使得数据库的ER图可读性变强,有助于业务逻辑设计
不建立外键的好处:
1) 可以用触发器或应用程序保证数据的完整性
2) 开发变得简单,维护数据时不用考虑外键约束
3) 性能高,大数据量插入操作时不用考虑维护外键
讨论结果:不建立外键约束,关联关系由程序控制,另外还需要删除现有的外键关系
从面向对象设计的角度来看。是应该取消掉外键约束的。因为数据库的作用就是高校的存取数据。而不是表达业务逻辑关系。把业务逻辑关系放到数据库中来维护是一种非常面向过程的思维。使得程序设计,用例规则直接面向数据库而不是面向业务。怎么看都不是一种好的方式。
面向对象,不用太在意数据库中的是外键还是冗余,数据库只能反映对象的持久化属性和对象之间的强关联,关注的应该是对象关系的强弱,角色、人员等应该使用强关联(数据库外键),合同、发票等即使开票人离职了,记录依然有效的情况可以考虑弱关联(数据库冗余开票人信息)
并且对象设计的好处是当你的数据库不再是关系型数据库时,你的修改成本会比数据库设计的要低太多
外键主要为了保持数据完整,
如果不要外键 要保持完整要靠程序逻控制,而且数据存储各方的效率得到提高
要的的话 可以从数据库角度严格控制数据完成性。
到底要如何主要取决系统架构设计
外键还是有必要的,如果项目是基于数据驱动的,保证数据的完整有效性,尤为重要。但如果外键过于复杂出现嵌套类似现象对于编程来说也是比较痛苦,所以建议简单的外键约束。
既然是关系型数据库,表之间的外键关系还是要的。
如果不考虑上面说上的查询性能问题,建立表关系和不建立对我们编程无影响。同时创建了关系还能保证数据的完整性,从这一点来说建立好点。另外,对于当前我们开发来说,可能觉得建立外键关系没必要,但是到了以后维护阶段,或升级阶段,如果没有这个关系,可能就会来了维护工作的提升。表关系的建立,也阐述着具体的业务逻辑关系,更增加了可读性。
如果 用hibernate框架的 如果实体类用hibernate自动创建的那种 你会发现如果用了外键约束 会更新 不了数据
其实没有必要用外键约束 ,这些逻辑可言通过程序控制的
主要就是 用了外键约束在某些框架下会给你程序开发带来不必要的 麻烦,
如果你不用hibernate这种框架的话 我觉得 用外键约束还是可以的 可以保证你数据的 合理性 避免因为你程序的漏洞而导致的数据冗余
有利于数据的完整所以应该
建立外键约束几乎很少遇到
如果你不需要参照完整性(数据不完整也没关系,或者不可能不完整,其他机制保证了)
或者无法使用参照完整性(比如分表/分库)
或者有其他机制保证参照完整性(比如在应用中搞定)
或者参照完整性影响性能(大批量数据插入)
那就没必要使用。否则,根据自己的需要考虑使用,我做项目中不使用外键也不没遇到严重的问题。个人观点,多多指正
个人觉得还是需要的。理由如下:
1、一般情况数据是最重要的,离开了数据,程序系统本身什么也不是,所以数据本身完整性更好。
2、数据全部由程序维护,程序万一不用了,down掉了,程序人员全换了,升级了等,谁也不能保证后续人马能跟以前人马一样懂,这时候如果有个完整的数据,关系也清楚,更能省事点。
3、程序维护数据容易出现程序bug导致数据有错误。什么都可以不对,但数据一定要对,要是我银行卡余额多了8个0,那敢情好了。
纯属个人理解。
我与上边几位有些不同的观点,我觉得这和你项目使用的orm框架和业务复杂程度有关,如果使用的是hibernate这样的框架而且本身的业务不复杂,还是尽可能的在数据库中建立好关系,这样在编码以及理解业务的时候,会比较方便,如果系统是维护或者遗留项目,而且业务逻辑复杂,最好利用程序维护关系。
嗯,上次参加的那个项目就是没有用到外键约书,感觉各方面数据比较灵活,所以,上次我们自己做的时候也没有建立外键。而且,也遇到了别人的项目好久以前的数据,现在要处理,由于外键约束就是删除不了数据,而且也很难改。
所以,还是不要建立外键了吧,不过各有利弊,还是根据实际的需求来做比较好
倾向于不建立外键.
数据迁移,测试等等会造成很多麻烦.
举个例子,想要清理3年前的数据,如果结构复杂,那真是痛苦啊.
而且应该业务的信息不应该带到数据库中,在代码层次做好事务及原因注释.
外键约束更大程度上是对数据完整性的约束