使用多中值排序基数实现大型树状结构
在“中值排序基数法实现树状结构”中,为了解决回复限制的问题,我们可以增加第二(三、四……)基数字段。
其实在一般的BBS中,使用一个基数已经足够,因为一个贴子的回复太多或深度太大的时候,无论你的树状结构做得多好,由于屏幕的限制(显示折行),显示总会乱,因此不如象在《补充》一文中,达到一定深度或个数时,后面的贴子采用平行显示的方法,不过那部分已经不再是树状结构了。
原理:在贴子显示的order by子句中,如果排序基数相同,则根据第二基数排序,从而避免树状结构限制。
一、在BBS的内容表中再增加一个第二基数字段ordernumS,同第一基数一样,可为int或numeric,看需要定。
这样在表中增加了四个冗余字段,rootid——用于记录根id,deep——用于记录回复的深度(为0时表示根贴),ordernum——第一排序基数,ordernumS——第二排序基数
表forum与(只列与树状结构有关的字段):
id rootid deep ordernum ordernumS
其中id、rootid、deep均为int型(deep可为tinyint型),ordernum为int或float型,ordernumS(默认值为0)同ordernum。
例:(在此为了简单,使用一个小的起始排序基数,且为int型,以清楚观察什么时候第二排序基数起作用)。
(下面所说的排序均指按ordernum从小到大,ordernumS从小到大排序,即order by ordernum,ordernumS)
(下面所说的精度为后贴与前贴的ordernum的差,精度标记指的是这个差大于某个值这个条件,比如(后贴的ordernum-前贴的ordernum)>1)
id rootid deep ordernum ordernumS
1 0 0 0 0
2 1 1 8 0
_____________________________________
3 1 1 4 0 回复第1贴,第一基数取1、2贴的第一基数中值即(0+8)/2=4
排序后结果为:
id rootid deep ordernum ordernumS
1 0 0 0 0
3 1 1 4 0
2 1 1 8 0
_____________________________________
4 1 2 6 0 回复第3贴,第一基数取3、2的第一基数中值即(4+8)/2
排序后结果为:
id rootid deep ordernum ordernumS
1 0 0 0 0
3 1 1 4 0
4 1 2 6 0
2 1 1 8 &nbs