Database 有序树列表的数据库表设计

Database 有序树列表的数据库表设计,database,tree,Database,Tree,我需要创建表示如下树结构的MySQL表: Root |- Chapter 1 | |- Chapter 1.1 | | |- Article 1.1.1 | | |- Article 1.1.2 | |- Article 1.2 | |- Chapter 1.3 | |- Chapter 1.3.1 | | |- Article 1.3.1.1 | | |- Articl

我需要创建表示如下树结构的MySQL表:

Root
|- Chapter 1
|     |- Chapter 1.1
|     |    |- Article 1.1.1
|     |    |- Article 1.1.2
|     |- Article 1.2
|     |- Chapter 1.3
|          |- Chapter 1.3.1
|          |      |- Article 1.3.1.1
|          |      |- Article 1.3.1.2
|          |- Article 1.3.2
|          |- Article 1.3.3
|- Chapter 2
      |-Chapter 2.1
      |     |- ...
      |- Chapter 2.2
      |- ...
简单地说,实体有两种类型:章和条。文章是最小的实体,它下面没有子实体,而章节可以包含子章节或文章作为子实体。每个实体都有一个ID和一个名称

孩子们的顺序没有固定的规则,可以是章节,然后是文章,然后是章节

另一个挑战是,当一个章节从一个章节重新定位到另一个章节时,所有的孩子也应该相应地重新定位。例如,当我将第1.3.1章移至第1.1章下,使第1.3.1章成为第1.1.3章时,第1.3.1.1条和第1.3.1.2条也应被移至第1.1.3.1条和第1.1.3.2条。同时,第1.3.2条和第1.3.3条将分别成为第1.3.1条和第1.3.2条

所以我要问的是,如何设计数据库表以呈现这些关系?添加新元素/删除元素并重新定位元素时,SQL会是什么样子?我可以使用Ajax处理重新定位交互,并使用PHP生成这些层次结构编号


另外,由于树通常相当长,我希望避免更新所有元素,因为只有一个元素被重新定位。我不确定这个愿望在技术上是否可行。

我在数据库中找到的关于表示树结构的最佳信息是

你也许可以在网上找到足够的信息,但我建议你读这本书,我发现它在实现嵌套的集合层次结构时非常有用

您可以使用邻接列表或嵌套集对数据库中的树进行建模,我假设您使用的是邻接列表,其中每个条目都有一个父属性

如果您希望能够将整个子树从一个父级移动到另一个父级,那么它应该与更改父级id或引用新父级的任何PK一样简单。移动子树时,嵌套集模型需要更改所有节点

但是,嵌套集上的其他操作更容易,例如选择特定父节点下的所有子节点。对于邻接列表模型,这可能会更困难,但随着递归CTE的出现,这变得更容易


如果您不担心内容的顺序,我会避免将章节号与您的数据一起存储。当您选择数据时应用它们,这样您就不必在树更改时更新每个节点。

thx供您推荐书籍。遗憾的是,我迫不及待地想用这本书来解决我的问题。我会尝试用谷歌搜索你建议的技术。是的,章节号将由PHP生成,而不是存储在DB中