数据库中树形图的用法

数据库中树形图的用法,第1张

数据库中树形图的用法的用法你知道吗?下面我就跟你们详细介绍下数据库中树形图的用法的用法,希望对你们有用。

数据库中树形图的用法的用法如下:

树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView,利用Treeview控件可以方便地开发树形图。然而在网页上实现树形图就不那么容易了,现在在aspnet中利用微软提供的Internet Explorer WebControls它使得网页上的树形图开发与在Windows下一样的方便,一样的功能强大,甚至更灵活。

本文介绍用Internet Explorer WebControls开发树形图的方法,由于树形图结构较复杂,使用起来常不知如何下手。笔者结合最近刚为公司用ASPNET编写的应用程序管理器这一具体实例,详细阐述在ASPNET下如何将Internet Explorer WebControls的使用与数据库联系起来,实现数据分任意多层显示,方便地进行增加、修改、删除、移动 *** 作。笔者希望通过对该实例的阐述,达到抛砖引玉的效果,与各位同仁相互交流,共同进步。

Internet Explorer WebControls不在VSNET的标准Server Control中,要到微软的站点上下载,下载地址是:

>

树状结构的数据保存在数据库中的常用方法有一下两种:

1、邻接表(adjacency list model)

2、预排序遍历树算法(modified preorder tree traversal algorithm)

用一下的例子讨论这两种方法的差异:

现有一棵树如下:

邻接表模式:

这种模式我们经常用到,很多的教程和书中也介绍过。我们通过给每个节点增加一个属性 parent 来表示这个节点的父节点从而将整个树状结构通过平面的表描述出来。根据这个原则,例子中的数据可以转化成如下的表:

我们看到 Pear 是Green的一个子节点,Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了简单地描述这个问题, 这个例子中只用了name来表示一个记录。 在实际的数据库中,你需要用数字的id来标示每个节点,数据库的表结构大概应该像这样:id, parent_id, name, description。

以下是代码:

<php

// $parent is the parent of the children we want to see

// $level is increased when we go deeper into the tree,

// used to display a nice indented tree

function display_children($parent, $level)

{

// 获得一个 父节点 $parent 的所有子节点

$result = mysql_query('SELECT name FROM tree '

'WHERE parent="'$parent'";');

// 显示每个子节点

while ($row = mysql_fetch_array($result))

{

// 缩进显示节点名称

echo str_repeat(' ',$level)$row['name']"n";

//再次调用这个函数显示子节点的子节点

display_children($row['name'], $level+1);

}

}

>

对整个结构的根节点(Food)使用这个函数就可以打印出整个多级树结构,由于Food是根节点它的父节点是空的,所以这样调用: display_children('',0)。将显示整个树的内容:

Food

Fruit

Red

Cherry

Yellow

Banana

Meat

Beef

先从数据结构的角度来答

题主应该知道B-树和B树最重要的一个区别就是B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域

这就决定了B树更适合用来存储外部数据,也就是所谓的磁盘数据

从Mysql(Inoodb)的角度来看,B树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上

那么Mysql如何衡量查询效率呢?磁盘IO次数,B-树(B类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少

这是优点之一

另一个优点是什么,B树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来

这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦

至于MongoDB为什么使用B-树而不是B树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以Json格式作为存储的nosql,目的就是高性能,高可用,易扩展

首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次Mysql由于使用B树,数据都在叶节点上,每次查询都需要访问到叶节点,而MongoDB使用B-树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql(但侧面来看Mysql至少平均查询耗时差不多)

总体来说,Mysql选用B树和MongoDB选用B-树还是以自己的需求来选择的

ORACLE提供了一种树形结构用来实现层次查询

START WITH 指定查询的根行

CONNECT BY 指定父行和子行的关系

PRIOR 引用父行

为测试方便 使用如下Demo

建立数据库表TreeTable

Java代码

CREATE TABLE TreeTable(

ID NUMBER PRIMARY KEY   //主键

parentID NUMBER         //父节点

sortID NUMBER           //排序节点

NAME VARCHAR ( )       //子节点名

);

.插入数据 初始化结果见图蓝色部分 此时NAME字段展现的没有父子的层次关系

通过parentID和ID建立关联 同一个parentID对应多个ID 一个ID只对应一个parentID

使用层次查询

.查询一

Java代码

SELECT ID parentID sortID NAME FROM TreeTable START WITH parentID = CONNECT BY PRIOR ID = parentID;

通过parentID和ID建立关联 同一个parentID对应多个ID 一个ID只对应一个parentID

使用层次查询

.查询一

Java代码

SELECT ID parentID sortID NAME FROM TreeTable START WITH parentID = CONNECT BY PRIOR ID = parentID;

执行以后的sortID和NAME字段参照表中的绿色

可以发现NAME字段已经实现了树形结构 但是在子节点之间未进行排序

为了实现在同一个父亲下面各个兄弟的排序 ORACLE提供了siblings 排序

.查询二

Java代码

SELECT ID parentID sortID NAME FROM TreeTable START WITH parentID = CONNECT BY PRIOR ID = parentID ORDER siblings BY sortID;

lishixinzhi/Article/program/Oracle/201311/17048

以上就是关于数据库中树形图的用法全部的内容,包括:数据库中树形图的用法、建立一个树形结构的SQL表 3实现的功能、怎么将数据库中存的树转化为树形列表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9799401.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存