悬赏分:50 浏览:852 次
因为项目的原因,所以需要一个无限级分类
需要达到搜索某个类的产品时可以用:select * from product where ClassID=***就可以获取。。。
请大家给些思路或者有实例的就最好了~
|
在分类表里添加一个ParentClassID行吗?
或者你是想要什么样子的无限级分类?对查询有什么要求? 我们的就是采用丁学的做法。另外多加一个“级别”字段。 缺点就是数据量大时,速度有点慢 真正的无限级分类,只有通过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字段长度的限制,无法达到理论上的无限,但一般够用。 多些冗余数据就行了 不过更新时需要维护各个冗余数据,, 例如可以增加一个idlist,类似1/2/3/的格式,1,2,3都是categoryid 这样搜索2分类下的所有可以这样 select * from .. where idlist like '1/2/*' 记得这是大学时考试的题目啊 感觉在操作上面还是节点的路径存储的仿佛比较好 简单方便。不知道like的性能怎么样 复杂度方面应该是比那个“真正的”无限级分类好点 这应该是一颗树吧 用树型查询sql写,网上资料很多。oracle没有问题,sqlserver不知道是否支持树型sql。 |
|
7个月前 Klesh Wong : 当然,存放路径的字段要建索引,速度肯定会比较快的 |
|
7个月前 JesseZhao : 介绍一下 感兴趣了 |
|
7个月前 丁学 : 最好不要是like,如果用ParentID都会慢,那数据一定多到like无法承受了 |
|
7个月前 lodestar : 类似:SELECT * FROM * CONNECT BY PRIOR *=* START WITH *;这方面资料太多了,很好找。 |
|
7个月前 一水先生 : 用xml应该也可以吧? |