PHP左右值无限分类.doc

PHP左右值无限分类.doc

ID:51693147

大小:150.00 KB

页数:11页

时间:2020-03-15

PHP左右值无限分类.doc_第1页
PHP左右值无限分类.doc_第2页
PHP左右值无限分类.doc_第3页
PHP左右值无限分类.doc_第4页
PHP左右值无限分类.doc_第5页
资源描述:

《PHP左右值无限分类.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、采用左右值编码来存储无限分级树形结构的数据库表设计之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上)该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场

2、合并不能采用,那么还有更完美的解决方案吗?通过google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案:首先,我们弄一棵树作为例子:商品

3、---食品

4、    

5、---肉类

6、    

7、    

8、--猪肉

9、

10、    

11、---蔬菜类

12、          

13、--白菜

14、---电器     

15、--电视机     

16、--电冰箱 采用左右值编码的保存该树的数据记录如下(设表名为tree):Type_idNameLftRgt1商品1182食品2113肉类364猪肉455蔬菜类7106白菜897电器12178电视机13149电冰箱1516 第一次看见上面的数据记录,相信大部分人都不清楚左值(Lft)和右值(Rgt)是根据什么规则计算出来的,而且,这种表设计似乎没有保存父节点的信息。下面把左右值和树结合起来,请看:      

17、    1商品18     +---------------------------------------+               2食品11                                   12电器17         +-----------------+                    +---------------------+    3肉类6         7蔬菜类10         13电视机14      15电冰箱16   4猪肉5         

18、 8白菜9请用手指指着上图中的数字,从1数到18,学习过数据结构的朋友肯定会发现什么吧?对,你手指移动的顺序就是对这棵树的进行先序遍历的顺序。接下来,让我讲述一下如何利用节点的左右值,得到该节点的父节点,子孙节点数量,及自己在树中的层数。 假定我们要对节点“食品”及其子孙节点进行先序遍历的列表,只需使用如下一条sql语句:select*fromtreewhereLftbetween2and11orderbyLftasc查询结果如下:Type_idNameLftRgt2食品2113肉类364猪肉455蔬菜类

19、7106白菜89 那么某个节点到底有多少子孙节点呢?很简单,子孙总数=(右值-左值-1)/2 以节点“食品”举例,其子孙总数=(11-2-1)/2=4 同时,我们在列表显示整个类别树的时候,为了方便用户直观的看到树的层次,一般会根据节点所处的层数来进行相应的缩进,那么,如何计算节点在树中的层数呢?还是只需通过左右值的查询即可,以节点“食品”举例,sql语句如下:selectcount(*)fromtreewherelft<=2andrgt>=11为了方便列表,我们可以为tree表建立一个视图,添加一个层数

20、列,该类别的层数可以写一个自定义函数来计算。该函数如下:CREATE FUNCTION dbo.CountLayer(        @type_id int)RETURNS intASbegin    declare @result int    set @result=0    declare @lft int    declare @rgt int    if exists (select 1 from tree where type_id=@type_id)    begin        sel

21、ect @lft=lft,@rgt=rgt from tree where type_id=@type_id        select @result = count(*) from tree where lft <= @lft and rgt >= @rgt    end        return @resultendGO然后,我们建立如下视图:CREATE VIEW dbo.TreeViewASSELECT type_

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。