61

mongoでデータをモデル化するのに助けが必要です。私の経験のほとんどはリレーショナルDBでしたが、mongoを使って始めたばかりです。さまざまなイベントのデータをモデリングしています。

  1. の各「イベント」には同じフィールドがあります。
  2. 各「イベント」には、数百から数百万のドキュメント/行があります
  3. イベントは動的です。つまり、必要に応じて新しいイベントが作成されます。つまり、新しい「2016年夏季オリンピック」イベントを作成するかもしれません。

おそらく最も重要なのは、イベント(CRUD操作)を処理するときに、ユーザーがイベント名を指定する必要があることです。

これまでのところ、これを行うにはいくつかの方法がありますが、データモデルを「間違った」方法で設定する際に大きな間違いを犯したくありません。

1)すべてのイベントのデータを含む1つの「イベント」コレクション。'イベント'名のインデックス。クエリは次のようになります。

db.events.find({event: 'Summer Olympics 2012');
{event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... }
{event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... }

db.events.find({event: 'Summer Olympics 2013'})
{event: 'Summer Olympics 2013', attributes: [{name: 'steve smith', .... }
{event: 'Summer Olympics 2013', attributes: [{name: 'amy jones', .... }

2)すべてのイベント名を追跡するためのコレクション付きの新しいイベントごとのコレクション。各イベントは異なるコレクションに格納されるため、イベント名のインデックスは必要ありません。

// multiple collections, create new as needed
db.summer2012.find() // get summer 2012 docs

db.summer2016.find() // get summer 2016 docs

//'events' collection
db.events.find() // get all events that I would have collections for
{name: 'summer2012', title: 'Summer Olympics 2012'};
{name: 'summer2016', title: 'Summer Olympics 2016'};

#1の場合、100のイベントに到達すると、イベントの1つに500のドキュメントしかない場合でも、「イベント」ごとのルックアップが遅くなることが少し心配です。

#2の場合、毎回新しいコレクションを作成してイベントが発生することで、ここでmongoモデルを「幅木」にしますか?

どちらがより良いパフォーマンスになるのか、またはどちらかが将来さらにトラブルに巻き込まれるのかどうかは本当にわからないので、コメント/アイデアは大歓迎です。私は(mongoのサイトを含めて)周りを見回しましたが、具体的な答えは本当に見つかりません。

4

1 に答える 1

75

ここのmongoドキュメントから:データモデリング

特定の状況では、単一のコレクションではなく、複数のコレクションに情報を保存することを選択する場合があります。

さまざまな環境やアプリケーションのログドキュメントを保存するサンプル収集ログについて考えてみます。ログコレクションには、次の形式のドキュメントが含まれています。

{ログ: "dev"、ts:...、情報:...} {ログ: "デバッグ"、ts:...、情報:...}

ドキュメントの総数が少ない場合は、ドキュメントをタイプ別にコレクションにグループ化できます。ログについては、logs.devやlogs.debugなどの個別のログコレクションを維持することを検討してください。logs.devコレクションには、開発環境に関連するドキュメントのみが含まれます。

一般に、コレクションの数が多いと、パフォーマンスが大幅に低下することはなく、非常に優れたパフォーマンスが得られます。個別のコレクションは、高スループットのバッチ処理にとって非常に重要です。

また、10genの男と話しました。非常に大きなコレクションの場合、彼は、より小さな、より具体的なコレクションに分離することの複数の利点を挙げました。すべてのデータに1つのコレクションを使用し、インデックスを使用することについての彼のコメントは次のとおりです。

あなたが何かをすることができるからといって、あなたがすべきだという意味ではありません。データを適切にモデル化します。1つの大きなコレクションとインデックスに保存するのは簡単かもしれませんが、それが常に最善のアプローチであるとは限りません。

于 2013-03-27T15:12:15.390 に答える