1

我正在尝试构建一个模式来存储网站导航地图。将典型的数据集想象成一个站点地图,其中页面可以有子页面,而这些子页面可以有更多的子页面。一个例子是以下对象:

$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”参数)在树中查找项目。我真的不知道从哪里开始——这样的查询功能是否存在?必须在具有多个查询的循环中完成吗?

4

1 回答 1

3

此模式对于查询和更新来说不是最佳的。例如,您不能更新subsubchild3保证您不会获得竞争条件或更新过时的文档。

至于查询,目前唯一可以想到的方法是使用我认为的聚合框架。

您应该查看此页面:http ://docs.mongodb.org/manual/tutorial/model-tree-structures/ ,了解如何在 MongoDB 手册中对树结构进行建模,更具体地说是“物化路径”。在查询方面,我发现该方法取得了成功,但是,它更难更新,您只需要权衡您的选项并选择最适合您的查询的方法。

于 2013-09-19T07:22:41.410 回答