日期:2011-09-22  浏览次数:20989 次

使用多中值排序基数实现大型树状结构

    在“中值排序基数法实现树状结构”中,为了解决回复限制的问题,我们可以增加第二(三、四……)基数字段。
    其实在一般的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      0
_____________________________________
5      1        3            7      0