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

Sql 存储课程章节主题子主题的数据库设计结构,sql,database,database-design,relational-database,database-schema,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

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

这是示例数据

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) 会计简介 a) 基本帐户 2) 财务报表 a) 损益表 i) 折旧 b) 现金流量表 3) 会计职业 现在,每一个主题都有与之相关的课堂讲稿。现在我的想法是在第一章“引言”中,笔记将与主题“基本账户”相关联。但在第二章-“损益表”不会有任何注释,但“折旧”会有注释。现在,由于第三章“会计职业”没有任何子主题,注释将直接与之关联

这只是我的方式或组织-我可以强制规定每章必须有一个子主题,以便注释可以关联等

这就是我目前所拥有的

Table: Course course_id course_name Table: Topics topic_id parent_topic_id topic_name notes Table: Course_Topics course_id topic_id 表:课程 课程号 课程名称 表:主题 主题id 父主题id 主题名称 笔记 表:课程主题 课程号 主题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账户 主题id |家长|主题id |主题名称|备注 10导言 2.1基本账户 3.0财务报表 4.3损益表 5.4折旧 课程号|主题号| 1 1 1 2 1 3 1 4 1 5 以下是我想要的: 1) 有没有更好的方法来设计这个——我是否应该对笔记如何与章节、主题或子主题相关联实施更严格的规则

2) 其次,给定这个数据结构,如果我想提取给定课程的所有主题,并以章节->主题->子主题树结构格式显示它们。我该怎么做呢。我应该根据课程id提取所有主题,然后在服务器端将它们存储在数据结构中,并根据章节/主题/子主题进行组织,还是有更干净的方法使用子查询进行组织

抱歉发了这么长的帖子,我只是想解释清楚。 谢谢你的时间

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

谢谢你的回答,伙计。我遇到了另一种向表中添加沿袭列和深列的方法

此处将该方法解释为“平板模型正确完成”

你们觉得这个方法怎么样

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 第二,约翰在回答中提出了一个很好的观点。我将如何处理中间的插入。 -章节(parent_id=0)说明是否要在第1章和第2章之间插入新章节 -如果要在任意两个现有主题之间插入新主题,请选择主题(父\u id!=0) 我是否应该有另一个列来保持顺序,如1,2,3,然后如果我想在第1章和第2章之间插入一些内容-插入值为1.1或类似的内容-同一列也可以用于主题


再次感谢

如果是一对多关系,请跳过表
课程主题

你能做到的

Table: Course
course_id
course_name

Table: Topics
topic_id
parent_topic_id
topic_name
notes
course_id
如果只是一个文本字段,Notes看起来很好。如果还有更多的话,你需要把它扩展到另一张桌子上

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

order level
000   0
000.1 1
000.2 2
001.1 0
001.2 1
只需在sql中搜索分层数据。。。 因为你使用mysql,如果你认为你想要邻接列表或嵌套列表,这里有一个分析。 而且。。。。看看这个问题,它解释了很多->

您只需一个章节和主题表就可以完成所有这一切。您需要两个字段,
order
,它只跟踪项目的顺序,
level
,这是您需要的缩进级别

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

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

根据您的RDBMS(关系数据库管理服务器),可能有一个针对这种情况的
层次结构id
数据类型

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

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


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

这是一个不错的第一次裁剪

我想在您的
主题
表中添加一个
节指示符
字段。如果是一章,你可以称之为“第三章”。如果您在该章节中有一个章节,您可以在该主题中将其称为“section 4”,然后将该章节中的
section_指示符与其所有父项连接起来,以获得完整的层次结构(“第3章第4节”)


正如您所描述的,组织数据服务器端没有什么问题

这还需要更新多行以保持
顺序