【问题标题】:Is it considered bad design to combine the adjancey list model and the nested sets model?将邻接表模型和嵌套集模型结合起来是否被认为是糟糕的设计?
【发布时间】:2010-02-23 14:10:49
【问题描述】:

我正在努力在 MySQL 中构建树形结构,并且一直在尝试不同的数据表示方式。但是,无论我怎么切,都有不足之处。

嵌套集模型允许我轻松选择树的整个分支 - 这是我需要做的。然而,选择一个节点的直接子节点并不容易。

邻接表模型非常适合获取直系子节点,但不适用于返回整个树的分支。

我想知道,构建这样的树结构有什么特别不好的地方:

TABLE: Tree
    ID
    name
    lft
    rgt
    parentID

所以我拥有的是邻接表模型和嵌套集模型都在同一个表中。这样我就可以使用/或,这取决于我选择的情况。

人们的想法是什么?这是允许的吗? (花生酱和巧克力终于在一起了?)或者这被认为是糟糕的设计?

提前致谢,

【问题讨论】:

  • 您是否也考虑过构建传递闭包?

标签: mysql nested-sets adjacency-list


【解决方案1】:

我自己强烈推荐它。这是 CakePHP 用于其树结构的样式,正如您所指出的,它为您提供了极大的灵活性。你只需要做更多的工作来确保你的树的完整性,但这是非常值得的。

【讨论】:

    【解决方案2】:

    不,它的设计一点也不差。至少在我看来。

    然而,我只会实现一个。例如,我使用邻接列表模型作为添加新元素和检索的主要方法。(显然检索,因为它很容易)但是,我还为嵌套集添加了 parentIds。

    这样做的好处是我可以随时重建我的 ALM,如果我保留 parentId,我可以轻松快速地移动东西。

    我不会在您的代码中同时使用,只是将它放在后台...

    编辑的评论

    您提到要选择直系子女并不容易。我想你可能做错了什么。即使在 Adjacency List 中选择直系子代也非常容易。

    如果您创建一个新问题,我将回答如何做到这一点。

    【讨论】:

    • 好吧,我需要做的不仅仅是选择直接子节点...如果我使用 LIKE 匹配一组节点,我需要选择每个节点,一个逗号分隔的列表每个节点的直接子节点,以及每个节点的祖先的逗号分隔列表。 (!!!) 如果可能的话,我希望在单个 SQL 中做到这一点。当然,我会把它作为一个新问题发布。敢于挑战,咧嘴一笑? :)
    • 如果您提供足够的信息,我会看看。但从你上面的简要描述看来,这似乎相当困难。
    • 谢谢,感谢您的帮助。我发布了这个问题。
    • 在嵌套集模型中选择直接子代实际上并不是很简单。请参阅此处:dev.mysql.com/tech-resources/articles/hierarchical-data.html 并在该页面上搜索“直属下属”。
    猜你喜欢
    • 2012-02-28
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多