具有分层数据的多个树(左和右值)

时间:2011-06-23 22:00:33

标签: php mysql database hierarchy nested-sets

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

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

示例表:

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      |   ...

1 个答案:

答案 0 :(得分:1)

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

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

此外,假设构造的每个新树都存储在自己的表中,那么很快,数据库将随着时间的推移填充相当多的表以匹配存在的树的数量。并且,制作不需要的额外表格似乎不是一个好主意,在代码端添加了不必要的复杂性以访问这些多个表。

详细查看你的表格,它在列数方面看起来不太正确,但我确信表格示例只是快速抛出来向我们展示你的意思。

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

嗯,请务必将这些_id字段编入索引。