[转]数据库中的多级结构存储(实例)
来源:互联网 发布:python -m compile 编辑:程序博客网 时间:2024/04/30 02:52
来自:http://blog.sina.com.cn/u/467cbd19010000hs
在项目开发中,经常会碰到存储多级数据结构(树状)的问题。经过查找资料,总结出层次结构存储的两种设计方法:
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表示左右数字。如
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。
以上两种方法的采用根据具体情况考虑,如果查询量小但频繁添加,删除则建议采用第一种。如果查询量大,则考虑使用第二种方法。
- [转]数据库中的多级结构存储(实例)
- [转]数据库中的多级结构存储(实例)
- [转]数据库中的多级结构存储(实例)
- [转]如何用数据库保存多级结构的数据
- [转]如何用数据库保存多级结构的数据
- [转]如何用数据库保存多级结构的数据
- GEF调色板中的多级树结构
- 树型结构在关系数据库中的存储
- 树形结构在数据库中的存储与CRUD操作
- 54、实例 jQuery设计树形结构(类似多级菜单)
- ORACLE数据库存储结构简介(转)
- 数据库存储结构
- Oracle数据库存储结构
- 数据库的存储结构
- 数据库存储结构
- 数据库中如何保存多级结构的数据
- 利用ArrayCollection获取数据库的信息构建多级树结构
- 如何用数据库保存多级结构的数据
- [转]如何用数据库保存多级结构的数据
- asp.net 下载文件
- 窗口嵌套
- 测试帖
- asp.net下载文件实现代码
- [转]数据库中的多级结构存储(实例)
- C/C++ 程序设计员应聘常见面试试题深入剖析
- 嵌入式软件设计中查找缺陷的几个技巧
- 测试
- Win2003下Asp配置技巧
- 关于PowerBuilder连接SQL Server数据库的一些问题
- 博客代码大全
- C++ 项目开发组织的小实践
- jive2.5论坛Cache处理之更新---增加用户权限