这个关键不在表的设计而在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”如果返回记录为空的话,当然就是叶子节点了。
字段描述如下 ;
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”如果返回记录为空的话,当然就是叶子节点了。
parentID 父节点
grade 级次
isEnd 是否最末级
seqNumber 同级节点中的顺序表设计上若此出全面的信息,查询上简单,但增加了维护成本。
谢谢你们的回复!但是我觉得你们的回复并不是很完整的解决方法。其实你们的方法我早已考虑过,其实就是三个字段:id 自身流水号
parentID 父节点
seqNumber 同级节点中的顺序但是我不明白为什么要加入“层级”字段,是为了加快查询速度吗?其次,我不明白yaoming2002(飞雪)的回复中对我的第三个要求的解决方法是什么,能否详细说一下怎么操作?其实我的四个要求中,后面两个才是我真正不知如何处理才能获得最高性能的难点,希望其他的数据库高手能够继续讨论这个问题。另外,我想加多一条问题:如果两个表结构相同,如何把它们当成是同一个表来查询呢?谢谢各位,垦请大家赐教!!!!!
“如果两个表结构相同,如何把它们当成是同一个表来查询呢?”
用union all 建一个视图就可以了。
我就是不明白,在条件上选择“parentID=xxx”不就已经满足查询了么,为什么要加上层级呢?对于我的第三点要求,有没有人能够给出详细的实现方案呢?对了,我的要求不仅是要支持节点移动,还要支持增、删、插入节点。
1、为什么需要下级ID ?
2、你还是没有解答我的第3点要求
解决3:最好的办法是你的表设计中字段尽可能小。比如:ID,PARENTID,SEQNUM三个字段就可以满足要求。但非常难以满足4的第一个要求。
这样在修改数据时,最多只用修改PARENTID,SEQNUM两个字段。
但对于4:
1)“节点在目录中的路径信息”:最好的解决办法是象财务科目的编码设计,ID即代表路径信息,但这种表设计最难满足3的要求。
2)“同级节点的顺序位置、节点的所有子节点的顺序列表”:3的解决办法都能解决
3)“此节点是否叶子节点”:3的解决办法也可解决。但最快的办法是增加一个字段表示是否最后一级,但显然会增加维护难度,数据维护时都需要做判断来维护这一字段。
实际你这个问题的看你最关心的效率是那一方面。
总的来说,3和4的第一个问题最冲突。我不知道有什么两全其美的办法,也许没有。
其实我最关心的是第三点要求,我还是没有想出理想的办法。