我正在开展一个项目,我需要在数据库中存储Tree结构,过去我已经处理过相同的场景,并使用了特定的解决方案(如下所述)。
我知道没有最佳解决方案,通常最好的解决方案是给予主要优势的人,但毫无疑问是最糟糕的解决方案,我不想使用它......
正如我所说的,我需要:
我过去使用的解决方案包括使用VARCHAR(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:
X
和Y
值非常好id
密钥太长了我做了一些研究,我发现的主要问题(获得一个节点的所有孩子等)的最佳解决方案是使用Preorder Tree Traversal
解决方案
(为了简洁起见,我将发布解释解决方案的链接:HERE)
虽然这个解决方案在几乎每个方面都更好,但它有一个巨大的缺点,结构的任何变化(添加/删除/更改节点的父节点)需要重新生成整个左/右索引,此操作是时间和资源消耗。
话虽如此,我们非常感谢任何建议。
哪个是最适合您的最佳解决方案?