【问题标题】:Multiple tables in nested sets hierarchy嵌套集层次结构中的多个表
【发布时间】:2009-07-06 17:23:27
【问题描述】:

我有许多不同的项目存储在不同的 MySQL 表中,我想将它们放入树层次结构中。使用邻接表模型,我可以为每个表添加一个 parent_id 字段,并使用外键关系链接这些表。

但是,我想使用嵌套集/修改的预序树遍历模型。数据将在严重偏向于读取的环境中使用,而我希望运行的查询类型支持这种方法。

问题是我在嵌套集合上的所有信息都假设您只有一种类型的项目,存储在一个表中。我能想到的解决方法是:

  • 在树中有多个外键字段,每个表/项目类型一个。
  • 在树结构中存储项目表的名称以及项目 ID。

至少可以说这两种方法都不优雅,那么有更好的方法吗?

【问题讨论】:

  • 除了你提到的那些之外,我想不出任何办法来做到这一点。我倾向于第二个,在树节点中存储一个类型鉴别器,然后让项目表引用树节点。我什至对树节点和相应的项目使用相同的主键,使项目表的 PK 也是引用树表的 FK。这是大多数对象关系映射器处理继承 FWIW 所采用的广泛方法。

标签: mysql tree hierarchical-data nested-sets adjacency-list


【解决方案1】:

RDBMS 不适合存储层次结构,而您的用例使情况变得更糟。我认为您将使用 RDBMS 获得对您自己的建议进行更精细调整但仍然丑陋的变化。恕我直言,其他数据模型将为您的问题提供更好的解决方案,例如图形数据库或文档数据库。文章Should you go Beyond Relational Databases? 很好地介绍了这类东西。

【讨论】:

    【解决方案2】:

    您有几种类型的树,以及一个包含所有树类型的树信息(即左/右值)的表?

    如果您有多种类型的树,为什么不为每种类型使用不同的表?

    【讨论】:

    • 没有。一棵树,多种数据类型。想象一张桌子,每个国家、城市、商店和咖啡馆。每个表都包含不同的数据,但所有项目都有一个名称和 ID,可以在单个树中使用,以表示商店和咖啡馆在地理层次结构中的位置。
    • 鉴于类型具有不同的数据字段,我不明白您希望如何在单个 select 语句中 select 国家、城市、商店和咖啡馆的数据。或者如果它们没有不同的数据字段,那么它们就不是不同的数据类型,并且都可以是同一个表。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多