这篇文章主要介绍了在一种数据库系统中使用ltree处理层次结构数据,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。

在本文中,我们将学习如何使用一种数据库系统的ltree模块,该模块允许以分层的树状结构存储数据。

什么是ltree?

Ltree是一种数据库系统模块。它实现了一种数据类型ltree,用于表示存储在分层树状结构中的数据的标签。提供了用于搜索标签树的广泛工具。

为什么选择ltree?

ltree实现了一个物化路径,对于插入/更新/删除来说非常快,而对于挑选操作则较快

通常,它比使用经常需要重新计算分支的递归贸易与环境委员会或递归函数要快

如内置的查询语法和专门用于查询和导航树的运算符

索引!

初始数据

首先,您应该在数据库中启用扩展。您可以通过以下命令执行此操作:

一创建扩展ltree

让我们创建表并向其中添加一些数据:

创建表注释(用户标识整数,描述文本,路径ltree);

插入到注释中(用户标识、描述、路径)值(1,md5(random():text),’ 0001 ‘);

插入到注释中(用户标识、描述、路径)值(2,md5(random():text),’ 0001。0001 .0001 ‘);

插入到注释中(用户标识、描述、路径)值(2,md5(random():text),’ 0001。0001 .0001 .0001 ‘);

插入到注释中(用户标识、描述、路径)值(1,md5(random():text),’ 0001。0001 .0001 .0002 ‘);

插入到注释(用户标识,描述,路径)值(5,md5(random():text),’ 0001。0001 .0001 .0003 ‘);

插入到注释(用户标识,描述,路径)值(6,md5(random():text),’ 0001.0002 ‘);

插入到注释中(用户标识、描述、路径)值(6,md5(random():text),’ 0001。0002 .0001 ‘);

插入到注释(用户标识,描述,路径)值(6,md5(random():text),’ 0001.0003 ‘);

插入到注释中(用户标识、描述、路径)值(8,md5(random():text),’ 0001。0003 .0001 ‘);

插入到注释中(用户标识、描述、路径)值(9,md5(random():text),’ 0001。0003 .0002 ‘);

插入注释(用户标识,描述,路径)值(11,md5(random():text),’ 0001。0003 .0002 .0001 ‘);

插入到注释中(用户标识、描述、路径)值(2,md5(random():text),’ 0001。0003 .0002 .0002 ‘);

插入到注释(用户标识,描述,路径)值(5,md5(random():text),’ 0001。0003 .0002 .0003 ‘);

插入到注释(用户标识,描述,路径)值(7,md5(random():text),’ 0001。0003 .0002 .0002 .0001 ‘);

插入注释(用户标识,描述,路径)值(20,md5(random():text),’ 0001。0003 .0002 .0002 .0002 ‘);

插入到注释(用户标识,描述,路径)值(31,md5(random():text),’ 0001。0003 .0002 .0002 .0003 ‘);

插入注释(用户标识,描述,路径)值(22,md5(random():text),’ 0001。0003 .0002 .0002 .0004 ‘);

插入到注释(用户标识,描述,路径)值(34,md5(random():text),’ 0001。0003 .0002 .0002 .0005 ‘);

插入注释(用户标识,描述,路径)值(22,md5(random():text),’ 0001。0003 .0002 .0002 .0006 ‘);

另外,我们应该添加一些索引:

2使用要点(路径)在注释上创建索引path _ gist _ comments _ idx使用btree(路径)在注释上创建索引path _ comments _ idx

正如您看到的那样,我建立评论表时带有小路字段,该字段包含该表的树全部路径。如您所见,对于树分隔符,我使用四个数字和点。

让我们在评论网表中找到小路以’0001.0003’的记录:

$ SELECT user_id,path FROM comments WHERE path @ ‘ 0001.0003 ‘;

用户id |路径

– –

6 | 0001.0003

8 | 0001.0003.0001

9 | 0001.0003.0002

11 | 0001.0003.0002.0001

2 | 0001.0003.0002.0002

5 | 0001.0003.0002.0003

7 | 0001.0003.0002.0002.0001

20 | 0001.0003.0002.0002.0002

31 | 0001.0003.0002.0002.0003

22 | 0001.0003.0002.0002.0004

34 | 0001.0003.0002.0002.0005

22 | 0001.0003.0002.0002.0006

(12行)

你不应该忘记数据的顺序,如下的例子:

$ INSERT INTO comments (user_id,description,path)值(9,md5(random():text),’ 0001。0003 .0001 .0001 ‘);

$ INSERT INTO comments (user_id,description,path)值(9,md5(random():text),’ 0001。0003 .0001 .0002 ‘);

