【问题标题】:Hierarchical filtering in a relational database关系数据库中的分层过滤
【发布时间】:2010-01-11 21:53:20
【问题描述】:

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

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

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

【问题讨论】:

  • 查询速度快得离谱,更新速度快得离谱?必须选择最多 1(一个)选项。
  • 那么让我们开始查询吧。更新将大大减少。

标签: database database-design hierarchical-data


【解决方案1】:

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

【讨论】:

  • 这是一个我以前不知道的迷人模型。显得非常有优势。我想知道我是否可以偷偷摸摸地做一些事情,而不必经常重新编号。也许在数字之间留下很大的差距,这样我就可以偶尔在不重新编号的情况下加入一些额外的类别。无论哪种方式,都需要考虑很多,谢谢!
【解决方案2】:

a whole book 充满了用 SQL 表示树的设计策略。值得一看的是纯粹的聪明点。​​

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这是一个有趣的想法。直觉上感觉它比邻接列表方法更像是一种 hack,但我会记住这一点。谢谢!
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 2017-05-23
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 2015-10-16
        • 2019-07-24
        • 1970-01-01
        相关资源
        最近更新 更多