2012-12-05 204 views
0

试着在这儿得到一些专业的想法哪个创建架构关系映射关系 - 外键或映射表

当我大致找到这个post的想法,但还是尽量获得更多的思路选择是好。

一个简单的情形是这样的:

class <--> Student <--> Teacher <--> class 

(假设一个老师可以教多类) 它是在一个圆形many-to-many关系的正常情况。查询可以从任何对象开始到任何方向。那么什么可能是更好的设计?

我知道在一对一的关系中一个映射表肯定是浪费,但是映射表解决方案ONLY好,对于many-to-many关系,就像那篇文章提到的那样?如果我们想扩大与方向的多对多关系。如果关系是one-direction而不是bidirectional,答案可能会不同吗?

在此先感谢。

+0

您能解释为什么您会考虑映射表吗?另外,你能举出一些你担心关系方向的例子吗? – RonaldBarzell

回答

4

一些简单的规则:

对于一个一对一的关系,外键可以在任何关系中所涉及的表的举行,引用其他表。

对于一对多关系,关系多方的表应该包含外键。

对于多对多的关系,您可以创建一个关联表(您的术语中的映射表),这是第三个表,用于存放涉及多对多关系的两个表的外键。

例如,假设我们有表STUDENT,CLASSTEACHER。通常,STUDENTCLASS之间存在多对多关系,并且从TEACHER到CLASS一对多(假设一个班只有一位老师)。因此,这些表格可能如下所示:

STUDENT: STUDENT_ID, STUDENT_NAME, etc. 
CLASS: CLASS_ID, TEACHER_ID (foreign key), CLASS_NAME, etc. 
TEACHER: TEACHER_ID, NAME, etc. 
STUDENT_CLASS (mapping table): STUDENT_ID (foreign key), CLASS_ID (foreign key), GRADE, etc. 
1

如果你有多对多的关系,那么你需要一个映射表。实际上没有其他合理的方式来存储关系数据库中多对多关系的信息(当然,有许多不合理的方法可以这样做)。

如果你想要这种关系是单向的(这看起来很奇怪 - 我不能设想一种情况,即实体A与实体B有关系,其中B与A没有关系,所以我倾向于如果你想实现类似的东西,怀疑数据模型是不正确的),你仍然会使用映射表。您可能会在存储DIRECTION(即'A - > B'或'B - > A')的映射表中添加另一列。