[已解决问题] 求数据库版无限级分类算法
提问时间: 2007-12-19 14:29
悬赏分:50 浏览:852 次

因为项目的原因,所以需要一个无限级分类

需要达到搜索某个类的产品时可以用:select * from product where ClassID=***就可以获取。。。

请大家给些思路或者有实例的就最好了~


提问者:没剑 - 菜鸟二级

问题补充:手机
--|欧美
----|诺基亚
------|(水货)诺基亚
----|索尼爱立信
--|日韩
----|三星
----|LG
汽车
--|MVP
--|跑车
----|法拉利
--------|98款
--|农用车
---
假设我有这样的一个无限级分类,哪么,我要选择:手机下的所有数据,哪么可以方便的用select * from Product where 分类码=手机的ID
这样子所有数据(包括:欧美/诺基亚/(水货)诺基亚)这些所有类都会出来~~
网上大部分人的算法都是结果不会出来大类下面的所有小类的数据,最会出来当前类的。
--可能我表述不太清楚,如果有做过类似的朋友可以加偶QQ或者MSN详谈,谢谢
*********************
lodestar :你所说的树型具体怎么样实现 ?

所有回答(8)
在分类表里添加一个ParentClassID行吗?
或者你是想要什么样子的无限级分类?对查询有什么要求?
7个月前   回答者:丁学 - 大侠五级
我们的就是采用丁学的做法。另外多加一个“级别”字段。
缺点就是数据量大时,速度有点慢
7个月前   回答者:张荣华 - 小虾三级
真正的无限级分类,只有通过ParentId来关联了
如:
CategoryId  CategoryName  ParentCategoryId
1                  手机             0
2                  欧美             1
3                  诺基亚           2
4                  (水货)诺基亚      3
如果需要选出所有“手机”下面的产品
就只好递归先选出所有的子叶点的Id
public ISet<int> GetAllLeafs(int parentId)
{
ISet<int> leafs = new HashedSet<int>();
ISet<int> children = db.execute("select CategoryId from Categories where ParentId=?", parentId);
if (children.Count == 0)
{
leafs.Add(parentId);
}
else
{
foreach (int child in children)
{
leafs.AddAdd(GetAllLeafs(child));
}
}
return leafs;
}
这个是返回子“叶”点的递归函数,代码没有测试过,但大致上就是这样子,取得所有的叶节点Id之后再选出产品就简单了:
public IList<Product> GetAllProductsBelongTo(categoryId)
{
   return db.execute("select * from Product where CategoryId in ("+GetAllLeafs(categoryId)+")");
}

另外一种路径法,即是把节点的路径存某个字段如CategoryPath里,类似 1/2/3/4 的形式,优点是取得所有子类的时候很方便快速:
public IList<Product> GetAllProductsBelongTo(categoryId)
{
   return db.execute("select * from Product where CategoryId in (select CategoryId from Categories where CategoryPath like '"+categoryId+"/%')");
}

这样就能选出手机的所有子分类的Id了。缺点是移动分类节点的时候比较麻烦,而且节点深度受到CategoryPath字段长度的限制,无法达到理论上的无限,但一般够用。


7个月前   回答者:Klesh Wong - 小虾三级
多些冗余数据就行了
不过更新时需要维护各个冗余数据,,
例如可以增加一个idlist,类似1/2/3/的格式,1,2,3都是categoryid
这样搜索2分类下的所有可以这样 select * from .. where idlist like '1/2/*'
7个月前   回答者:wingoo - 小虾三级
记得这是大学时考试的题目啊
7个月前   回答者:Cheney Shue - 菜鸟二级
感觉在操作上面还是节点的路径存储的仿佛比较好
简单方便。不知道like的性能怎么样
复杂度方面应该是比那个“真正的”无限级分类好点
7个月前   回答者:JesseZhao - 菜鸟二级
这应该是一颗树吧
7个月前   回答者:一水先生 - 初学一级
用树型查询sql写,网上资料很多。oracle没有问题,sqlserver不知道是否支持树型sql。
7个月前   回答者:lodestar - 初学一级
评论
7个月前   Klesh Wong :
当然,存放路径的字段要建索引,速度肯定会比较快的
7个月前   JesseZhao :
介绍一下
感兴趣了
7个月前   丁学 :
最好不要是like,如果用ParentID都会慢,那数据一定多到like无法承受了
7个月前   lodestar :
类似:SELECT *      FROM *      CONNECT BY PRIOR *=*
      START WITH *;这方面资料太多了,很好找。

7个月前   一水先生 :
用xml应该也可以吧?
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除