原文1:
http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/26/1861633.html
1、数据表设计
开门见山,Category表设计如下:
数据表字段简单说明:
列名 | 数据类型 | 默认值 | 备注 |
Id | int | 自增主键 | |
Name | varchar(256) | 分类类别名称 | |
ParentId | int | 0 | 父母分类Id |
Depth | int | 1 | 深度,从1递增 |
Status | int | 0 | 状态:0禁用,1启用 |
Priority | int | 0 | 优先级,越大,同级显示的时候越靠前 |
说明:在设计实现这个数据表之前,我搜索参考并比较了一下其他无限层级设计方案,比如这一篇和这一篇,虽然本文最终使用了最常见的层级设计而没有采纳另外的几种方法,但是不可否认它们对开阔设计思路是很有启发的。
2、简单查询
(1)通常,在实际应用中简单查询某一级别可用(Status等于1)的分类非常简单:
1
2
3
4
5
6
7
8
|
SELECT
[Id]
,[
Name
]
,[ParentId]
,[Depth]
,[Status]
,[Priority]
FROM
[Category](NOLOCK)
WHERE
Status=1
AND
Depth=n
--n>=1
|
最后按照优先级(Priority)字段逆序即可。
原文2:地址:http://www.cnblogs.com/yhb199/archive/2008/07/01/1233153.html
网站大规模分类 比较三种分类的数据库设计
原文3:
地址:http://www.cnblogs.com/cathsfz/archive/2006/12/12/589464.html
Answer
通常在设计表示树结构的数据表时,我们会增加两个字段:
- Depth - 表示当前节点的深度的整数
- Path - 表示从根节点到当前节点的路径的字符串,采用节点名称不可能出现的字符作为分隔符
在对树进行操作时,我们还是如平常一样对表执行CRUD操作,要维护这两个字段并不需要费多少力气,然而在查询时却会为我们带来极大的便利。例如要查询第3层的节点,则只需要使用"WHERE Depth = 3";又例如要查询A1节点下B3节点下C2节点下的所有子节点,则可以使用"WHERE Path LIKE 'A1/B3/C2%'"。
这样做的道理就在于,通过增加冗余信息来提高检索速度,同时这些冗余信息非常容易维护所以不容易因为操作不慎而导致信息不一致。设想一下你要对树增加/移动/删除一个节点,原本一条SQL语句就能完成的事情现在还是一条SQL语句就能完成,就算不依赖事务也绝对不会导致信息不一致。
明白了这个道理,我们就可以进行推广,例如我们既可能需要根据Id字段的路径来查询,又可能需要根据Name字段的路径来查询,那就分开IdPath和NamePath两个字段来表示两组路径字符串。