常见树型表的基础结构(表1):
ID | PID |
|
节点编号 | 所属父节点编号 |
|
对这类树型结构的数据进行查询一般是递归,即:
输入节点编码,然后在一个递归查询中串出所有子节点列表;
树型表基础表结构的改进(表2):
ID | PID | MarkNum | LevelNum |
节点编号 | 所属父节点编号 | 节点基数 | 节点所在层级数 |
MarkNum为节点基数字段
注:MarkNum受小数精度极限影响,可设为字符串类型
LevelNum为节点所属层级字段
这两个值的计算方式如下:
N任意层的基数(0<N<=1)
L层极数(L>=1)
M倍数规则(M=1/2)
K同层同父的相邻节点的增量
P 扩展小数位的长度(P=4),该值与同父子节点的个数相关,以P=4为例,同父子节点的个数为最大为999
W为任意层级数L实际保留小数的位数
W=L-2+(L-1)*P (L>=2)
K=(1/10)W
同父各子节点基数计算方式如下:
N`同父的各子节点基数
I同父的子节点序列索引数(I>=1)
改进后的表节点查询可以以非递归方式实现,即:
根据节点所在的基数和所属层级数,这两个参数进行指定的计算式来生成查询操作所需的条件:
设R(N,L)为生成查询条件
N为输入节点的基数
L(L>=2)为输入节点所属层级数
round为sql标准函数
n 为表(2)中所有节点的基数集合
R(N,L) => 0== mod(N,round(n,W)) ΛL
伪代码(php脚本实现):
//父节点基数的
$num=基数值;
//父节点基数有效值的小数位数
$valid=W;
while($currentLevel<=$maxLevel){
$v[$currentLevel]=$valid;
$currentLevel++;
$valid++;
}
$where='';
foreach($v as$key => $item){
$where.="or (mod({$num},round(marknum,{$item}))=0and orglevel={$key})";
}
本人技术能力有限,不足之处,请指教 basic_wan@163.com