1

Web サイトのナビゲーション マップを格納するスキーマを構築しようとしています。ページが子ページを持つことができ、それらの子ページがさらに子を持つことができるサイトマップとして典型的なデータセットを想像してください。例は次のオブジェクトです。

$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を使用しており、これが本当のボトルネックです。

このスキーマに関するご意見をお聞かせください。不明な点があれば、説明を求めてください。

ありがとう!

注 - 主な目的: 「インデックス」(各ノードの「スラッグ」パラメータも) でツリー内のアイテムを検索したいと考えています。私は本当にどこから始めればよいか迷っています-そのようなクエリ機能は存在しますか? 複数のクエリを使用してループで実行する必要がありますか?

4

1 に答える 1

3

このスキーマは、クエリと更新には最適ではありません。たとえば、subsubchild3競合状態に陥ったり、古いドキュメントを更新したりしないことを保証して更新することはできません。

クエリに関しては、現在考えられる唯一の方法は、私が信じている集約フレームワークを使用することです。

次のページを参照してください: http://docs.mongodb.org/manual/tutorial/model-tree-structures/ MongoDBマニュアル内のツリー構造をモデル化する方法、より具体的には「実体化されたパス」。クエリに関しては、その方法で成功しましたが、更新するのが難しく、オプションを比較検討して、クエリに最適なものを選択する必要があります。

于 2013-09-19T07:22:41.410 に答える