2014-11-04 55 views
0

我开发一个应用程序,并跑进一对夫妇,我相信是因为我已经建立了我的架构方式的问题。构建连接表许多一对多的关系

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

要求是锻炼,单位和maulers可以以不同的方式重新使用,以形成新的内容。因此,例如锻炼可以在模块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我没有办法知道它属于哪个过程,因为我无法可靠地向上移动“链”,因为不可能知道这是指哪个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 | 
+----------------+ 

最初,它似乎是多余包含此信息,但更多的我看着它,好像它必须是必需的。

+0

你没有搞砸了 - 一个单位的锻炼可以属于多个模块/课程。只要确保保持'{unit_id,exercise_id}'等等。独特。 – 2014-11-04 20:31:27

+0

我需要能够去特定的单位(例如),并能够找到正确的相关课程。 没有表的“父”的辅助外键没有办法做到这一点,似乎他们是不明确的,哪一个'course_unit'属于'course_module' – veganista 2014-11-05 14:16:13

回答

0

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

0

这很好,我打算开发一个非常类似的系统,我想我将在未来经历同样的问题。所以我把你的问题看作是我的问题。

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

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

EER Diagram - MySQL Workbench V6.1

+0

是的,这是我目前如何工作。我通过所有的ID的课程,模块,单位等,但它似乎很繁琐。 并不总是这样,用户会直接从“父母”身边走过,因为我希望能够轻松地获得他们的下一个非完整单元/模块/练习,虽然这个问题的范围不在 我的框架不完全支持复合键或我会使用它们。 – veganista 2014-11-05 14:09:29

+0

我明白了...但是你不相信它会简化你的数据结构吗?是否有可能通过URL/course/module/...?也许URL不会变得那么漂亮,但事情变得更简单:) 其他问题,假设用户目前正在使用一些常见练习工作两个单元。完成第一个单位后,他是否必须在其他单位重复这些常见练习?或者这些都属于他们所属的其他单位? – 2014-11-05 21:06:35

+0

它简化了数据结构是的,但我不认为它真的简化了代码。它需要使用一个时间变量来跟踪用户目前的行程。我想避免的事情。 我希望用户能够回到他们回来时所采取的任何课程。 是的用户将不得不完成另一门课程的练习。 – veganista 2014-11-10 16:44:59