在数据库中存储树形结构的数据,这是一个很是广泛的需求,典型的好比论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各类解决方案。sql
此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库做为存储的几种设计模式。数据库
id | name | parent_id |
1 | A | NULL |
2 | B | 1 |
3 | C | 1 |
4 | D | 2 |
上图表示了传统的设计方法之一,就是将树形结构的每个结点做为关系型数据库中的一行进行存储,每个结点保存一个其父结点的指针。设计模式
id | name | parent_id | left | right |
1 | A | NULL | 1 | 8 |
2 | B | 1 | 2 | 5 |
3 | C | 1 | 6 | 7 |
4 | D | 2 | 3 | 4 |
上图在模式1的基础上多了两列,left和right,至关于btree中的左右分支,分别存储了左右分支结点的最大值和最小值。并发
{ "name": "A", "children": [ {"name": "B", "children": [{"name": "D"}]}, {"name": "C"} ] }
将整个树结构存成一个文档,文档结构既树型结构,简明易懂。less
{"_id": "A", "children": ["B", "C"]} {"_id": "B", "children": ["D"]} {"_id": "C"} {"_id": "D"}
将每一个结点的全部子结点存起来nosql
{ "leaf": "A", "children": [ {"leaf": "B", "children": [{"leaf": "D"}] }, {"leaf": "C"} ] } {"_id": "A", ...} {"_id": "B", ...} {"_id": "C", ...} {"_id": "D", ...}
充分利用文档型存储schema-less的优势,先利用上面C方案存存储一个大的树形文档,再将每个结点的其余信息单独存储。数据库设计