请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,请问一下为什么不用外键呢?

这里用户表的部门ID  不是用外键关键起来比较好吗  如果用户表插入了一个不存在的部门id,这样就能出现问题了

正在回答 回答被采纳积分+3

2回答

huangaiguo 2018-11-12 21:42:18

数据库 提供的主外键关系就没用了?   能否解释下 ,  主外键的用处

0 回复 有任何疑惑可以回复我~
  • Jimin #1
    现在一般很少做外键了,之前一些设计里有外键,是要保证数据的完整性,其实这个通过业务层就可以避免,而且不需要浪费数据库性能
    回复 有任何疑惑可以回复我~ 2018-11-12 22:08:56
  • 这么说 以后做数据库设计 ,这种主外键约束就不考虑了
    回复 有任何疑惑可以回复我~ 2018-11-14 00:02:36
Jimin 2018-06-29 17:29:44

你好,目前我们开发习惯是通过业务上做关联,而不是建立明确的外键。比如用户表虽然存储了部门的id,但是并不会建立针对部门表的id的外键关联。这里考虑的原因很多,举几个来说一下。

1、外键本身会消耗一些性能,也会消耗一定空间,对一个表的操作也将变得很复杂。

2、每一个更新操作都会带来额外的检查,而这些检查通常你在业务端也会保证,比如你这里提到的如果用户表插入了一个不存在的部门id,那么在插入到数据库之前,程序应该检查出来并且阻止才对。在数据库里通过外键可以完全避免,但是业务端可以通过一些检查避免出现这些情况,毕竟数据库层已经是个单点,可以提高性能的地方我们都会有所考虑。

3、如果一个表数据量增长很快,需要做分表和分库,这个外键处理起来很麻烦

4、如果涉及到数据迁移及删除时,外键可能会带来许多不必要的麻烦

至少在我们看来,外键带来的好处,我们可以通过业务端检查来达到相同的目的。


0 回复 有任何疑惑可以回复我~
  • 提问者 科比么么哒 #1
    好的,谢谢老师,解决了我很久了困扰
    回复 有任何疑惑可以回复我~ 2018-06-29 18:17:46
  • 老师,如果有一张表的数据内容比较杂,可能包含人员表的信息+部门表的信息+其他业务表的信息等等,这种时候我们是直接在这张表里设计这些用到的表的主键就行,还是把我们用到的数据直接给存进来,让数据‘冗余’,因为这样可能查询的时候只需要查询这一张表就好,而如果只记录其他表的id的话,查询的时候就得关联查询,查询速度会慢把,老师有什么建议吗?不知道自己表达到不到位
    回复 有任何疑惑可以回复我~ 2018-09-04 15:13:40
  • 必要的冗余是可以的,但不能无限制的冗余,否则面上看着是查询容易了,实际上可能潜藏的问题越来越大。比如行锁锁的内容越来越多、关系由1:1变成1:n无法适配、查询的字段很多用不上带来流量浪费等等,也可能会给后续优化下来很大困难
    回复 有任何疑惑可以回复我~ 2018-09-04 16:02:05
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信