在数据库中存储不平衡树

时间:2015-07-22 11:33:08

标签: mysql sql tree

我正在开展一个项目,我需要在数据库中存储Tree结构,过去我已经处理过相同的场景,并使用了特定的解决方案(如下所述)。

我知道没有最佳解决方案,通常最好的解决方案是给予主要优势的人,但毫无疑问是最糟糕的解决方案,我不想使用它......

正如我所说的,我需要:

  • 存储不平衡的树结构
  • 任何节点都可以拥有"无限制"少数儿童
  • 能够轻松获取一个节点的所有子节点(递归地)
  • 能够轻松地重建"树形结构

我过去使用的解决方案包括使用VARCHAR(X * Y)主键,其中:

  • X是"假设"最大可能水平
  • Y是"假设"的字符编号。一个节点的最大直接子节点数......

如果我有:   - 最多3级,然后X = 3
  - 每个节点最多20个直接儿童,Y = 2(20个有两个字符 - 最多可存储99个孩子)

PRIMARY KEY列将创建为VARCHAR(6)

ID是PARENT ID + NODE_ID

的复合组合

NODE ID是左侧填充零的增量数值。

第一级节点将被存储为:
[01,02,03,04,...,99]

第二级节点将存储为:
[0101, 0102, 0103, ..., 0201, 0202, 0203, ... , 9901, 9999]

第三级节点将存储为:
[010101, 010102, 010103, ..., 020101, 020102, 020301, ... , 990101, 999999]

依旧......

优点:

  • 重建树很容易
  • 非常容易获取一个特定节点的子列表(即select ... where id like '0101%'
  • 标识符和父链接只有一列。

CONs:

  • 必须定义最大数量的儿童/等级
  • XY值非常好id密钥太长了
  • VARCHAR类型作为主键
  • 更改树结构(将一个节点从一个父节点移动到另一个节点)将很难(如果不是不可能)和消费,因为必须为节点及其所有子节点重新创建整个ID。

预订树遍历

我做了一些研究,我发现的主要问题(获得一个节点的所有孩子等)的最佳解决方案是使用Preorder Tree Traversal解决方案 (为了简洁起见,我将发布解释解决方案的链接:HERE

虽然这个解决方案在几乎每个方面都更好,但它有一个巨大的缺点,结构的任何变化(添加/删除/更改节点的父节点)需要重新生成整个左/右索引,此操作是时间和资源消耗。

结论

话虽如此,我们非常感谢任何建议。

哪个是最适合您的最佳解决方案?

0 个答案:

没有答案