首页 新闻 会员 周边 捐助

求数据库版无限级分类算法

0
悬赏园豆:50 [已关闭问题]
<P>因为项目的原因,所以需要一个无限级分类</P> <P>需要达到搜索某个类的产品时可以用:select * from product where ClassID=***就可以获取。。。</P> <P>请大家给些思路或者有实例的就最好了~</P>
问题补充: 手机 --|欧美 ----|诺基亚 ------|(水货)诺基亚 ----|索尼爱立信 --|日韩 ----|三星 ----|LG 汽车 --|MVP --|跑车 ----|法拉利 --------|98款 --|农用车 --- 假设我有这样的一个无限级分类,哪么,我要选择:手机下的所有数据,哪么可以方便的用select * from Product where 分类码=手机的ID 这样子所有数据(包括:欧美/诺基亚/(水货)诺基亚)这些所有类都会出来~~ 网上大部分人的算法都是结果不会出来大类下面的所有小类的数据,最会出来当前类的。 --可能我表述不太清楚,如果有做过类似的朋友可以加偶QQ或者MSN详谈,谢谢 ********************* lodestar :你所说的树型具体怎么样实现 ?
没剑的主页 没剑 | 菜鸟二级 | 园豆:430
提问于:2007-12-19 14:29
< >
分享
其他回答(7)
0
在分类表里添加一个ParentClassID行吗? 或者你是想要什么样子的无限级分类?对查询有什么要求?
丁学 | 园豆:18730 (专家六级) | 2007-12-19 15:12
0
我们的就是采用丁学的做法。另外多加一个“级别”字段。 缺点就是数据量大时,速度有点慢
张荣华 | 园豆:2020 (老鸟四级) | 2007-12-19 15:42
0
真正的无限级分类,只有通过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字段长度的限制,无法达到理论上的无限,但一般够用。
Klesh Wong | 园豆:780 (小虾三级) | 2007-12-19 17:30
0
多些冗余数据就行了 不过更新时需要维护各个冗余数据,, 例如可以增加一个idlist,类似1/2/3/的格式,1,2,3都是categoryid 这样搜索2分类下的所有可以这样 select * from .. where idlist like '1/2/*'
wingoo | 园豆:1513 (小虾三级) | 2007-12-19 18:23
0
记得这是大学时考试的题目啊
Cheney Shue | 园豆:454 (菜鸟二级) | 2007-12-19 20:01
0
感觉在操作上面还是节点的路径存储的仿佛比较好 简单方便。不知道like的性能怎么样 复杂度方面应该是比那个“真正的”无限级分类好点
JesseZhao | 园豆:305 (菜鸟二级) | 2007-12-20 08:17
0
这应该是一颗树吧
一水先生 | 园豆:175 (初学一级) | 2007-12-21 01:57
0
用树型查询sql写,网上资料很多。oracle没有问题,sqlserver不知道是否支持树型sql。
lodestar | 园豆:102 (初学一级) | 2007-12-21 13:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册