7

树有以下特点:

  1. 每个节点可以有多个父节点和多个子节点。
  2. 一个节点的父节点可以有不同的深度。

例子

我试图表示一个类别结构,如下所示:

桌面和移动应用程序

桌面和移动应用程序->Android 应用程序

桌面和移动应用程序->Android 应用程序->游戏

桌面和移动应用程序->Android 应用程序->游戏->动作

桌面和移动应用程序->游戏

桌面和移动应用程序->游戏->动作

桌面和移动应用程序->游戏->冒险

桌面应用程序

桌面应用程序->游戏

桌面应用程序->游戏->动作

桌面应用程序->游戏->冒险

iPhone 应用程序

桌面应用程序->游戏

桌面应用程序->游戏->动作

桌面应用程序->游戏->冒险

尝试使用嵌套集算法,我最终得到了多个具有不同类别 ID 和不同深度的“游戏”类别。

对此的任何帮助将不胜感激。

4

3 回答 3

2

简单的方法是构造一个表,如:

类别
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 应用程序和游戏。要获得您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 版本中表达它;但是以下内容可能很好了解:U​​sing MySQL query to traverse rows to make a recursive tree

于 2013-05-22T17:00:25.917 回答
0

您要的不是真正的树,而是图表。特别是它是一个有向无环图(DAG)。是一个关于将 DAG 存储在关系数据库中的链接。

使用传统的类别树结构可能更容易,并在项目/类别链接表的帮助下允许项目位于多个类别中。

于 2013-05-22T17:44:12.717 回答
0

另一种方法是在您存储的任何项目上使用标签而不是类别。从您给出的示例中,这甚至可能更合适 - 您将使用“桌面和移动应用程序”、“桌面应用程序”和“移动应用程序”而不是“桌面”和“移动”标签。具有两者的项目自然会属于第一类。

参考:如何在MySQL标签中存储标签,总共一个字段或每个标签一个字段?

于 2013-05-22T18:10:52.857 回答