我正在一个需要在数据库中存储Tree结构的项目中,过去我已经处理过相同的情况,并且使用了特定的解决方案(如下所述)。
我知道没有BEST解决方案,通常最好的解决方案是提供主要优点的解决方案,但是毫无疑问,这是最糟糕的解决方案,我不想使用它。
正如我所说的,我需要:
我过去使用的解决方案包括使用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%')的子级列表非常容易缺点:
X和Y值是伟大的id关键将是太长了我进行了一些研究,发现我遇到的主要问题(获得一个节点的所有子节点,等等)的最佳解决方案是使用Preorder Tree Traversal解决方案(为简洁起见,我将发布一个链接,在其中解释该解决方案:HERE)
尽管此解决方案几乎在各个方面都比较好,但缺点是很大,结构的任何更改(节点的添加/删除/更改父节点)都需要重新创建整个左/右索引,而且此操作耗时和耗费资源。
话虽如此,任何建议都非常感谢。
哪一个对您来说是最佳的解决方案,可以最大程度地满足开头所述的需求?
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |