这个关键不在表的设计而在ADO
字段描述如下 ;
         
         id  自增
         lay 层            最上层为0,依次递增
         rootid 父节点id   当lay为0时,rootid=id
         要保存数据...1、rootid<->id之间是父子关系
2、顺序关系隐含,用此语句可发现
       select id from tablename where lay=层数 order by id desc
3、这个把数据对调一下就行了。
4、节点路径信息:
       先找层数,再通过循环(条件是层数)下面这条语句给某字符串赋值
       select rootid from tablename where lay=i and id=flag
       (flag是上次select到的rootid)
   同级节点顺序位置:这个可以通过2中那句,结合ado的记录数属性得到。
   所有子节点顺序列表:select id from tablename where rootid=父节点id order by id desc
   是否是叶子节点:上面那句把“rootid=父节点”改为“rootid=此id”如果返回记录为空的话,当然就是叶子节点了。

解决方案 »

  1.   

    id  自身流水号
    parentID  父节点
    grade  级次
    isEnd  是否最末级
    seqNumber 同级节点中的顺序表设计上若此出全面的信息,查询上简单,但增加了维护成本。
      

  2.   

    to yaoming2002(飞雪)、luoluo_lm(沧泫) :
    谢谢你们的回复!但是我觉得你们的回复并不是很完整的解决方法。其实你们的方法我早已考虑过,其实就是三个字段:id  自身流水号
    parentID  父节点
    seqNumber 同级节点中的顺序但是我不明白为什么要加入“层级”字段,是为了加快查询速度吗?其次,我不明白yaoming2002(飞雪)的回复中对我的第三个要求的解决方法是什么,能否详细说一下怎么操作?其实我的四个要求中,后面两个才是我真正不知如何处理才能获得最高性能的难点,希望其他的数据库高手能够继续讨论这个问题。另外,我想加多一条问题:如果两个表结构相同,如何把它们当成是同一个表来查询呢?谢谢各位,垦请大家赐教!!!!!
      

  3.   

    加入级次确实是为了查询方便用的,要不判断时很麻烦,也很耗时。要满足你的要求,用luoluo_lm(沧泫) 的方法就很好。
    “如果两个表结构相同,如何把它们当成是同一个表来查询呢?”
    用union all 建一个视图就可以了。
      

  4.   

    to icevi(按钮工厂) :
    我就是不明白,在条件上选择“parentID=xxx”不就已经满足查询了么,为什么要加上层级呢?对于我的第三点要求,有没有人能够给出详细的实现方案呢?对了,我的要求不仅是要支持节点移动,还要支持增、删、插入节点。
      

  5.   

    从表设计中实现比较好,表结构设计类似于建立三个ID,三个ID分别描述为:上级ID(lid)、自己的ID(id)、下级ID(rid),当为根结点时则lid为0,查询时通过id的关系遍历
      

  6.   

    to marvellin:
    1、为什么需要下级ID ?
    2、你还是没有解答我的第3点要求
      

  7.   

    3和4实际上是一队很矛盾的要求。
    解决3:最好的办法是你的表设计中字段尽可能小。比如:ID,PARENTID,SEQNUM三个字段就可以满足要求。但非常难以满足4的第一个要求。
    这样在修改数据时,最多只用修改PARENTID,SEQNUM两个字段。
    但对于4:
        1)“节点在目录中的路径信息”:最好的解决办法是象财务科目的编码设计,ID即代表路径信息,但这种表设计最难满足3的要求。
        2)“同级节点的顺序位置、节点的所有子节点的顺序列表”:3的解决办法都能解决
        3)“此节点是否叶子节点”:3的解决办法也可解决。但最快的办法是增加一个字段表示是否最后一级,但显然会增加维护难度,数据维护时都需要做判断来维护这一字段。
        实际你这个问题的看你最关心的效率是那一方面。
        总的来说,3和4的第一个问题最冲突。我不知道有什么两全其美的办法,也许没有。
      

  8.   

    to pjy(古虫):
    其实我最关心的是第三点要求,我还是没有想出理想的办法。