[转]数据库中的多级结构存储(实例)

news/2024/7/18 9:18:53

 

来自: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。
 
以上两种方法的采用根据具体情况考虑,如果查询量小但频繁添加,删除则建议采用第一种。如果查询量大,则考虑使用第二种方法。

 





http://www.niftyadmin.cn/n/3652519.html

相关文章

[转]Plucene介绍

Plucene介绍作者&#xff1a;chiesa 最后更新&#xff1a;2005/9/25概述Lucene不是一个完整的全文索引应用&#xff0c;而是是一个用Java写的全文索引引擎工具包&#xff0c;它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。Plucene基于java lucene项目创建。Pl…

MySQL MHA高可用集群部署和故障模拟

文章目录MySQL MHA传统的MySQL主从架构存在的问题MHA概述MHA的组成MHA 的特点搭建MySQL MHA实验思路实验环境、安装包关闭服务器防火墙和安全机制修改三台MySQL服务器的主配置文件配置MySQL&#xff08;一主两从&#xff09;主从复制验证安装MHA软件在所有服务器上配置无密码认…

[转]如何用数据库保存多级结构的数据

原文&#xff1a;http://www.01hr.com/article.jsp?id9782产品分类&#xff0c;多级的树状结构的论坛&#xff0c;邮件列表等许多地方我们都会遇到这样的问题&#xff1a;如何存储多级结构的数据&#xff1f;在PHP的应用中&#xff0c;提供后台数据存储的通常是关系型数据库&a…

MHA 无法启动:Connecting to root@192.168.80.30(192.168.80.30:22).‘default-character-set=utf8‘

MHA启动之后查看状态会自动停止 Fri Apr 23 18:47:30 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Fri Apr 23 18:47:30 2021 - [info] Reading application default configuration from /etc/masterha/app1.cnf.. Fri Apr 23…

[原创]简单快速有趣的MySQL数据库操作类:SimpleDB

自己写着玩的&#xff0c;代码没有测试&#xff0c;不过觉得思路不错&#xff0c;如果能够加上部分异常处理的功能&#xff0c;应该比较帅了&#xff0c;支持PHP4/PHP5&#xff0c;恩&#xff0c;虽然没有ADOdb或者PEAR::DB强&#xff0c;不错一般应用应该不错&#xff0c;恩。…

LVS群集的部署(RR轮询)

文章目录群集的含义群集存在的必要解决方法群集可分为三种负载均衡群集高可用群集高性能运算群集负载均衡群集架构负载均衡群集工作模式分析三种负载调度工作模式LVS虚拟服务器LVS的负载调度算法ipvsadm工具NAT 模式LVS负载均衡群集部署环境配置部署共享存储(NFS服务器192.168.…

[转]追MM与Java的23种设计模式

追MM与Java的23种设计模式 1、FACTORY?追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西&#xff0c;虽然口味有所不同&#xff0c;但不管你带MM去麦当劳或肯德基&#xff0c;只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Fac…

LVS-DR群集和Keepalived

文章目录LVS-DR工作原理为了方便进行分析&#xff0c;先将群集放在同一网络中遇到的ARP问题Keepalived案例分析工具介绍Keepalived原理介绍功能案例LVS-DR Keepalived高可用群集部署环境配置LVS-DR部署&#xff08;192.168.80.10、192.168.80.20&#xff09;配置节点服务器&am…