要求ID能反应对应节点在系统中的路径(类似于目录)。现在有两个方案,但是都有各自的缺点:1)传统做法。为每个节点建立一个父节点ID属性,这样可以一级级向上查询,从而获得整个节点路径。该方法比较灵活。但是查询效率很低,如果目录有10层,则必须查询10次,才能获得整个路径。2)在ID中加入路径描述。如11223344代表的就是44在系统中的路径,它的父节点是:33、22、11。这样做法,系统只要获得节点ID号,就立即清楚节点在系统中的位置,查询起来非常快速,而且描述的非常完整。但是该方法不灵活,如果该节点被移动到某个新的父目录下,则该节点下的所有子节点的ID号都必须全部重新生成过。目前没有找到很好的方法,来解决上溯的问题:即能查询很快,又能描述清楚路径而不需要大量修改。
有好办法吗?

解决方案 »

  1.   

    如果新的父目录id为NewId,老的父目录id为OldId,一句话搞定!Update treetable set id=:NewId+Right(Len(id)-Len(OldId)) where id like :OldId+'%' and Len(id)>Len(OldId)
      

  2.   

    要么用第一种,如findcsdn所说的。
    但要高效的话,使用动态展开。
      

  3.   

    如果该节点被移动到某个新的父目录下,则该节点下的所有子节点的ID号都必须全部重新生成过。
      如果该节点下的子节点id号不改变怎么能反映其下子节点的路径变化呢?
      我赞成算法二
      

  4.   

    foxnt (天马幻想)  兄:
    呵呵,翻出老贴来,有个新想法:
    使用这个路径的目的是什么?是为了显示在树中,或是让操作员一级级深入吧.
    反正就是变相的,不变相的得用树吧.而在实际的相关库中是不用保存这个路径吧.比如,一个销售系统,货物按分类列成树,而销售记录则只要记录一个唯一ID号就可了吧.
    那就采用第一种办法吧,另外再加一个ID号不就行了?
    ID号永不变,再保存一个父ID,这样,不管如何移动位置,只要改变父ID,那么下级的也就跟着变了,由于这个路径是不保存在相关的引用表中的,所以也就不存在查询路径的问题了,直接查询ID号嘛.