`

在关系数据库中存储树型结构数据的方法

阅读更多

改进的前序遍历树模型(The Nested Set Model)

原理:

    我们先把树按照水平方式摆开。从根节点开始(“Food”),然后他的左边写上1。然后按照树的顺序(从上到下)给“Fruit”的左边写上2。这样,你沿着树的边界走啊走(这就是“遍历”),然后同时在每个节点的左边和右边写上数字。最后,我们回到了根节点“Food”在右边写上18。下面是标上了数字的树,同时把遍历的顺序用箭头标出来了。

 

    我们称这些数字为左值和右值(如,“Food”的左值是1,右值是18)。正如你所见,这些数字按时了每个节点之间的关系。因为“Red”有3和6两个值,所以,它是有拥有1-18值的“Food”节点的后续。同样的,我们可以推断所有左值大于2并且右值小于11的节点,都是有2-11的“Fruit” 节点的后续。这样,树的结构就通过左值和右值储存下来了。这种数遍整棵树算节点的方法叫做“改进前序遍历树”算法。

表结构设计:

常用的操作:

下面列出一些常用操作的SQL语句

返回完整的树(Retrieving a Full Tree)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT node.name
  
FROM nested_category node, nested_category parent
 
WHERE node.lft BETWEEN parent.lft AND parent.rgt
   
AND parent.name = 'electronics'
 
ORDER BY node.lft


返回某结点的子树(Find the Immediate Subordinates of a Node)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT V.*
  
FROM (SELECT node.name,
               (
COUNT(parent.name) - (AVG(sub_tree.depth) + 1)) depth
          
FROM nested_category node,
               nested_category parent,
               nested_category sub_parent,
               (
SELECT V.*
                  
FROM (SELECT node.name, (COUNT(parent.name) - 1) depth
                          
FROM nested_category node, nested_category parent
                         
WHERE node.lft BETWEEN parent.lft AND parent.rgt
                           
AND node.name = 'portable electronics'
                         
GROUP BY node.name) V,
                       nested_category T
                 
WHERE V.name = T.name
                 
ORDER BY T.lft) sub_tree
         
WHERE node.lft BETWEEN parent.lft AND parent.rgt
           
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
           
AND sub_parent.name = sub_tree.name
         
GROUP BY node.name) V,
       nested_category T
 
WHERE V.name = T.name
   
and V.depth <= 1
   
and V.depth > 0
 
ORDER BY T.Lft


返回某结点的祖谱路径(Retrieving a Single Path)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT parent.name
  
FROM nested_category node, nested_category parent
 
WHERE node.lft BETWEEN parent.lft AND parent.rgt
   
AND node.name = 'flash'
 
ORDER BY node.lft


返回所有节点的深度(Finding the Depth of the Nodes)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT V.*
  
FROM (SELECT node.name, (COUNT(parent.name) - 1) depth
          
FROM nested_category node, nested_category parent
         
WHERE node.lft BETWEEN parent.lft AND parent.rgt
         
GROUP BY node.name) V,
       nested_category T
 
WHERE V.name = T.name
 
ORDER BY T.Lft


返回子树的深度(Depth of a Sub-Tree)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT V.*
  
FROM (SELECT node.name,
               (
COUNT(parent.name) - (AVG(sub_tree.depth) + 1)) depth
          
FROM nested_category node,
               nested_category parent,
               nested_category sub_parent,
               (
SELECT V.*
                  
FROM (SELECT node.name, (COUNT(parent.name) - 1) depth
                          
FROM nested_category node, nested_category parent
                         
WHERE node.lft BETWEEN parent.lft AND parent.rgt
                           
AND node.name = 'portable electronics'
                         
GROUP BY node.name) V,
                       nested_category T
                 
WHERE V.name = T.name
                 
ORDER BY T.lft) sub_tree
         
WHERE node.lft BETWEEN parent.lft AND parent.rgt
           
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
           
AND sub_parent.name = sub_tree.name
         
GROUP BY node.name) V,
       nested_category T
 
WHERE V.name = T.name
 
ORDER BY T.Lft


返回所有的叶子节点(Finding all the Leaf Nodes)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->SELECT name FROM nested_category WHERE rgt = lft + 1


插入节点(Adding New Nodes)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category WHERE name = 'TELEVISIONS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category
  (name, lft, rgt)
VALUES
  (
'GAME CONSOLES'@myRight + 1@myRight + 2);

UNLOCK TABLES;


删除节点(Deleting Nodes)

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->LOCK TABLE nested_category WRITE;

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
  
FROM nested_category
 
WHERE name = 'GAME CONSOLES';

DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;

UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;

UNLOCK TABLES;
分享到:
评论

相关推荐

    Delphi中数据库关联树型结构生成与同步数据维护.zip_数据同步_数据库关联_数据维护_树型结构生成

    在Delphi编程环境中,数据库关联树型结构的生成与同步数据维护是开发高效数据库应用程序的重要环节。本资料主要探讨了如何在Windows XP操作系统下,利用Delphi 7进行相关操作。 首先,我们要理解数据库关联的概念。...

    java递归树型结构通用数据库

    在Java递归树型结构通用数据库中,使用关系型数据库来存储部门信息,数据库表结构设计包括部门表、用户表、部门用户表等,通过这些表之间的关系实现树型结构的部门管理。 6. 递归算法实现 在Java递归树型结构通用...

    如何展开存储在数据库中的树形数据结构.pdf

    通过对这些方法的了解和应用,开发者可以更加高效地管理和查询存储在数据库中的树形数据结构,从而在实际工作中提升数据处理的能力和效率。同时,这些方法也能够帮助开发者深入理解树形数据结构的特点和遍历算法的...

    易语言数据库填充到树型框例程

    在本例程中,“易语言数据库填充到树型框例程”是关于如何利用易语言将数据库中的数据有效地展示在程序界面的树型控件(树形结构)上的一种实现方式。 首先,我们要理解数据库的基本概念。数据库是存储和管理数据的...

    完整版数据库填充到树型框例程.e.rar

    4. **构建树型结构**:根据数据之间的关系,创建树型框的节点。根节点通常表示整个数据集,子节点则代表具体记录。如果数据有层级关系(例如,部门-员工结构),则需正确地设置父节点和子节点的关系。 5. **绑定...

    完整版数据库填充到树型框例程.rar

    这个"完整版数据库填充到树型框例程.rar"文件似乎包含了一个示例程序,它演示了如何将数据库中的数据有效地展示在用户界面上,具体来说就是填充到树形控件(Tree View)中。下面我们将深入探讨这一主题。 首先,...

    数据库填充到树型框例程.rar

    在这个案例中,“数据库填充到树型框例程.rar”是一个可能包含源代码、示例程序或教程的压缩包,旨在教授如何将数据库中的数据有效地展示在树形控件(Treeview)中。树形控件是一种常见的用户界面元素,用于以层次...

    教你如何用java开发树型结构

    5. **J2EE服务端处理**:在J2EE环境中,树型结构的数据通常存储在数据库中。你可以使用Java的持久化框架,如Hibernate或JPA,来操作这些数据。服务端需要提供RESTful API或者Servlets,以便客户端(如JSP页面)请求...

    递归法读取数据库树型结构示例

    在IT领域,数据库通常用于存储和管理大量有组织的数据,而树型结构是数据库中一种常见且有效的数据表示形式。这种结构模拟了现实世界中事物的层级关系,非常适合用来表示目录、组织架构、文件系统等。本文将深入探讨...

    delphi 树型控件自动根据数据集生成树型结构

    本文将详细讲解如何在 Delphi7 中使用树型控件,并自动根据数据集生成树型结构。 首先,理解 TTreeView 控件的基本操作。TTreeView 提供了一个可视化的组件,用于展示具有父节点和子节点的关系的数据。每个节点表示...

    数据库填充到树型框例程.e.rar

    数据库填充到树型框是一种常见的数据可视化技术,尤其在开发用户界面时,它能帮助用户以层次结构的方式浏览和操作数据。在这个例子中,“数据库填充到树型框例程.e.rar”很可能包含了一个示例程序或者代码片段,用于...

    使用冗余数据设计树型关系的数据结构.pdf

    树型关系数据结构是一种常见的数据组织形式,尤其是在层次数据库中,它能够有效地表达层次关系。 接下来,我们将详细探讨使用冗余数据设计树型关系数据结构时需要注意的几个关键知识点: 1. 树型数据结构的定义和...

    树型数据结构在测井软件中的应用.pdf

    结合测井数据在深度方向具有先后顺序的特点,可以采用顺序存储的方式来描述树型结构的存储模型。具体来讲,可以使用父表和子表的方式,通过关键字建立两个表之间的联系。父表的关键字段具有唯一性,而子表的字段与父...

    JSP实现树型结构TREE

    MySQL是开源的关系型数据库管理系统,用于存储和管理树型结构的数据。开发者可能通过SQL语句查询数据库,获取需要展示的层次数据,然后将这些数据转换为JSON格式进行传输。 在学习这个例子时,你可以关注以下几个...

    winform树型结构

    树型结构(TreeView)是WinForm中常见的一种控件,它用于显示层次化的数据,通常表现为节点和子节点的形式,类似于计算机文件系统的目录结构。对于初学者来说,理解和掌握如何在WinForm中使用树型控件是非常重要的...

    一种基于Ajax的动态树型结构的设计与实现.pdf

    树型结构作为一种广泛使用的数据结构,在计算领域中扮演着重要的角色。例如,文件系统中的目录结构和数据库索引等都可以通过树型结构来实现。随着Web技术的发展,树型结构在B/S模式(浏览器/服务器模式)中的应用也...

    jb+数据库+三级树型菜单

    在描述中提到的“jb+数据库+三级树型菜单”可能指的是使用Java(jb)技术来构建一个数据库驱动的应用,其中包含了一个能够展示三层结构的树型菜单。这个菜单系统可能是为了方便用户在复杂的数据结构中导航,比如在...

    基于JDOM的XML技术用于“树型”数据结构的研究.pdf

    1. 树型数据结构在传统数据库系统中的局限性:在关系数据库中,如果要存储类似树型的数据结构,将需要创建多个二维表来代表各个节点之间的关系,这会导致系统维护复杂度上升,查询效率降低,且在修改如名称等字段时...

    树型结构的一个例子

    在IT领域,树型结构是一种常见的数据组织方式,它模拟了自然界中的树状关系,具有根节点、子节点和父节点的概念。在这个特定的Delphi示例程序中,"飘摇客"在2002年创建了一个用递归方法读取数据库数据并构建树形视图...

    ROOT树型结构(JSP)

    "ROOT树型结构"通常指的是在Web应用中用于组织和展示数据的一种图形化方式,特别是对于层次结构明显的数据,如目录、组织架构或文件系统等。这种结构以树状的形式呈现,用户可以通过展开和折叠节点来探索和操作数据...

Global site tag (gtag.js) - Google Analytics