猿问

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

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

数据库表结构是这样的:

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

这样做实在是太糟糕了

 


那么该怎么设计呢?

森林海
浏览 503回答 3
3回答

哔哔one

嗯。。。补充楼上--!   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) + '%' )

喵喔喔

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

茅侃侃

@foxidea:  In 可以改成Join 你可以把两个查询改称一个
随时随地看视频慕课网APP

相关分类

SQL Server
我要回答