【发布时间】:2016-11-29 17:00:41
【问题描述】:
我需要创建代表如下树结构的 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.1.3.2。同时第1.3.2条和第1.3.3条将分别成为第1.3.1条和第1.3.2条。
所以我要问的是,如何设计数据库表以呈现这些关系?以及添加新元素/删除元素和重新定位元素的 SQL 会是什么样子? (我可以使用 Ajax 来处理重新定位交互,并使用 PHP 来生成那些层次编号)
另外,由于树通常很长,我希望避免仅仅因为只有一个元素被重新定位而更新所有元素。 (不确定这个愿望在技术上是否可行。)
【问题讨论】: