首页 新闻 会员 周边 捐助

关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率

0
悬赏园豆:10 [已解决问题] 解决于 2012-08-06 19:09

 关于无限级分类数据库表结构设计问题,遍历某分类下所有产品 效率

数据库表结构是这样的:

[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)

这样做实在是太糟糕了

 


那么该怎么设计呢?

fun5的主页 fun5 | 初学一级 | 园豆:4
提问于:2012-08-05 23:01
< >
分享
最佳答案
0

嗯。。。补充楼上--!

 

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) + '%' )

收获园豆:10
向往-SONG | 老鸟四级 |园豆:4853 | 2012-08-06 12:29

好主意

fun5 | 园豆:4 (初学一级) | 2012-08-06 19:09

path中的最后一个id应该是自己吧

这样的话  也就是要在每次insert后都update一下自己的id了?

宛 丘 | 园豆:19 (初学一级) | 2015-10-03 18:07
其他回答(1)
0

可以设计一个类别路径,这样找路径的时候就不用做递归了,不过如果一个子类别有多个父类别就可能不太好弄了

Tom.汤 | 园豆:3060 (老鸟四级) | 2012-08-05 23:26

递归是一方面问题,还有 sql 的 in 查询 

支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-08-06 08:05

@foxidea: 

In 可以改成Join 你可以把两个查询改称一个

支持(0) 反对(0) Tom.汤 | 园豆:3060 (老鸟四级) | 2012-08-06 12:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册