$ INSERT INTO comments (user_id,description,path)值(9,md5(random():text),’ 0001。0003 .0001 .0003 ‘);

$ SELECT user_id,path FROM comments WHERE path ~ ‘ 0001.0003 .*’;

用户id |路径

– –

6 | 0001.0003

8 | 0001.0003.0001

9 | 0001.0003.0002

11 | 0001.0003.0002.0001

2 | 0001.0003.0002.0002

5 | 0001.0003.0002.0003

7 | 0001.0003.0002.0002.0001

20 | 0001.0003.0002.0002.0002

31 | 0001.0003.0002.0002.0003

22 | 0001.0003.0002.0002.0004

34 | 0001.0003.0002.0002.0005

22 | 0001.0003.0002.0002.0006

9 | 0001.0003.0001.0001

9 | 0001.0003.0001.0002

9 | 0001.0003.0001.0003

(15行)

现在进行排序:

$ SELECT user_id,path FROM comments WHERE path ~ ‘ 0001.0003 .* “按路径排序;

用户id |路径

– –

6 | 0001.0003

8 | 0001.0003.0001

9 | 0001.0003.0001.0001

9 | 0001.0003.0001.0002

9 | 0001.0003.0001.0003

9 | 0001.0003.0002

11 | 0001.0003.0002.0001

2 | 0001.0003.0002.0002

7 | 0001.0003.0002.0002.0001

20 | 0001.0003.0002.0002.0002

31 | 0001.0003.0002.0002.0003

22 | 0001.0003.0002.0002.0004

34 | 0001.0003.0002.0002.0005

22 | 0001.0003.0002.0002.0006

5 | 0001.0003.0002.0003

(15行)

可以在lquery的非星号标签的末尾添加几个修饰符,以使其比完全匹配更匹配:

” @”-不区分大小写匹配,例如一个@匹配A

” *”-匹配任何带有该前缀的标签,例如foo *匹配播放器

“%”-匹配以下划线开头的单词

$ SELECT user_id,path FROM comments WHERE path ~ ‘ 0001 .*{1,2}.0001|0002.* “按路径排序;

用户id |路径

– –

2 | 0001.0001.0001

2 | 0001.0001.0001.0001

1 | 0001.0001.0001.0002

5 | 0001.0001.0001.0003

6 | 0001.0002.0001

8 | 0001.0003.0001

9 | 0001.0003.0001.0001

9 | 0001.0003.0001.0002

9 | 0001.0003.0001.0003

9 | 0001.0003.0002

11 | 0001.0003.0002.0001

2 | 0001.0003.0002.0002

7 | 0001.0003.0002.0002.0001

20 | 0001.0003.0002.0002.0002

31 | 0001.0003.0002.0002.0003

22 | 0001.0003.0002.0002.0004

34 | 0001.0003.0002.0002.0005

22 | 0001.0003.0002.0002.0006

5 | 0001.0003.0002.0003

(19行)

我们来为父项’ 0001.0003 ‘找到所有直接的儿童,见下:

$ SELECT user_id,path FROM comments WHERE path ~ ‘ 0001.0003 .*{1}”按路径排序”;

用户id |路径

– –

8 | 0001.0003.0001

9 | 0001.0003.0002

(2行)

为父项’ 0001.0003 ‘找到所有的儿童,见下:

$ SELECT user_id,path FROM comments WHERE path ~ ‘ 0001.0003 .* “按路径排序;

用户id |路径

– –

6 | 0001.0003

8 | 0001.0003.0001

9 | 0001.0003.0001.0001

9 | 0001.0003.0001.0002

9 | 0001.0003.0001.0003

9 | 0001.0003.0002

11 | 0001.0003.0002.0001

2 | 0001.0003.0002.0002

7 | 0001.0003.0002.0002.0001

20 | 0001.0003.0002.0002.0002

31 | 0001.0003.0002.0002.0003

22 | 0001.0003.0002.0002.0004

34 | 0001.0003.0002.0002.0005

22 | 0001.0003.0002.0002.0006

5 | 0001.0003.0002.0003

(15行)

为儿童’ 0001.0003.0002.0002.0005 ‘找到家长:

$ SELECT user_id,path FROM comments WHERE path=subpath(‘ 0001。0003 .0002 .0002 .0005 ‘,0,-1)按路径排序.

用户id |路径

– –

2 | 0001.0003.0002.0002

(1行)

如果你的路径不是唯一的,你会得到多条记录。

文章来源:脚本之家

来源地址:https://www。jb51。网/文章/208595。html文件的后缀

发表回复

后才能评论