数据库建立外键与不建外键而建立单独的关系表的对比,求专业回答

时间:2022-11-23 08:20:44
好:
    最近看过老外的一个数据库,发现这个数据库表之间都没有直接用外键,而是用了单独的关系表来维持这种外键关系,请问这样做有什么好处?
    例如:

    有一种关系     学生  -- 属于 ->  班级
    (是一对一的关系)

    在我们的数据库设计中都是这样的:
      学生表、班级表      学生表中有一个外键字段叫做所属班级,来实现这种关系

    但是在他们的数据库中是这样设计的:
      学生表、班级表、学生vs班级表
      其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
      就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系

    请问这种设计是基于什么考虑的呢?

    不知道问题描述清楚了没有,大家一起探讨一下,希望得到比较专业的回答,呵呵。

7 个解决方案

#1


根据楼主的描述应该是为了消除数据的冗余吧。。。

#2


但是在他们的数据库中是这样设计的: 
      学生表、班级表、 学生vs班级表
      其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的 
      就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系 

-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制

#3


提高检索的效率

#4


hibernate自动生成的话就是这样的,是不是他用框架了?
我猜的啊,呵呵

#5


这是比较标准的范式设计而已。

不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。

#6


引用 5 楼 inthirties 的回复:
这是比较标准的范式设计而已。

不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。


好,能给解释一下,这样做如何提高性能吗?

按我的想法,如果我需要一个查询把学生和所属的班级都查出来
那么如果是外键的话,我只需要进行两个表进行联查就可以得到结果
但是如果设计单独的关系表的话,我需要对这三个表进行联合查询才能得到
这样的话,设计成3个表比设计成2个表的查询性能肯定有损失啊
希望给出详细点的解释,多谢多谢

#7


引用 3 楼 vivi09 的回复:
提高检索的效率


好,能给具体解释一下如何提高检索效率吗?
问题同6楼

#1


根据楼主的描述应该是为了消除数据的冗余吧。。。

#2


但是在他们的数据库中是这样设计的: 
      学生表、班级表、 学生vs班级表
      其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的 
      就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系 

-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制

#3


提高检索的效率

#4


hibernate自动生成的话就是这样的,是不是他用框架了?
我猜的啊,呵呵

#5


这是比较标准的范式设计而已。

不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。

#6


引用 5 楼 inthirties 的回复:
这是比较标准的范式设计而已。

不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。


好,能给解释一下,这样做如何提高性能吗?

按我的想法,如果我需要一个查询把学生和所属的班级都查出来
那么如果是外键的话,我只需要进行两个表进行联查就可以得到结果
但是如果设计单独的关系表的话,我需要对这三个表进行联合查询才能得到
这样的话,设计成3个表比设计成2个表的查询性能肯定有损失啊
希望给出详细点的解释,多谢多谢

#7


引用 3 楼 vivi09 的回复:
提高检索的效率


好,能给具体解释一下如何提高检索效率吗?
问题同6楼