首页 新闻 会员 周边 捐助

无外键怎么保证数据完整性

0
悬赏园豆:15 [已解决问题] 解决于 2018-09-06 11:10

没有外键之后,如果删除了一条数据,那么所有相关数据全部都会出现问题。放弃外键,要怎么保证完整性,是要在删除之前查询是否有关联字段,有就不让删除吗,这样也太麻烦了,而且耦合度太高,尤其是再用个mybatis这种半自动框架,简直是加大开发难度。还是说在使用到相关数据的地方,如果发现关联数据不见了,就抛异常或者设置null,或者设置一个特殊值之类的呢

时光之书的主页 时光之书 | 初学一级 | 园豆:12
提问于:2018-09-06 09:23
< >
分享
最佳答案
0

如果没有外键,一般只能通过代码里的逻辑来保证数据的完整性。具体的比如使用事物 Transaction:把几个SQL更新,放到一个Transaction 里面,成功则提交(Commit),失败则回滚(Rollback),结果就是要么全部成功,要么全部失败,以此来保证完整性。

收获园豆:15
大豆男生 | 小虾三级 |园豆:608 | 2018-09-06 09:41

那没有外键的意义何在呢,做了和外键一样的事情,还增加了程序开发难度。用级联更新和级联删除不是可以轻松实现。感觉除了insert和部分update可以忽略外键而提升性能,加上数据库内容好删除,感觉其他地方比如删除,感觉没有什么好处。

时光之书 | 园豆:12 (初学一级) | 2018-09-06 09:51

@时光灬之书:
有外键约束对insert和update的性能方面确实有一定的影响,特别是记录数多的时候,所以现在一般都不推荐过多的使用外键。如果以后增加了相关联的表,修改代码也是在所难免,除了新增的一些逻辑,还需要在删除主键表记录的地方增加对新关联的表的删除(如果主键采用无意义的int类型主键,一般不存在修改主键的问题)。要不要外键各有利弊吧。我个人更倾向于,用代码维护数据的完整性,而不是靠外键。

大豆男生 | 园豆:608 (小虾三级) | 2018-09-06 10:18

@时光灬之书:
考虑到扩展性,分区表,甚至多数据库,也是不能靠外键维护数据的完整性的

大豆男生 | 园豆:608 (小虾三级) | 2018-09-06 11:01

@大豆男生: 嗯,那看来删除这块的业务逻辑写起来还挺复杂的,不能只是简单的掉个删除操作,还要考虑所有关联表的业务

时光之书 | 园豆:12 (初学一级) | 2018-09-06 11:07
其他回答(2)
0

删之前检查是否有关联数据,一块删了

徒然喜欢你 | 园豆:1741 (小虾三级) | 2018-09-06 09:35

那这工作量岂不是很大,而且一旦上百张表,要写多少删除方法,或者以后扩充了表关联到这个表上,又要修改这个地方的代码,而且要检索删除,这和数据库原本做的事情不是一样了?

支持(0) 反对(0) 时光之书 | 园豆:12 (初学一级) | 2018-09-06 09:39
0

现在的数据库设计都是强烈不建议使用外键,个人认为有以下几个原因:
1、使用外键之后,不同数据之间就有了依赖关系,而数据之间的关系应该由程序来决定比较合适,这样就比较适应业务变动和调整。
2、在数据量多了以后,数据库可能需要横向扩展,这样外键就反而变成了限制,显得不灵活。
3、使用外键来维持数据的完整性,可能令到某些事务处理时间过长,影响业务吞吐量,这样就不好拆分业务。

trustme326 | 园豆:391 (菜鸟二级) | 2018-09-06 10:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册