这棵树具有以下特点:
示例
我试图代表一个类别结构,如下所示:
桌面和移动应用程序
桌面和移动应用程序->Android应用程序
桌面和移动应用->Android应用->游戏
桌面和移动应用->Android应用->游戏->行动
桌面和移动应用->小游戏
桌面和移动应用->游戏->行动
桌面和移动应用->游戏->冒险
桌面应用程序
桌面应用->小游戏
桌面应用->游戏->动作
桌面应用->游戏->冒险
IPhone Applications
桌面应用->小游戏
桌面应用->游戏->动作
桌面应用->游戏->冒险
尝试使用嵌套集算法,我最终得到了多个具有不同类别I和不同深度的“游戏”类别。
在这方面的任何帮助将是非常感谢的。
发布于 2013-05-22 17:00:25
简单的方法是构造如下的表:
类别
CategoryID
ParentID
名字
您的数据看起来应该是:
1,0,“桌面和移动应用程序”
2,1,“Android应用程序”
3,2,“游戏”
4,3,“行动”
5,1,“游戏”
6,5,“行动”
7,5,“冒险”
8,0,“桌面应用程序”
9,8,“游戏”
您可以这样查询:select * from Categories where ParentId = 1
,它将返回Android和Games。要获得游戏的子类别,您可以执行select * from Categories where ParentId = 5
,这将返回动作和冒险。
为了将单个项目与多个类别关联起来,需要一个额外的表:更新:
xref_CategoriesItems
CategoryId
ItemId
这将允许任何单个项目与多个类别相关联。假设您有一个桌面应用程序,需要同时出现在桌面应用程序>游戏和桌面和移动应用程序>游戏中。
您的表将有关于第1项的下列数据:
3,1
9,1
当查看特定类别中的项目时,您将执行以下操作:
select I.*
from items I
inner join xref_CategoriesItems XCI on (XCI.ItemId = I.ItemID)
WHERE (XCI.Category = @CategoryId)
若要查看特定项目属于哪些类别,请执行以下操作:
select C.*
from categories C
inner join xref_CategoriesItems XCI on (XCI.CategoryId = C.CategoryId)
where (XCI.ItemId = @ItemId)
如果需要所有子记录,则对特定类别下的所有项的查询要复杂一些。基本上,您需要使用类别进行递归连接xref_categories,以获得子类别。我不记得如何在MySQL版本的sql中表达这一点;但是,了解以下几点可能更好:使用MySQL查询遍历行以生成递归树
发布于 2013-05-22 17:44:12
你想要的不是一棵树,而是一张图。特别是有向无圈图(DAG)。这里 --这是一个关于在关系数据库中存储DAG的链接。
使用传统的类别树结构可能更容易,并允许项目在项目/类别链接表的帮助下处于多个类别中。
发布于 2013-05-22 18:10:52
另一种方法是在存储的任何项目上使用标记,而不是类别。从您给出的示例来看,这可能更合适--而不是“桌面和移动应用程序”、“桌面应用程序”和“移动应用程序”,而是使用“桌面”和“移动”标记。然后,一个两者兼备的项目自然属于第一类。
https://stackoverflow.com/questions/16697446
复制相似问题