如果没有外键,一般只能通过代码里的逻辑来保证数据的完整性。具体的比如使用事物 Transaction:把几个SQL更新,放到一个Transaction 里面,成功则提交(Commit),失败则回滚(Rollback),结果就是要么全部成功,要么全部失败,以此来保证完整性。
那没有外键的意义何在呢,做了和外键一样的事情,还增加了程序开发难度。用级联更新和级联删除不是可以轻松实现。感觉除了insert和部分update可以忽略外键而提升性能,加上数据库内容好删除,感觉其他地方比如删除,感觉没有什么好处。
@时光灬之书:
有外键约束对insert和update的性能方面确实有一定的影响,特别是记录数多的时候,所以现在一般都不推荐过多的使用外键。如果以后增加了相关联的表,修改代码也是在所难免,除了新增的一些逻辑,还需要在删除主键表记录的地方增加对新关联的表的删除(如果主键采用无意义的int类型主键,一般不存在修改主键的问题)。要不要外键各有利弊吧。我个人更倾向于,用代码维护数据的完整性,而不是靠外键。
@时光灬之书:
考虑到扩展性,分区表,甚至多数据库,也是不能靠外键维护数据的完整性的
@大豆男生: 嗯,那看来删除这块的业务逻辑写起来还挺复杂的,不能只是简单的掉个删除操作,还要考虑所有关联表的业务
删之前检查是否有关联数据,一块删了
那这工作量岂不是很大,而且一旦上百张表,要写多少删除方法,或者以后扩充了表关联到这个表上,又要修改这个地方的代码,而且要检索删除,这和数据库原本做的事情不是一样了?
现在的数据库设计都是强烈不建议使用外键,个人认为有以下几个原因:
1、使用外键之后,不同数据之间就有了依赖关系,而数据之间的关系应该由程序来决定比较合适,这样就比较适应业务变动和调整。
2、在数据量多了以后,数据库可能需要横向扩展,这样外键就反而变成了限制,显得不灵活。
3、使用外键来维持数据的完整性,可能令到某些事务处理时间过长,影响业务吞吐量,这样就不好拆分业务。