相关讨论连接:
早就想简单说说: 关于树型结构数据的存储及维护http://expert.csdn.net/expert/topicview1.asp?id=1677669
树型结构数据的存储采用:
tree(id,parentid,remark)
如果仅对于存储来讲,无疑是最经济!
但是利用这样的结构,来提供一些基于稍微复杂点的查询的应用表现形式
效率应该说相当低下!
如: 查询某节点的路径等!
如要高效的查询,我们可以在维护数据时下点功夫!
我们以一个树型结构论坛的实现为例:
tree(id,parentid,rootid,orderid,maxid,indent,title,content,remark)
id: integer 帖子id
parentid: integer 父贴id
rootid: integer 根帖id
orderid: integer 同一个根帖中,帖子顺序id
maxid: integer 用于使新贴在顶部
indent: integer 缩进量
title: varchar 帖子标题
content: varchar 帖子内容
remark: varchar 除 id,parentid 外的贴子线索
这样的设计只要维护好每一个字段都为查询显示提高了效率!
请看下面的维护程序:
--==========================================
alter procedure appsp_addnew
@id integer
,@title varchar(8000) =null
,@content varchar(8000)=null
as
--declare @id int
--set @id=0
if @id=0
begin
insert into tree (parentid,orderid,indent,title,content)
values (0,0,0,@title,@content)
--把帖子顶到上面:
update tree
set rootid = id
,maxid = (select max(id) from tree)
where rootid is null
end
else
begin
--调整同一个"根帖"中,帖子的内部顺序:
update tree
set orderid = orderid + 1
where rootid = (select rootid
from tree
where id = @id)
and orderid > (select orderid
from tree
where id = @id
)
--插入回复的帖子,同时维护 rootid,parentid,orderid,indent,remark,title,content
insert into tree (rootid,parentid,orderid,indent,remark,title,content)
select rootid,@id,orderid+1,indent + 1
,case when remark is null then cast(parentid as varchar)
else remark + '-' + cast(parentid as varchar)
end
,isnull(@title,'re: ' + title),@content
from tree
where [email protected]
--把帖子顶到上面:
update tree
set maxid = (select max(id)
from tree
)
where rootid = (select rootid
from tree
where [email protected]
)
end
--========================================
该程序用于
1.增加新贴:
appsp_addnew 0,'第一个问题','地球是圆的吗?'
2.回复帖子:
appsp_addnew 1,'re: 第一个问题','地球是圆的!'
这样,只需简单查询:
select *, remark + '-' + cast(parentid as varchar) + '-' + cast(id as varchar) , space(indent) + '['
from tree
order by maxid desc,orderid
就可高效的实现帖子列表及其线索,级别等!
虽然维护时增加了一些工作量!
--相关ddl脚本:
create table [tree] (
[id] [int] identity (1, 1) not null ,
[parentid] [int] null ,
[rootid] [int] null ,
[orderid] [int] null ,
[maxid] [int] null ,
[indent] [int] null ,
[title] [varchar] (50),
[content] [varchar] (200) ,
[remark] [varchar] (250) ,
constraint [pk_tree] primary key clustered
(
[id]
) on [primary]
) on [primary]