1、邻接表
邻接表是我最开始使用的模式,相当于只记录父级节点数据,通过递归查询可以获得最终的tree型关系。
| id | name | parent |
|---|---|---|
| 1 | a | 2 |
| 2 | b | 3 |
| 3 | c | 4 |
| 4 | d | 0 |
简单可用,适用于数据量较少的的树形结构。
2、物化路径
这个简单,原来父节点位置记录了整个url。
| id | name | url |
|---|---|---|
| 1 | a | /4/3/2/1 |
| 2 | b | /4/3/2 |
| 3 | c | /4/3 |
| 4 | d | /4 |
以空间换时间的解决方式。
3、闭包表 Closure Table
分两张表
- 主表
| id | name |
|---|---|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
- 关系表
| Ancestor(先祖节点) | Descendant(后代节点) | Distance(祖先与后代的距离) |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 1 | 3 | 2 |
| 1 | 4 | 3 |
| 2 | 2 | 0 |
| 2 | 3 | 1 |
| 2 | 4 | 2 |
| 3 | 3 | 0 |
| 3 | 4 | 1 |
| 4 | 4 | 0 |
嗯,挺费表的。
4、左右值编码
左右值编码通过记录左值、右值来确定在tree中位置
| id | name | left | right |
|---|---|---|---|
| 1 | a | 1 | 14 |
| 2 | b | 2 | 7 |
| 3 | c | 3 | 4 |
| 4 | d | 5 | 6 |
| 5 | e | 8 | 13 |
| 6 | f | 9 | 10 |
| 7 | g | 11 | 12 |
可以看出其实是一种先序遍历方法,同理后序遍历也可以做左右值编码。
5、 区间嵌套
区间嵌套看起来可以存储无限数据,但本人实现了一遍,通过分数存储左右值,5-6次插入很快就到达了(177145/177147, 177146/177147)对于无限变大的代理关系似乎还是不适合, 而且数理关系太复杂,通过小需求学习了一遍树结构存储已经足够,就不深入研究了。
结论
- 选择了 方法三 闭包表 Closure Table
- 点击标题可以快速跳转到参考链接
https://blog.csdn.net/qq_35916684/article/details/87099872