我正在尝试构建一个架构来存储网站导航地图。将典型数据集描绘为站点地图,其中页面可以具有子页面,并且这些子页面可以具有更多子项。一个例子是以下对象:
$tree = array(
'home' => array(
'h1' => 'test',
'h2' => 'test2',
'copy' => 'copy here',
'slug' => '',
'children' => array(
'blah' => array(
'h1' => 'child1',
'h2' => 'child1',
'copy' => 'child copy here',
'slug' => 'blah',
'children' => array(
'blahsub' => array(
'h1' => 'subchild1',
'h2' => 'subchild2',
'copy' => 'child copy here',
'slug' => 'blahsub',
'children' => array(
'subsubchild1' => array(
'h1' => 'subsubchild1',
'h2' => 'subsubchild2',
'copy' => 'child copy here',
'slug' => 'subsubchild1'
)
)
),
'subchild2' => array(
'h1' => 'subchild1',
'h2' => 'subchild2',
'copy' => 'child copy here',
'slug' => 'subchild2',
'children' => array(
'subsubchild2' => array(
'h1' => 'subsubchild1',
'h2' => 'subsubchild2',
'copy' => 'child copy here',
'slug' => 'subsubchild2'
)
)
),
'subchild3' => array(
'h1' => 'subchild1',
'h2' => 'subchild2',
'copy' => 'child copy here',
'slug' => 'subchild3',
'children' => array(
'subsubchild3' => array(
'h1' => 'subsubchild1',
'h2' => 'subsubchild2',
'copy' => 'child copy here',
'slug' => 'subsubchild3'
)
)
)
)
),
'another' => array(
'h1' => 'child2',
'h2' => 'child2',
'copy' => 'child copy here',
'slug' => 'another'
)
)
)
);
$ tree的每个级别都由它的URI索引,每个级别可以包含N个子级,所有子级本身都可以有子级。
我最初的想法是使用这个架构是直观的,但我不确定查询树的特定节点。我接近这种架构错了吗? (目标不是要在每个请求上进行多次查询以“构建”这样的树,而是将其拉出一次并在内存中使用它。
注意:我仍然可以进行查询以拉取整个树,然后通过下标运算符直接访问每个节点。这应该比我在树中的多个查询提供更好的性能。目前正在使用mysql,这是一个真正的瓶颈。
请分享您对此架构的意见,并在有不清楚的地方要求澄清。
谢谢!
注意 - 主要目标:我想通过它们的“索引”(也是每个节点的“slug”参数)在树中找到项目。我真的失去了从哪里开始 - 这样的查询功能是否存在?必须在具有多个查询的循环中完成吗?
答案 0 :(得分:2)
此架构不是查询和更新的最佳选择。例如,您不能更新subsubchild3
以保证您不会遇到竞争条件或更新过时的文档。
至于查询,目前唯一可以想到的方法是使用我认为的聚合框架。
你应该看看这个页面:http://docs.mongodb.org/manual/tutorial/model-tree-structures/关于如何在MongoDB手册中建模树结构,更具体地说是“物化路径”。在查询方面,我发现该方法取得了成功,但更新起来比较困难,您只需权衡选项并选择最适合您查询的方法。