web-dev-qa-db-ja.com

mysqlではなくmongodbなどのnosqlデータベースを使用する場合

私はnosqlデータベースの概念に不慣れで、使用したことがありません。私が読んだ内容と理解した内容に基づいて、外部キーの概念がない場合に、データ間の参照を行うことができない場合に、それらが特にどのように役立つかはまだわかりません。

たとえば、「このユーザーが投稿したすべてのコメントを見つける」、「アルバムエンティティに属するすべての写真を見つける」などの単純なクエリをどのように実行しますか?.

Nosqlシステムは静的リレーショナルデータモデルから離れますが、そのような参照を追跡できますか?クエリで使用できる外部キーに類似したものはありますか?

13
akomada

一般的な用途

  • システムの作成時に明確に定義されていないデータ構造がある場合。たとえば、ユーザー設定をnosqlに保持する傾向があります。別の例は、ユーザーが実行時にフィールドを追加できる必要があるシステムでした-RDBMSでは非常に苦痛であり、NoSQLでは簡単です。

  • モデル構造の大部分が1つまたはいくつかのモデルオブジェクトを中心とし、ほとんどの関係が実際にはメインモデルオブジェクトの子オブジェクトである場合。この場合、実際の結合はほとんど必要ありません。連絡先管理システムは、たとえばnosqlで非常にうまく実装できることがわかりました。人は複数のアドレス、電話、電子メールを持つことができます。それぞれを別々のテーブルに入れる代わりに、それらはすべて同じモデルの一部になり、1つの人物オブジェクトを持ちます。

  • RDBMSで一般的に必要なモノリシックサーバーを1つ持つのではなく、複数のサーバーにまたがってデータをクラスター化することでメリットを得たい場合。

  • キャッシング。 RDBMSをメインデータベースとして使用したい場合でも、クエリ結果のキャッシュやカウンターなどのデータの保持にNoSQLデータベースを使用すると便利です。

  • ドキュメントの保管。一貫性のあるドキュメントを格納する場合、データベース内の一部のNoSQLデータベース(MongoDBなど)は、それらの格納に特化しています。

結合についてはどうですか?

正直なところ、私も最初は参加しないことがかなり怖いようでした。しかし、コツはSQLで考えるのをやめることです。アプリケーションを実行しているときは、実際にメモリにあるオブジェクトについて考える必要があります。これらは、多かれ少なかれ、領域としてNoSQLデータベースに保存する必要があります。

子オブジェクトを使用して完全なオブジェクトグラフを保存できるため、結合の必要性のほとんどが排除されます。そして、必要な場合は、弾丸をかじって両方のオブジェクトをフェッチし、アプリケーションコードに結合する必要があります。

幸いにも、スキーマを正しく設定すれば、ほとんどのドライバーが参加できます。

詳細については、実際に Martin Fowler をお勧めします。

19
ced-b

私は間違いなく、プロジェクトの計画段階(開発前、設計前)でこのようなデータベースを使用して、構造、関係、および特性がまだ不明であり、分析の対象となるデータを記録します。その後、すべてをリレーショナルモデルに適合させるようにします。

2
Mike Nakis

場合によっては、外部キーは必要ありません。例えば:

このユーザーが投稿したすべてのコメントを見つける

ユーザーに対応するドキュメントのcomments部分をロードするのと同じくらい簡単です。これは非正規化と呼ばれます。結合を持つ2つのセットを持つ代わりに、1つのドキュメントがあり、必要なものはすべてドキュメント内にあります。 1つのクエリ、結合なしパフォーマンスの向上

しかし、状況によっては、これがデータの重複につながる可能性があるため、1つのドキュメントから別のドキュメントへのリンクが適切な場合があります。この場合、興味があるのは MongoDBの正規化、外部キーと結合データベース参照 ページ、特にDBRefs機能です。

0