关系数据库中的分层过滤

时间:2010-01-11 21:53:20

标签: database database-design hierarchical-data

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

如果我想显示所有结果,可以使用“WHERE item.category = FRUIT_ID”子句轻松进行数据库查询。但是,如果我想要包括所有食物,我也需要一种方法来获取水果。

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

5 个答案:

答案 0 :(得分:2)

看看adjacency list model - 它并不完美(更新速度很慢),但在某些情况下(分层查询),这是一个很好的表现形式,特别是对于像你这样的问题。

答案 1 :(得分:1)

a whole book有很多用于在SQL中表示树的设计策略。值得关注的是纯粹的聪明点。​​

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

或者,您可以在构建查询之前浏览层次结构,这需要where category='food' or category='fruit'之类的内容。

答案 4 :(得分:0)

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

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