美文网首页
树状结构的数据库链表设计

树状结构的数据库链表设计

作者: 藝龍 | 来源:发表于2017-10-23 15:12 被阅读0次

使用Modified Preorder Tree简直是必须的。
网上可以搜一下modified preorder tree travesal找到相关资料。参考 http://www.sitepoint.com/hierarchical...


id,本节点的primary key
parent_id,其值为父节点的primary key
key,忘了学名叫啥了,你可以称为线索
level,表示当前节点到根节点的距离
其中,key字段的值为:从跟节点到父节点的primary key,中间用任意非数字符号分割。

例如以下树状结构

├── a
│   ├── d
│   │   ├── p
│   │   ├── q
│   │   └── r
│   ├── e
│   └── f
├── b
│   ├── x
│   ├── y
│   └── z
├── c

对应的数据库表值为:

| id | value | parent_id | key    | level |
| 1  | a     | 0         | "-"    | 1     |
| 2  | b     | 0         | "-"    | 1     |
| 3  | c     | 0         | "-"    | 1     |
| 4  | d     | 1         | "1-"   | 2     |
| 5  | e     | 1         | "1-"   | 2     |
| 6  | f     | 1         | "1-"   | 2     |
| 7  | x     | 2         | "2-"   | 2     |
| 8  | y     | 2         | "2-"   | 2     |
| 9  | z     | 2         | "2-"   | 2     |
| 10 | p     | 4         | "1-4-" | 3     |
| 11 | q     | 4         | "1-4-" | 3     |
| 12 | r     | 4         | "1-4-" | 3     |

于是,在给定一个节点d的时候,
查找d的所有子孙节点:select * from table_name where key like "${d.key}-${d.id}-%"
查找某个节点的所有子节点:select * from table_name where key like "${d.key}-${d.id}-%" and level=${d.level}+1
这个设计,结构非常简单。key和level是辅助字段,维护这两个字段成本很低,即使全部重建要比MPT简单多了。

相关文章

网友评论

      本文标题:树状结构的数据库链表设计

      本文链接:https://www.haomeiwen.com/subject/tkdauxtx.html