0

MongoDB スキーマを設定するためのちょっとしたガイダンスを探しています。シナリオは次のとおりです。

私は人々のための保存ブックマーク機能を作成しています。DB に保存する必要があるのは、ユーザー名、タイトル、およびリンクだけです。このことから、JSON を出力し、特定のブックマークまたはユーザーのフィード全体を照会するサービスを作成する必要があります。実装とパフォーマンスの両方の観点から、2 つの設定のうちどちらがより理にかなっていますか?

A) 各ブックマークは独自のオブジェクトです。

{
    "_id":  ObjectId("abcd1234"),
    "username": "Choy",
    "title": "This is my first link",
    "url":  "http://www.google.com" 
},
{
    "_id":  ObjectId("abcd1234"),
    "username": "Choy",
    "title": "This is my second link",
    "url": "http://www.bing.com"
}

B) 各ユーザーは独自のオブジェクトです。

{
    "_id": "Choy",
    "bookmarks": {
        "abcd1234": {
            "title": "This is my first link",
            "url": "http://www.google.com"
        },
        "abcd12345": {
            "title": "This is my second link",
            "url": "http://www.bing.com"
        }
    }
}

特定のブックマークを簡単に照会、更新、および削除できるので、最初は (A) の方が理にかなっていました。しかし、アプリケーションの観点からは、(B) 個人のすべてのブックマークを一覧表示したい場合は、aを実行findOne(username)_idた後に各レコードを反復処理してfind(username)配列に変換し、次にJSON(これは少しメモリ集約的だと思います)。

一方、(B) で新しいブックマークを追加するには、レコードを取得し、新しいブックマークをプッシュして保存する必要があるため、余分な手順になります。

4

1 に答える 1

3

MongoDB に has-a 関係がある場合、通常は、データを所有するオブジェクトにデータを埋め込むことが最善の決定です。

目標は、できるだけ少ない検索でユーザーのニーズを満たすことです。これは、ドキュメントを検索するたびに時間がかかるためです。ユーザーからのすべてのブックマークが必要ではなく、特定のブックマークだけが必要な場合は、いつでもドット表記を使用してオブジェクトに到達し、フィールドのサブセットを取得できます。

関係の代わりに集計は、ユーザーを削除または名前変更するときにも役立ちます。MongoDB は SQL データベースのように自動カスケードを行うことができないため、その場合、孤立したデータを自分で処理する必要があります。しかし、ユーザー ドキュメントが自己完結型の場合、これは問題になりません。

したがって、解決策B)をお勧めします。

于 2012-11-14T19:53:30.437 に答える