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

时间:2011-10-17 09:28:10

标签: 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
|          |      |- 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条。 1.1.3.2。同时,第1.3.2条和第1.3.3条将分别成为第1.3.1条和第1.3.2条。

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

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

1 个答案:

答案 0 :(得分:0)

我在代表数据库中的树结构时发现的最佳信息是Joe Celko's Trees and Hierarchies in SQL for Smarties

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

您可以使用邻接列表或嵌套集来为数据库中的树建模,我假设您使用的是邻接列表(每个条目都有parent属性)

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

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

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

相关问题