1

私たちは、ネイティブ文学を含むウェブサイトに取り組んでいます。ウェブサイト全体がライター中心として設計されています。各作家は 8000 ~ 10000 の記事/詩/本を持っています。

クライアントは、このアプリケーションのバックエンドとして mongoDB を使用する必要があります。初心者として、mongo でのデータ モデリングに混乱しています。

私の質問は、最善のアプローチは何ですか? 私のユースケースの埋め込みデータモデルまたは正規化されたデータモデル。

Writer:{
       _id: ObjectID
    WriterName: String
    Email: String
    Article :[
       _id: ObjectID
       ArticleName: String
       CreatedDate: Date
       comments: [
           body: String
       ]
    ]

または

Writer: {
    _id: ObjectID
    WriterName: String
    Email: String
}

Articles: {
    _id: ObjectID
    Writer_id: ObjectID
    ArticleName: String
    CreatedDate: Date
    comments: [
        body: String
    ]
}

すべてのライターの記事から上位 20 件の記事を取得する必要がある別のユース ケースがあります。このことを念頭に置いて、最善の解決策は何ですか?また、ドキュメントのサイズが 16MB を超える場合のドキュメントの影響について教えてください。

4

2 に答える 2

1

それは、修正されるデータの量と、データがどのように (頻繁に) 更新されるかによって異なります。

Article 配列を (ブログ システムのように) 常に更新すると、ドキュメントは最終的に大きくなり、元のディスク容量に収まらなくなり、ディスク上の MongoDB によって移動されます。これにより、ストレージ サイズが大幅に増加し、断片化が発生し、パフォーマンスが低下します (IO、ファイル システム上のドキュメントへのポインターで更新する必要があるインデックス)。さらに、この種のドキュメントは 16 MB を超える傾向があります。

たとえば、データがめったに変更されない本のカタログの場合、より便利でシンプルなデータ モデルを意味するため、埋め込みを考慮することができます。

Articles コレクション内にライター データ (名前、電子メール) を埋め込む/追加する 3 番目のオプションもあります。必要に応じて、ライターの電子メールが変更されたらアプリケーション コードを残してすべてのドキュメントを更新します。

したがって、ライターが 8000 ~ 10000 の記事/詩/本を持っている場合 (これらの数は変動すると予想されるため、この仮定を当てにしないでください)、埋め込みオプションは予測できない平均を意味します。ドキュメントのサイズと増加するパディング (ファクター)。その場合、私は埋め込みに反対します。

2 番目の懸念については、この場合の正規化は、クエリ パターンをもう少し簡潔にすることを意味します。たとえば、最上位の 20 個の記事を取得するために配列をスライスする必要はありません。

于 2013-11-14T16:16:09.977 に答える
0

使用シナリオを詳しく見ていく必要があると思います。通常 (私のように) 著者情報を見ている場合、本のリストや著者の略歴などが表示されることを期待しています。同じドキュメントにコメントを保存する必要はないと思いますが (そして、それらがたくさんある場合は、それらを分離しておくことをお勧めします)、すぐには必要ないからです。したがって、コメントを除いて、データ モデルの最初のバージョンは問題ないように見えます。別々のコレクションに保管することをお勧めします。

ドキュメントの最大サイズについて: 16MB は大量のデータです。この制限は、ドキュメントが大量の RAM とネットワーク帯域幅を使用しないようにするために行われます (mongodb が別のサーバーにある場合)。また、ドキュメントのサイズが 16MB を超える場合は、データ モデルに問題があると思います。

ドキュメントが 16MB を超えた場合、現在のバージョンの mongodb で正確に何が起こるかはわかりません。そのような状況に遭遇したことはありませんが、データはトリミングされると思います。

于 2013-11-14T16:17:12.047 に答える