多级分类表结构设计
Id CaName ParentId ..(Path,CreateTime...)
主要就这三个字段 。一级一级往下面递归来实现无限极分类。
我想要查询出来的每条子分类记录都有他父分类的名称。(Id CaName ParentId ParentCaName)却怎么也搞不出来了。在群里一问,人家说这种设计本身就是个错误。
我纳闷了!
后台我就想是不是要建连个表呢,一个父分类表,一个子分类表。只要一个分类下面有子分类,那就把它归到父分类。那这样就都能查询出来了。
希望大家建议。谢谢了!
这个设计是可以的
你想查找谁的子分类呢?总要有个目标吧。
拿国家的地域举例子。
就是省、市、县的例子
数据格式为
100000 北京 000000
100100 海淀 100000
100200 朝阳 100000
100101 海淀中关村 100101
什么叫所有子分类,这个是相对的概念,海淀相对于北京来说是子分类,但是相对于中关村来说是父分类,概念要搞清楚。
比如说查询北京的子分类
select * from district where parentid='100000'
结果就是
海淀
朝阳
你想同时显示父分类的名称的话,就需要自连接,表自连接
qq我没有
DECLARE @District TABLE (
id VARCHAR(10),
parentid VARCHAR(10),
[name] VARCHAR(10)
)
INSERT INTO @District VALUES ('1000','0000','北京')
INSERT INTO @District VALUES ('1001','1000','海淀')
INSERT INTO @District VALUES ('1002','1000','朝阳')
SELECT * FROM @District
SELECT d1.id,d1.parentid,d1.[name] AS ChildName,d2.[name] AS ParentName
FROM @District d1 INNER JOIN @District d2 ON d1.parentid =d2.id
WHERE d1.parentid='1000'
你的设计没错,ParentId直接指向ID就可以实现无限递归了
程序里只要写递归方法进行获取
public void GetList(int parentId,TreeNode parentNode)
{
var childList=GetChildListByParent(parentId);
foreach(var item in childList)
{
var childNode=new TreeNode;
if(HasChildNode(item))
{
GetList(item,childNode);//递归调用
}
}
}
你这个设计足够满足需求了,
SELECT Id CaName ParentId FROM dbo.Demo
order by ParentID
这样分组 就非常清晰了,取数据就按每组每组来取就OK
用优良的表设计完全可以做到不借助代码来递归,
比如五个字段:
ID,Name,ParentID,Code,Order,CurState
其中Code类似于它的所有路径信息:如2,2/5/8,2/4等。
查询可以用like '2/%'查询所有2下面的子节点
http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html