树状结构表的设计思路

一般那种一个表中具有父子关系的表结构如何建立比较好,而且要求快速检索排列出来.
比如将所有的菜单放在一个menu表,这个表中存放主菜单和子菜单,该如何设计这个表能够在快速检索快速反应出其父子关系?
---------------------------------------------------------------

record level
010000 1
010100 2
010200 2
010101 3
020000 1
......
---------------------------------------------------------------

CREATE TABLE [dbo].[tab_menu] (
[id] [int] NULL ,
[menuname] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[parentid] [int] NULL ,
[level] [int] NULL ,
[haschild] [char] (1) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]

数据:
id menuname parentid level haschild
1 开发资料 0 1 1
2 项目文档 0 1 1
3 公司规章 0 1 0
4 C 1 2 0
5 Java 1 2 0
6 测试文档 2 2 0

字段多些,但层次关系较清晰。
---------------------------------------------------------------

haschild字段不用,通过level就可以判断出是否child,可以加一个map字段。
id menuname parentid level map
1 开发资料 0 1 001
2 项目文档 0 1 002
3 公司规章 0 1 003
4 C 1 2 001 &brvbar004
5 Java 1 2 001 &brvbar005
6 测试文档 2 2 002 &brvbar006
7 java测试文档 6 3 002 &brvbar006 &brvbar007
这样排序比较方便。写出以上缩进形式就很容易了。
以上id号前面的前导零的个数,根据表中可能的记录数来决定,一般10位就行了,可以支持int型的id值(100亿以内)。而map字段的大小根据树的层数来决定,varchar(1000)应该够了,可以支持100层的树。中间的“ ¦”是为了看着清楚,可以不要。
---------------------------------------------------------------

如果使用我说的表结构,一句sql语句是可以搞定的。
select space(level - 1) + menuname from t order by map

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus