我需要创建表示如下树结构的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生成这些层次编号)
另外,由于树通常很长,我希望避免因为只有一个元素被重新定位而更新所有元素。(不确定这个愿望在技术上是否可行。)
发布于 2011-10-17 17:34:30
我找到的关于在数据库中表示树结构的最佳信息是在Joe Celko's Trees and Hierarchies in SQL for Smarties中。
您可能可以在web上找到足够的信息,但我建议您获取这本书,我发现它在实现嵌套的设置层次结构时非常有用。
您可以使用邻接列表或嵌套集合来对数据库中的树进行建模,我假设您使用的是邻接列表(其中每个条目都有一个parent属性)
如果您希望能够将整个子树从一个父级移动到另一个父级,那么只需更改parent_id (或您正在使用的任何PK )来引用新的父级。当移动子树时,嵌套集合模型需要更改所有节点。
但是,在嵌套集上执行其他操作会更容易,例如选择特定父级下的所有子节点。对于邻接列表模型,这可能会更加困难,但随着递归CTE的出现,它已经变得更容易。
如果您不担心内容的顺序,我会避免将章节编号与您的数据一起存储。在选择数据时应用它们,这样就不必在树更改时更新每个节点。
https://stackoverflow.com/questions/7791785
复制相似问题