1

私は、多くの同時アクセスが確実に行われるプロジェクト用に、真新しい MongoDB データベースの設計を始めています。私が MongoDB を選んだのは、MongoDB のスケーラビリティとクエリの速度を知っているからです。

ただし、MongoDB を使用する場合でも、パフォーマンスのために、データベースへのアクセス回数をできるだけ少なくする必要があることはわかっています。

別の NoSQL データベースである Apache Cassandra が「クエリ ファースト」アプローチを提唱していることは知っています。つまり、クエリを最初に考え、それに従ってデータ構造を編成する必要があります。

さて、同じ原則が MongoDB に当てはまるかどうか疑問に思っています。

これまでのところ、これに関する関連する議論はウェブ上で見つかりませんでした。

4

2 に答える 2

1

Mongo でデータを整理してモデル化するために、学習して検索したい単語はdenormalizationです。Mongo を使用するときは、間違いなく最初にクエリを考えます。モデリングだけでなく、インデックス作成にも使用できます。

非正規化の方法について Mongo カンファレンスで聞いた良いルール:

  1. データがかなり静的な場合は、先に進んで、データをドキュメントに非正規化/埋め込みます。
  2. データが頻繁に変更される場合は、別のドキュメントへの参照を作成します。

Mongo で 1 年間の作業を行った結果、これが非常に真実であることがわかりました。頻繁に変更されるデータを埋め込むことは、私たちに多くの苦痛をもたらしました。

于 2013-04-18T17:40:49.753 に答える
0

すべてのデータを「そのまま」保存することはできず、後で任意のクエリとテーブル (コレクション) 間の結合を作成することはできないため、MongoDB を使用している間は最初にクエリを実行することが重要です。MonogDB はドキュメント指向のデータベースです。異なるテーブルからの結果セットではなく、常にドキュメントを操作します。

良いニュースは、MongoDB がスキーマレスであることです。ドキュメントを好きなように構造化でき、必要に応じてドキュメントのスキーマを変更することもできます。しかし、事前に考える必要があるのは、どのように (どのような種類のキーとインデックスを使用して)、いつ (結合を実行できないことを忘れないでください!) それらを取得するかです。

ryan1234 が示唆したように、非正規化はこれに対処するためのオプションです。ただし、これによりデータが冗長になり、時間の経過とともに保守が困難になる可能性があります。したがって、おそらくすべてを非正規化したくないでしょう。アプリケーション コードでこれらの欠点に実際的に対処する必要があります。そのためのいくつかの提案を次に示します。

  • メモリ フットプリントが許容できる限り、ルックアップ テーブルなどの頻繁に使用されるデータをプリフェッチします。
  • Web インターフェイスでのリクエストなど、オンデマンドで非常に高速に利用できるようにする必要があるデータを決定します。理想的には、単一のリクエストに必要なすべてのデータを提供するインデックスを使用してクエリできる単一のキーを持つだけです。
  • map reduce や queue などの長時間実行されるジョブを使用して、バックグラウンドで処理できるデータを決定します。または、インデックスを使用して後で取得できるレポートを準備するなど、データを処理するカスタム cronjob スケジュール ジョブを使用することもできます。
  • 複数のリクエストを行い、クライアントでデータを結合します。たとえば、Web クライアントを使用している場合、データをプルするために複数の後続のリクエストを実行できます。これは、おそらく RDBMS を使用して 1 回のリクエストで実行したことでしょう。インデックスが作成されている場合、MongoDB のクエリは非常に高速です。複数のクエリを同期してサーバー上のデータを結合しない限り、多くのリクエストを実行しても問題はありません。クライアントでこれを行うと、UI を段階的に構築しながら、スタック全体 (ロード バランサー、キャッシュなど) を活用できます。
于 2013-04-18T20:20:17.553 に答える