SQL Story(十一)--树状表游戏[2]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 ccat 的 blog

       id是当前节点的唯一标识号,显然它应当是主键;我们建立的是一个自闭的存储结构,每一个节点的父节点也应当出自表中存储的节点,所以pid列引用id作为外键;至于data,它是节点中的信息,通常和树的结构没有绝对关系。我把这三列全设成char(10),是为了后面做演示更方便,当然也有人喜欢用自动标识列来做主键,在这种场合,也自有其优点。为了维护数据的完整性或存储、检索等方面的考虑,实用中我们可能会采用更复杂的结构,不过骨干就这样子了。这个结构从数学上讲很简洁,而且是自洽的。如果一个节点没有父节点,那么它的pid就等于它自己的id。这并不违反我们关于主外键的定义。

信息的管理与使用

       树表的结构确定后,问题就集中在如何读写其中的数据。

       增加节点:增加一个叶节点很简单,只要指定这个节点的父节点,把它“挂接”到treeview中。从递归的角度来看,我们可以重复这一步骤,真到插入一个完整的子树。相对而言,比较麻烦的是,如何把一个子节点插入到现有的树中间,而不是最末端。比如存在一个节点n,它的根为r,现在要在rn之间插入一个新节点n’,我们可以这样做:把n’挂在r下面,作为它的子节点,然后把n的父节点指定为n’即可。

       修改节点:这里指修改树结构,改变某一节点的父节点,在这种结构中,修改是很方便的,只要调用标准的update就可以。

       删除节点:删除节点时要注意这个节点下面还有没有子节点,如果有,我们通常以两种方式处理,一是把相关子节点全删掉,如果是ms sql server 2000这样的系统,你可以很简单的在建表时将外键约束指定为支持级联删除,自己写一个级联删除比较麻烦,不过也不是不可能,重点在于,为这个过程建立递归。简要示例如下:

--定义存储过程

create procedure deletenode

       @nodeid char(10)

as

begin

       --以当前节点的子节点作为记录集建立游标

       declare childnodes cursor

       read_only

              for select id from treeview where pid = @nodeid

       declare @childnode varchar(40)

       open childnodes

本文关键:数据库, SQL 语言, SQL Story, 树状结构
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top