关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率
数据库表结构是这样的:
[Category] 类别表
Id(int) 类别Id
ParentId(int) 父类Id
Name(nvarchar(50)) 类别名称
[Product] 产品表
Id(int) 产品名称
Name(nvarchar(50)) 产品名称
CategoryId(int) 类别Id(对应 [Category].Id)
Info(ntext) 介绍信息
……
[Category] 类别表数据
Id ParentId Name
1 0 服装
2 1 男装
3 2 衬衫
4 2 长裤
5 2 短裤
6 2 T恤
7 2 外套
8 2 卫衣
9 2 西装
10 4 休闲裤
11 4 西裤
12 4 牛仔裤
13 4 运动裤
[Product] 产品表数据 不再一一举例
Id Name CategoryId Info
1
2
3
……
这样设计的结构,存在很严重的效率问题,
假设我想找出某分类(假设为男装)下所有的产品,就需要用递归算法,找出(男装)下的所有子分类,然后对 产品表进行 条件 in 查询,得到产品列表
找出所有男装产品
首先写程序,递归出 男装分类下的子类列表(2,3,4,5,6,7,8,9,10,11,12,13)
然后用 sql 查询出来
select * from [Product] where CategoryId in(2,3,4,5,6,7,8,9,10,11,12,13)
这样做实在是太糟糕了
那么该怎么设计呢?
嗯。。。补充楼上--!
Id ParentId Name Path
1 0 服装 ,1,
2 1 男装 ,1,2,
3 2 衬衫 ,1,2,3,
4 2 长裤 ,1,2,4,
5 2 短裤 ,1,2,5,
.....
select * from [Product] p where p.CategoryId in(select Id from [Category] c where c.path like (select path from [Category] where Id=2) + '%' )
好主意
path中的最后一个id应该是自己吧
这样的话 也就是要在每次insert后都update一下自己的id了?
可以设计一个类别路径,这样找路径的时候就不用做递归了,不过如果一个子类别有多个父类别就可能不太好弄了
递归是一方面问题,还有 sql 的 in 查询
@foxidea:
In 可以改成Join 你可以把两个查询改称一个