网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.SQLServer中需要避免的查询设计错.
.讲解一个完整数据挖掘过程的四个.
.深入浅出SQL教程之Group by和Hav.
.讲解Informix数据库的安全性及安.
.个人经验总结:SQL Server数据库.
.讲解V$Datafile_Header相关字段的.
.SQL Server 2005中的异常处理消息.
.循序渐进讲解Informix SQL的十一.
.一个复合查询方法.
.Sql server 如何得到汉字的声母.
.在SQL Server 2005数据库中更改数.
.MS SQL SERVER 图像或大文本的输.
.Microsoft SQL Server 2005数据库.
.数据库的查询优化技术.
.启用数据库复制时为什么会出现18.
.深入浅出SQL教程之嵌套SELECT语句.
.解决SqlTransaction用尽的问题(.
.两台SQLServer数据同步解决方案(.
.SQL中代替Like语句的另一种写法.
.sql 2005 express 远程访问和sa密.

项目开发中层次结构存储的两种设计方法

发表日期:2008-6-2


在实际的项目开发中,我们经常会碰到存储多级数据结构(树状)的问题。下面,我们来介绍一下层次结构存储的两种设计方法:

1:邻接表模式(adjacency list model)

2:先根遍历树算法(modified preorder tree traversal algorithm)

参考数据结构:

中国

|

|---陕西

| |

| |---渭南

| |

| |--- 西安

| |

| |--钟楼

| | |

| | |--大雁塔

|

|---云南

| |

| |---丽江

1:邻接目录模式:

一般情况下,我们在数据库中增加一个parent字段表示这个节点的父节点,从而将整个树状描述出来

如:

parent name

中国

中国 陕西

中国 云南

陕西 渭南

陕西 西安

云南 丽江

西安 钟楼

西安 大雁塔

等这样我们就能够通过数据库保存整个树状结构啦。

通过这种方法需要得到一个多级结构时候需要进行一个递归, 通过递归的方法我们可以得到任意节点的路径。

这种方法的优点是简单,容易理解。缺点是运行速度很慢。尤其是数据量很大的时候需要进行很多查询时候才能完成一个树, 效率很低。

2:先根遍历树算法

将多级数据按照下面的格式划出来

1 中国 16

|

+------------------------+

2 陕西 11 12 云南 15

| |

+-------------+ 13 丽江 14

3 渭南 4 5 西安 10

|

+-----------+

6 钟楼 7 8 大雁塔 9

我们给根节点“中国”左侧标上1, 然后沿着这个树向下在“陕西”左侧标上2, 然后继续前进, 向下在“渭南”左侧标上3, 渭南没有子节点,所以在“渭南”右侧标上4, 然后继续“渭南”的右侧节点。。。沿着整个树的给每个节点的左侧和右侧标上数字。最后一个数组标在“中国”右侧为16。 你只要用手指从1指到16就知道怎么回事啦。

这些数字表明了各个节点之间的关系。我们可以看到, 所有左侧大于2, 右侧小于11的节点,都是“陕西”的子节点。

这样我们可以在数据库中用left, right表示左右数字。如:

我们给根节点“中国”左侧标上1, 然后沿着这个树向下在“陕西”左侧标上2, 然后继续前进, 向下在“渭南”左侧标上3, 渭南没有子节点,所以在“渭南”右侧标上4, 然后继续“渭南”的右侧节点。。。沿着整个树的给每个节点的左侧和右侧标上数字。最后一个数组标在“中国”右侧为16。 你只要用手指从1指到16就知道怎么回事啦。

这些数字表明了各个节点之间的关系。我们可以看到, 所有左侧大于2, 右侧小于11的节点,都是“陕西”的子节点。

这样我们可以在数据库中用left, right表示左右数字。如:

name left right

中国 1 16

陕西 2 11

云南 12 15

渭南 3 4

西安 5 10

钟楼 6 7

大雁塔 8 9

丽江 13 14

这样我们如果想得到 "陕西"下的所有节点。只需要执行:

select * from table where left between 2 and 11;

要想知道“西安”的路径只需要执行:

select * from table where left < 5 and right > 10;

计算某个节点有多少子孙节点: 子孙节点数=(右值-左值-1)/2;

要算出所有节点的左右值, 数据库中需要parent字段,然后编写一个计算左右值递归函数执行。(这里略去不谈)。

主要考虑如何进行一个子节点的增加,删除。

◆方法1: 在数据库中保留parent字段, 增加节点后,调用计算左右值递归函数重新计算左右值。 该方法不推荐用

◆方法2: 改变所有位于新节点右侧的左右值。

比如:想添加“华清池”作为“西安”的最后一个节点,我们给它挪出一个空间,“西安”的右值改为12, “陕西”的右值改为13, “云南”及其子节点的左右值从“12-15”改为 “14-17”, “中国”的右值改为18。即给左右值大于9的所有节点加2 (9为西安最后一个子节点的右值)

update table set right=right+2 where right > 9;

update table set left=left+2 where left > 9;

这样就给新节点腾出空间,它的左右值分别为 9+1, 9+2;

insert into table set left=10, right=11, name='华清池';

当然,删除一个节点时候给左右值大于该节点右值的所有节点减2。

注释:以上两种方法的采用根据我们可以针对具体情况来酌情考虑,假如查询量小但频繁添加,删除则建议采用第一种。假如查询量偏大,我们可以考虑使用第二种方法。

上一篇:不同于其它大部分的SQL数据库引擎SQLite 人气:916
下一篇:用Caché的Speedminer构建和部署数据仓库 人气:630
浏览全部数据库的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