首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有序树表的数据库表设计

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

Stack Overflow用户
提问于 2011-10-17 17:28:10
回答 1查看 499关注 0票数 0

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

代码语言:javascript
复制
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生成这些层次编号)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-17 17:34:30

我找到的关于在数据库中表示树结构的最佳信息是在Joe Celko's Trees and Hierarchies in SQL for Smarties中。

您可能可以在web上找到足够的信息,但我建议您获取这本书,我发现它在实现嵌套的设置层次结构时非常有用。

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

如果您希望能够将整个子树从一个父级移动到另一个父级,那么只需更改parent_id (或您正在使用的任何PK )来引用新的父级。当移动子树时,嵌套集合模型需要更改所有节点。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7791785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档