树状数据结构存储方式(查询篇)-php教程

资源魔 30 0
邻接列表模子

正在一样平常营业开发中,咱们经常会遇见一些具备条理构造的树状数据。而正在用关系型数据库存储时,往往将这类数据构造以一种称为邻接列表的模子进行存储,像这样:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `pid` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

9d5f19b07b3048ef83d3aff343f5362.png

这个模子体现的图为:

e2aa18e5a20bb294b6035d31138101e.png

这类数据模子置信不少人曾经很相熟了,这里就没有作过多的赘述。咱们重点来讲说上面这类数据模子

嵌套集模子

而示意树的另外一种形式,是将它作为一个荟萃进行存储。咱们从新界说下表构造:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `lft` int(11) NOT NULL UNIQUE CHECK (lft> 0),
  `rgt` int(11) NOT NULL UNIQUE CHECK (rgt> 1),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

c9480ba6f6328d9404c8540364b6041.png

而这个模子的图就是会像上面:

8426f06de80f225f7dec4f4a5a0037d.png

lft 以及 rgt 是作为荟萃的鸿沟,二者差值越年夜,则荟萃越年夜,外面的元素就越多。

依据子集,查找父级的分类

SELECT c2.* 
  FROM categories as c1, categories as c2
  WHERE c1.lft BETWEEN c2.lft and c2.rgt 
      AND c1.title = '华为';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  5 | Harmony OS  |  10 |  13 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

依据父级,查找其底下一切的子集

SELECT c1.*
   FROM categories AS c1, categories AS c2
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
    AND c2.title = 'Smartphones';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  3 | Android     |   2 |   5 |
|  4 | iOS         |   6 |   9 |
|  5 | Harmony OS  |  10 |  13 |
|  6 | 小米        |   3 |   4 |
|  7 | iPhone      |   7 |   8 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

查看各个分类的级别

 SELECT COUNT(c2.id) AS indentation, c1.title
  FROM categories AS c1, categories AS c2下周三we'fv
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
  GROUP BY c1.title
  ORDER BY c1.lft;
+-------------+-------------+
| indentation | title       |
+-------------+-------------+
|           1 | Smartphones |
|           2 | Android     |
|           3 | 小米        |
|           2 | iOS         |
|           3 | iPhone      |
|           2 | Harmony OS  |
|           3 | 华为        |
+-------------+-------------+

优缺

邻接列表模子

邻接列表模子很容易了解,咱们需求的代码也很简略。

然而正在年夜少数编程言语中,它是迟缓而低效的。这次要是由递归惹起的。咱们需求为树中的每一个节点进行一次数据库查问。

因为每一个查问都需求一些工夫,因而正在解决年夜型树时这会使函数变患上十分慢。由于关于每一个函数来讲,是需求以一种递归的算法来完成数的猎取。

当然,假如用 List 这类对递归亲以及的言语来讲,能够疏忽这类数据模子的缺陷。然而对 PHP 来讲,却会使患上整个正在解决这类数据模子的时分,变患上特地慢。

嵌套集模子

相较于邻接列表模子,这类数据模子显然并非那末好了解。而且不克不及那末简略的增加数据,它需求正在增加的时分较量争论阁下两边的数值,并移动当前的数值,这添加了增加数据的压力。

一样,它带来的益处是,能够让你以一条简略的查问,就实现一个树的查问,能够依据 lft 以及 rgt 两个参数就算出其有几何个子元素。

总结

两种模子各有好坏,一种优于拔出,一种优于查问。尽管我倾向于嵌套集模子,然而仍是需求依据特定营业来选用。

以上就是树状数据构造存储形式(查问篇)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 数据结构

抱歉,评论功能暂时关闭!