3

我的程序中有一堆项目都属于特定类别。我只想返回属于该类别的项目。问题是类别可以有父类别。例如,假设有一个类别“Stuff”,其子类别为“Food”,子类别为“Fruit”。我有这些物品,苹果、梨、巧克力和电脑。

如果我想显示所有的水果,很容易使用“WHERE item.category = FRUIT_ID”子句进行数据库查询。但是,如果我想把所有食物都包括在内,我也需要一种方法把水果放进去。

我知道一些数据库,如 Oracle,有递归查询的概念,这可能是正确的解决方案,但我对分层数据没有太多经验,正在寻找一般性建议。假设我对数据库模式有无限的控制,类别树最多只有 5 个类别,我需要它尽可能快。

4

5 回答 5

2

看看邻接列表模型- 它并不完美(更新速度很慢),但在某些情况下(分层查询),它是一个很好的表示,特别是对于像你这样的问题。

于 2010-01-11T21:58:07.440 回答
1

一整本书充满了用 SQL 表示树的设计策略。值得一看的是纯粹的聪明点。

于 2010-01-11T21:56:45.197 回答
1

假设您的类别树足够小可以被缓存,您最好将类别树保存在内存中并在该树上具有一个函数,该函数将生成一个低于给定类别的类别 ID 列表。

然后当您查询数据库时,您只需使用IN带有子 ID 列表的子句

于 2010-01-11T22:01:11.990 回答
0

一种可能的解决方案是将层次结构与实际分类分开。例如,一个苹果可以被归类为水果和食物。分类不知道水果是食物,但您可以在其他地方定义它。然后,您的查询将像where category='food'.

或者,您可以在构建查询之前遍历层次结构,它需要类似where category='food' or category='fruit'.

于 2010-01-11T21:57:57.440 回答
0

我认为您的数据库架构非常好,但是此搜索的实现实际上取决于您的特定 RDBMS。他们中的很多人都有办法执行这种递归。我能想到的一个例子是 SQL Server 对Common Table Expressions的支持,它是那些讨厌的游标的闪电般快速的替代品。

如果您指定您正在使用的 RDBMS,您可能会得到更具体的答案。

于 2010-01-11T22:01:57.617 回答