为多对多关系构建连接表

时间:2014-11-04 14:42:10

标签: mysql database-design

我正在开发一个应用程序并遇到了一些问题,我认为这是由于我设置架构的方式。

该应用程序的概述是一个大学课程系统。每门课程由多个模块组成,每个模块由多个单元组成,每个单元由练习组成。

要求是可以以不同方式重复使用练习,单位和操纵者以形成新内容。因此,例如,练习A可以存在于模块B和模块C中。

最初,我已经找到了一个看起来像这样的数据库,为了简洁起见,我删除了除主键和外国ID以外的所有数据库。

+---------+
| courses |
+---------+
| id      |
+---------+

+----------------+
| course_modules |
+----------------+
| id             |
| course_id      |
| module_id      |
+----------------+

+---------+
| modules |
+---------+
| id      |
+---------+

+--------------+
| module_units |
+--------------+
| id           |
| module_id    |
| unit_id      |
+--------------+

+-------+
| units |
+-------+
| id    |
+-------+

+----------------+
| unit_exercises |
+----------------+
| id             |
| unit_id        |
| exercise_id    |
+----------------+

+-----------+
| exercises |
+-----------+
| id        |
+-----------+

到目前为止,似乎很明显我已经搞砸了。

鉴于具体unit_exercise,我无法知道它属于哪个课程,因为我无法可靠地向上移动"链#34;因为不可能知道这引用了哪个module_unit

我的问题是我的联名表是否真的链接到他们的父母?例如,我将连接更改为

+----------------+
| course_modules |
+----------------+
| id             |
| course_id      |
| module_id      |
+----------------+

+-------------------+
|   module_units    |
+-------------------+
| id                |
| course_modules_id |
| module_id         |
| unit_id           |
+-------------------+

+----------------+
| unit_exercises |
+----------------+
| id             |
| module_unit_id |
| unit_id        |
| exercise_id    |
+----------------+

最初,包含这些信息似乎是多余的,但我看得越多,似乎必须要求它。

2 个答案:

答案 0 :(得分:0)

我认为你可以通过两种方式做到这一点。 你提到的第一个。第二个,你可以拥有你最初所做的所有参考表课程,单元,模块,练习,然后有一个带有Course_id,Module_id,Unit_id和Exercise_id的最终Course_details表。这样您就可以添加单个单元或练习,而无需将它们附加到课程或模块等。

答案 1 :(得分:0)

我很乐意开发一个非常相似的系统,我想我将来会经历同样的问题。因此,我将您的问题视为我的问题。

也许没有必要将完整的路线存储到练习中。不在数据库中......在我看来,会话数据在您的情况下非常合适。用户可能会从相应的exercise页面到达某个unity。那么,为什么不将父母的标识符作为参数发送给后代的页面?

我也会选择复合主键。从图形上讲,

  

EER Diagram - MySQL Workbench V6.1