采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这里用户表的部门ID 不是用外键关键起来比较好吗 如果用户表插入了一个不存在的部门id,这样就能出现问题了
数据库 提供的主外键关系就没用了? 能否解释下 , 主外键的用处
现在一般很少做外键了,之前一些设计里有外键,是要保证数据的完整性,其实这个通过业务层就可以避免,而且不需要浪费数据库性能
这么说 以后做数据库设计 ,这种主外键约束就不考虑了
你好,目前我们开发习惯是通过业务上做关联,而不是建立明确的外键。比如用户表虽然存储了部门的id,但是并不会建立针对部门表的id的外键关联。这里考虑的原因很多,举几个来说一下。
1、外键本身会消耗一些性能,也会消耗一定空间,对一个表的操作也将变得很复杂。
2、每一个更新操作都会带来额外的检查,而这些检查通常你在业务端也会保证,比如你这里提到的如果用户表插入了一个不存在的部门id,那么在插入到数据库之前,程序应该检查出来并且阻止才对。在数据库里通过外键可以完全避免,但是业务端可以通过一些检查避免出现这些情况,毕竟数据库层已经是个单点,可以提高性能的地方我们都会有所考虑。
3、如果一个表数据量增长很快,需要做分表和分库,这个外键处理起来很麻烦
4、如果涉及到数据迁移及删除时,外键可能会带来许多不必要的麻烦
至少在我们看来,外键带来的好处,我们可以通过业务端检查来达到相同的目的。
好的,谢谢老师,解决了我很久了困扰
老师,如果有一张表的数据内容比较杂,可能包含人员表的信息+部门表的信息+其他业务表的信息等等,这种时候我们是直接在这张表里设计这些用到的表的主键就行,还是把我们用到的数据直接给存进来,让数据‘冗余’,因为这样可能查询的时候只需要查询这一张表就好,而如果只记录其他表的id的话,查询的时候就得关联查询,查询速度会慢把,老师有什么建议吗?不知道自己表达到不到位
必要的冗余是可以的,但不能无限制的冗余,否则面上看着是查询容易了,实际上可能潜藏的问题越来越大。比如行锁锁的内容越来越多、关系由1:1变成1:n无法适配、查询的字段很多用不上带来流量浪费等等,也可能会给后续优化下来很大困难
登录后可查看更多问答,登录/注册
源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术
2.4k 6
2.0k 22
1.3k 20
1.1k 18