常用无限极分类

原文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

网站大规模分类 比较三种分类的数据库设计

第一种:4个表 实现四级分类 
一级表:ID1,IDName 
二级表:ID2,IDname,FID(上一级id) 
三级表:ID3,IDname,FID(上一级id) 
四级表:ID4,IDname,FID(上一级id) 

第二种:用树形结构表实现无限制级分类 
表结构:id,fid(上一级id),idname 

第三种:用编码的形式将fid和id的信息放在一个表里 
用32(4+7+7+7+7)位整数来编码,其中,第一级分类有4位,可以表达16种分类。第二级到第五级分类分别有7位,可以表达128个子分类。 
易趣好像就用的是这种方法  

原文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两个字段来表示两组路径字符串。



你可能感兴趣的:(php,postgresql)