2

これは、MongoDBでよくある質問です。いつ埋め込むか、いつ参照するかです。

しかし、私の場合、これはどういうわけかジレンマのようです。埋め込み可能なリファレンスのあるドキュメントがありますが、ディスクのサイズがかかります。しかし、参考にすると、かなりのパフォーマンスコストがかかります。

これが例です。問題として「詳細」を持つこのメンバーがいるとします。

Member: {
    _id: "abc",
    detail: {
        name: "Stack Overflow",
        website: "www.stackoverflow.com"
    }
}

このメンバーの詳細をすべてのブログに含めたいのですが、このメンバーが「asdf」を作成すると、表示されるすべてのブログにメンバーの詳細が表示されます。したがって、ブログドキュメントに対して実行できるオプションは2つあります。

まず、メンバーの_idを入力するだけで参照を作成します。

Blog: {
    _id: 123,
    memberId: "asdf"  ---> will be used as reference to query specific member
}

または次に、代わりにメンバーをブログに埋め込みます。

Blog: {
    _id: 123,
    member: {
        _id: "asdf",
        detail: {
            name: "Stack Overflow",
            website: "www.stackoverflow.com"
        }
    }
}

したがって、最初のオプションでは、パフォーマンスの問題であるメンバーの別のクエリが必要です。ただし、2番目のオプションの方が高速です。クエリを実行する必要があるのは一度だけですが、ブログの数が増えると、埋め込みドキュメント「メンバー」の冗長データ用にディスクが大きくなります。

PS:この例でわかるように、メンバーとブログの関係は1対多であるため、メンバーは多くのブログを持つことができますが、メンバーの詳細変数は同じままです。「名前」と「ウェブサイト」。

この場合、より良い意見はありますか?あなたが3番目の解決策も持っているならそれは素晴らしいでしょう。前に感謝します。

4

1 に答える 1

1

フォーラムの署名のように、メンバーの詳細を分けておくのは問題ないと思います。そうすれば、メンバーが詳細を更新すると、アプリケーションが以前のすべての投稿で重複データを更新しなくても、すべての投稿に現在の情報が表示されます。

あなたの説明から、ユーザーがページに作成するすべてのコメントではなく、ユーザーが作成するブログ投稿にのみこれを表示しているように思われます。

ユーザーごとの追加クエリのパフォーマンスコストが心配な場合は、単一のDBクエリですべてのブログ情報を取得するのではなく、常にそのユーザーデータ(または生成されたページ出力)をキャッシュできます。問題にならない可能性のあるユースケースに最適化する前に、アプリケーションが実際の使用でどのように動作するかを確認します。

別のアプローチは、追加のユーザーの詳細のみをAjaxホバーとして表示することです(SOが確立されたユーザーのより多くの情報を表示する方法と同様です) 。

于 2012-08-04T08:26:52.753 に答える