聊聊树状结构如何在数据库中存储

数据库
昨天有人在QQ小组问起,无限分层的树状结构,数据量比较大,在一万条以上,如何设计数据库的结构。其实这是个老生常谈的问题,一般的做法是有一个 pid字段,为了提高效率,还会有个FullPath字段。

昨天有人在QQ小组问起,无限分层的树状结构,数据量比较大,在一万条以上,如何设计数据库的结构。其实这是个老生常谈的问题,一般的做法是有一个 pid字段,为了提高效率,还会有个FullPath字段。(一些人还设置一个层级字段,但我不知道这个字段有何作用),FullPath字段可以用 id-id-id….这种方式拼字符串存储,这样可以方便地用 like 语句进行查询某个节点及其子节点。

曾经看到过另外一种存储方式,利用了一般树结构可以转换二叉树的这一做法,用二叉树进行存储,在数据量大的情况下,存储读效率比上述的常见方案更优些,所以特写此文简单介绍一番。

下图说明了这种方案

如图所示,在每个节点上,有left ,right两个字段,我们看到,图上从根节点顺着子节点开始画一条线,每深入一层left加一,到底后,right=left+1,然后顺着节点回溯,right逐级加一,一直回到根节点。

如果要查询某个节点及其子节点,比如 fruit 节点 ,条件为 where left between 2 and 11

要查某个节点的full path ,比如 banana,条件为 where left<8 and right >9

如果要插入某个节点,比如red yellow直接插入一个节点,则update left =left+2 where left>=7 ,update right=right+2 where right>7,然后 新节点的left rigt分别是 7,8。 删除节点类似。

这种方式,因为id都是int型数据,加上索引后,读的效率较高。而fullPath字段的方案查询时候用的是字符串操作like,效率较低。

在内存中,如果要还原树状结构,即在每个节点上增加pid属性和children属性,则稍微麻烦些,可以如下操作:

  1. 按left between x and y order by left 取数据
  2. 顺序遍历数据,如果left=上一个Left+1,则是上一个节点的子节点,设置两个对象的父子关系,如果发生跳号,则是上一个节点的兄弟节点。

OK,大致的方案就介绍到这里

原文链接:http://www.cnblogs.com/honghuamin/archive/2011/07/24/2115635.html

【编辑推荐】

  1. SQL Server如何动态生成分区脚本
  2. 手把手教你建立SQL数据库的表分区
  3. 说说抽象SQL(参数化)的查询
  4. 浅述远程Service Broker的实现
  5. 自己动手丰衣足食,DIY SQL字符串分解函数Split
责任编辑:艾婧 来源: 博客园
相关推荐

2018-01-26 13:28:48

数据库数据重复数据库清理

2017-10-17 10:34:16

数据中心混合存储

2009-10-27 16:36:07

Oracle如何解锁

2011-05-25 13:37:15

数据库

2009-06-01 09:57:43

netbeans连接数netbeans数据库netbeans连接m

2011-03-03 10:00:14

ProFTPD建立MySQL

2011-03-11 13:26:23

SQL Server数导入数据

2023-09-05 08:40:57

删除数据库Oracle

2020-11-16 08:56:02

Python

2021-03-01 10:20:52

存储

2021-02-22 10:37:47

存储Prometheus

2018-04-12 11:20:16

MySQLmybatisJava

2023-07-26 15:52:05

2010-10-09 10:29:29

MySQL外键

2011-04-11 15:19:53

Access 2007数据库附件

2022-04-22 09:20:06

FreeBSD 13MySQL数据库

2017-09-26 13:35:40

Mysql数据库设计树状数据

2010-05-06 14:31:32

Oracle数据库

2022-09-23 07:44:48

时序数据库物联网

2023-09-05 00:06:45

点赞
收藏

51CTO技术栈公众号