树形结构存储方案(三级分销的实现思路)
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
- 点击标题可以快速跳转到参考链接