数据库设计结构用于存储课程章节主题子主题

时间:2011-08-31 18:47:18

标签: sql database database-design relational-database database-schema

我正在整理一个可以保存课程数据的数据库结构。每门课程 - 将有几章,每章可以有主题,每个主题可以有子主题等等。

这是样本数据

Course - Accounts
1) Introduction to Accounts
   a) Basic Accounts
2) Financial Statements
   a) Income statement
      i) Depreciation
   b) Cash Flow Statement
3) Career as an accountant 

现在,每个主题都会有与之相关的讲义。现在,我正在思考的方式是第1章 - “简介” - 这些注释将与“基本账户”主题相关联。但在第2章 - “损益表”中没有任何注释,但“折旧”会有注释。现在,由于第3章“作为会计师的职业”没有任何子主题 - 这些注释将直接与其相关联。

这只是我的方式或组织 - 我可以执行规则,说每章都必须有一个子主题,所以笔记可以关联等。

这是我到目前为止所拥有的

Table: Course
course_id
course_name

Table: Topics
topic_id
parent_topic_id
topic_name
notes

Table: Course_Topics
course_id
topic_id

因此样本数据将显示为

Course_id  |  Course Name
    1          Accounts

Topic_id  | Parent_topic_id  |   topic_name           | notes
    1             0             Introduction
    2             1             Basic Accounts
    3             0             Financial Statements
    4             3             Income Statements
    5             4             Depreciation

Course_id   |    Topic_id
    1               1
    1               2
    1               3
    1               4
    1               5

以下是我要找的内容: 1)有没有更好的方法来设计这个 - 我应该对关于如何与章节或主题或子主题相关的注释强制执行更严格的规则

2)其次 - 给定这个数据结构 - 如果我想拉出给定课程的所有主题并在章节中显示它们 - >主题 - >子主题树结构格式。我该怎么做我应该根据课程ID提取所有主题,然后在服务器端将它们存储在数据结构中,并根据章节/主题/子主题明智地组织它们,或者使用子查询更清晰地进行操作。

很抱歉很长的帖子 - 只是想清楚解释一下。 谢谢你的时间

** * *** 编辑 ** * ** * **

感谢所有答案的人。我遇到了另一种在表格中添加谱系列和深色列的方法。

这种方法在这里解释为“平台模型做得对” http://www.ferdychristant.com/blog/archive/DOMM-7QJPM7

你们怎么看待这种方法。

Secondly - John raised a good point in his answer. How would I handle inserts in between.
- Chapters (parent_id =0) Say if I want to insert a new chapter between chapter 1 and 2
- Topic (parent_id != 0 ) If I want to insert a new topic between any two existing topics

我是否应该有另一个维护顺序的列,如1,2,3然后如果我想在第1章和第2章之间插入一些东西 - 插入值1.1或类似的东西 - 可以使用相同的列也适用于主题。

再次感谢

4 个答案:

答案 0 :(得分:4)

如果表格是一对多关系,请跳过表格course_topics

你可以成功

Table: Course
course_id
course_name

Table: Topics
topic_id
parent_topic_id
topic_name
notes
course_id

如果它只是一个文本字段,则注释似乎很好。如果还有更多,你需要将它分支到另一个表格。

你的第二个问题非常有趣......可以使用递归连接来完成。 即,您可以使用CTE(公用表表达式)递归地将表连接到自身。显示它时只需使用一个级别字段,表示它所在的层次结构中的哪个级别,并按顺序排列

order level
000   0
000.1 1
000.2 2
001.1 0
001.2 1

只需在sql中搜索分层数据... 因为你使用mysql,如果你认为你想去邻接列表或嵌套列表这里是一个分析。 http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/ 而且....看看这个问题它解释了很多 - > What are the options for storing hierarchical data in a relational database?

答案 1 :(得分:2)

根据您的RDBMS(关系数据库管理服务器),可能存在hierarchy_id数据类型,该类型是针对此类情况而制作的。

您正在使用的设计称为“链接列表”模型或“邻接列表”模型。它肯定存在一些很大的缺点,例如需要为大量查询使用递归。

另一种选择是使用“嵌套集”模型。谷歌搜索“joe celko嵌套集”应该会产生一些关于这个主题的文章。您还可以在关系数据模型中对建模树和层次结构的整个主题阅读his book。此方法也有一些缺点(更新,插入和删除可能更复杂)。

我会检查所有三种型号,并确定哪种型号最适合您的情况。

答案 2 :(得分:0)

您只需使用一个用于章节和主题的表格即可完成所有这些操作。您需要两个字段order,它们只是跟踪项目的顺序,level这是您需要多少级别的缩进。

这种方法的好处是它不需要任意数量的表来捕获章节,主题,子主题,子主题等。

缺点是您没有任何关于哪些主题属于哪些其他主题的参考数据。但是这些信息是可计算的。此外,每当修改行时,您都需要管理order字段。

答案 3 :(得分:0)

这不是第一次削减。

我会在section_designator表格中添加Topics字段。如果是章节,可以称之为“第3章”。如果你在该章节中有一节,你可以在该主题中将其称为“第4节”,然后连接该节及其所有父节点的section_designator以获得完整的层次结构(“第3章第4节” )。

如您所述,组织数据服务器端没有任何问题。