2013-02-14 84 views
0

刚刚得到一个基本的数据库问题,我要问:键的数据库表的多对多的关系

如果我有两个表,形成多对多的关系,所以后来我包括在与另一个表两个表通过创建一对多关系来停止这种关系,我创建的新表中的字段必须是主键还是foriegn键,还是应该是foriegn键?

EG

课程表:

CourseId (PK auto) CourseNo CourseName 
1     2343  ICT 
2     4030  Maths 

Course_Module表:(这是我要问,如果既要PK和FK表):

CourseId (FK course) ModuleId (FK Module) 
1      3 
1      2 
2      1 
2      2 

模块表:

ModuleId (PK auto) ModuleNo ModuleName 
1     344  Algebra 
2     223  Statistics 
3     303  Systems Stratergy 

回答

1

他们必须是复合PK(即两个courseId和的moduleId)和外键,因为你需要courseId和的moduleId的组合是唯一的,你也想引用完整性

+0

感谢您的回答,直接点我喜欢:) – Manixman 2013-02-14 21:49:23

0

我们他们都是。在你的情况下,CourseIdModuleId应该在Course_Module表中构成一个复合主键,同时仍然作为外键单独使用。您提供的样本数据在该表中具有唯一的行,这是我决定的要点。

+0

所以,当你提到他们应该是复合键,你的答案是指出这些字段应该包含主键和外键? – Manixman 2013-02-14 21:47:42

+0

是的@manixman。对不起,不清楚。我会编辑。 – 2013-02-14 21:49:33

0

你不要指定每个表上的主要。可能会有性能影响,所以在这种情况下,我建议您将两个主键都指定为这两个字段。

另请注意,您不必将字段指定为外键,并且在某些MySQL引擎上,您实际上没有使用外键的选项。

+0

因此,对于Course_Module表,你所说的包括他们两个字段作为主要kwys但不是forigen键? – Manixman 2013-02-14 21:48:40

+0

您可以使用外键。我刚刚提到了一个事实,即您可能会遇到使用MySQL的外键问题,因为它并不总是受支持。 – neelsg 2013-02-14 21:52:54

+0

从(关系)数据建模的角度来看,没有* PK的表是没有意义的。重复可能存在,但它们的含义是什么?如果course_module联结表中有两个记录,那么这意味着该模块是课程的一部分*两次*?如果删除两条记录或只删除一条记录,会发生什么? – wildplasser 2013-02-14 22:01:13