最近看过老外的一个数据库,发现这个数据库表之间都没有直接用外键,而是用了单独的关系表来维持这种外键关系,请问这样做有什么好处?
例如:
有一种关系 学生 -- 属于 -> 班级
(是一对一的关系)
在我们的数据库设计中都是这样的:
学生表、班级表 学生表中有一个外键字段叫做所属班级,来实现这种关系
但是在他们的数据库中是这样设计的:
学生表、班级表、学生vs班级表
其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系
请问这种设计是基于什么考虑的呢?
不知道问题描述清楚了没有,大家一起探讨一下,希望得到比较专业的回答,呵呵。
7 个解决方案
#1
根据楼主的描述应该是为了消除数据的冗余吧。。。
#2
但是在他们的数据库中是这样设计的:
学生表、班级表、 学生vs班级表
其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系
-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制
学生表、班级表、 学生vs班级表
其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系
-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制
#3
提高检索的效率
#4
hibernate自动生成的话就是这样的,是不是他用框架了?
我猜的啊,呵呵
我猜的啊,呵呵
#5
这是比较标准的范式设计而已。
不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。
不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。
#6
好,能给解释一下,这样做如何提高性能吗?
按我的想法,如果我需要一个查询把学生和所属的班级都查出来
那么如果是外键的话,我只需要进行两个表进行联查就可以得到结果
但是如果设计单独的关系表的话,我需要对这三个表进行联合查询才能得到
这样的话,设计成3个表比设计成2个表的查询性能肯定有损失啊
希望给出详细点的解释,多谢多谢
#7
好,能给具体解释一下如何提高检索效率吗?
问题同6楼
#1
根据楼主的描述应该是为了消除数据的冗余吧。。。
#2
但是在他们的数据库中是这样设计的:
学生表、班级表、 学生vs班级表
其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系
-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制
学生表、班级表、 学生vs班级表
其中学生表与班级表没有直接的外键关系,他们的关系通过“学生vs班级表”来实现的
就是在“学生vs班级”表中有三个字段,一个是ID,一个是学生ID,一个是班级ID,用这个表的数据来实现学生属于班级这个关系
-------------------------------
学生vs班级表比较冗余,不建立外键可以用程序控制
#3
提高检索的效率
#4
hibernate自动生成的话就是这样的,是不是他用框架了?
我猜的啊,呵呵
我猜的啊,呵呵
#5
这是比较标准的范式设计而已。
不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。
不过现实应用中,有时考虑到性能问题,常常用空间换时间,不过这里的这个sample不需要了就是的。
#6
好,能给解释一下,这样做如何提高性能吗?
按我的想法,如果我需要一个查询把学生和所属的班级都查出来
那么如果是外键的话,我只需要进行两个表进行联查就可以得到结果
但是如果设计单独的关系表的话,我需要对这三个表进行联合查询才能得到
这样的话,设计成3个表比设计成2个表的查询性能肯定有损失啊
希望给出详细点的解释,多谢多谢
#7
好,能给具体解释一下如何提高检索效率吗?
问题同6楼