【问题标题】:Multiple Trees with Hierarchical Data (Left and Right values)具有分层数据的多棵树(左值和右值)
【发布时间】:2011-06-23 22:00:33
【问题描述】:

在单个表中维护多个树有哪些问题?

拥有多个树的动机是在开始插入节点时避免对所有节点进行过度更新。每棵树都是完全独立的实体。

示例表:

tree_id  | id  | lft | rgt | parent_id |   various fields . . .
---------------------------------------------------------------------
1        |  1  |  1  |  4  |   NULL    |   ...
1        |  2  |  2  |  3  |    1      |   ...
2        |  3  |  1  |  4  |   NULL    |   ...
2        |  4  |  2  |  3  |    3      |   ...

【问题讨论】:

  • 请更好地重申您的问题。只需回答“是”或“否”即可满足您当前形成的问题。
  • @FinalForm 谢谢,这样更好吗?
  • 是的。正确地陈述问题是有意义的,因为人们回答你的问题会得到分数。如果这不是您想要的问题,那么就不可能回答未知的问题。

标签: php mysql database hierarchy nested-sets


【解决方案1】:

在一个表中存储多棵树是很常见的,只需确保正确存储构成树的值,否则会导致数据完整性问题,例如无意义的树构造。

假设我们有一棵二叉树,(如您的示例中的那棵)。如果一棵树是 5 深度。 ((2^n)-1) = (2^5 - 1) 节点将存在或数据库中的 31 行这是微不足道的。即使在 10 深度,它仍然是少量的行,但会是一棵相当巨大的树。所以有多个树,X,在数据库中会有 X((2^n)-1) = rows...,这还不错。因此,一个表中可能存在一百棵树,并且只有 100k 行,相对较小。

另外,假设每棵构建的新树都存储在自己的表中,那么很快,随着时间的推移,数据库将充满相当多的表,以匹配现有树的数量。制作不需要的额外表似乎不是一个好主意,在代码方面增加了不必要的复杂性,不得不访问这些多个表。

仔细查看您的表格,它在列方面看起来不太正确,但我确信表格示例只是快速抛出的一些东西,向我们展示了您的意思。

tree_id, node_id, left_node_id, right_node_id, various_fields...

嗯,一定要索引那些 _id 字段。

【讨论】:

  • 抱歉,这应该是 (2^10-1) 或 999 行。一棵深度为 10 的树是一棵巨大的怪树,它只占用 999 行。
  • 感谢您的详细回答。我错过了问题的两列......在一秒钟内修复。目前,该表有一个单独的树,其中 idparent_idlftrgt 分别编入索引。我认为这样索引lftrgt 可能比使用复合索引更好。
  • 我添加了一个单独的表,其中列出了每个不同的树以及初始节点,并相应地更新了我的脚本。它似乎工作得很好。再次感谢您对这种方法的鼓励:-)
  • @LeaHayes 是的,没问题。请记住为您的 _id 列建立索引,这对于长期而言非常重要。并确保表是 InnoDB 而不是 MyISAM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2013-03-13
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多