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


13

私はnosqlデータベースの概念は初めてであり、使用したことはありません。私が読んだことや理解したことを基にすると、外部キーの概念がない場合、データ間で参照を作成できない場合に、それらが特に役立つ方法はまだわかりません。

たとえば、「このユーザーが投稿したすべてのコメントを検索する」、「アルバムエンティティに属するすべての写真を検索する」などの簡単なクエリを実行するにはどうすればよいでしょうか。

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

回答:


19

一般的な用途

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

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

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

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

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

結合はどうですか?

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

完全なオブジェクトグラフを子オブジェクトとともに保存できるため、結合の必要性のほとんどがなくなります。そして、必要な場合は、弾丸を噛んで両方のオブジェクトを取得し、アプリケーションコードに参加する必要があります。

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

さらに読むには、実際にMartin Fowlerをお勧めします。


2

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


2
何?... なぜ?...
ロバートハーベイ

したがって、実際には、たとえばmysqlのような一般的な名前、電子メールなどのユーザー情報など、実際にはあまり変わらないことがわかっているデータにリレーションモデルを使用できます。そして、それをnosqlデータベースと組み合わせて使用​​し、ユーザーアクティビティログなどの非構造化された不規則なデータを処理します。分割責任の並べ替え。?または、nosqlデータベースから開始し、すべてが設定されたらリレーショナルモデルへの完全な移行を実行することを提案しましたか?
アコマダ

分析が始まる前にすでにデータがあるシナリオでは(たとえば、センサーが既にデータを吐き出している既存の工場を制御するソフトウェアを書き換えるように呼び出された場合)、すぐにnosqlデータベースのデータのキャプチャを開始します。そして、可能であれば、リレーショナルモデルに適合するようにします。不可能な場合は、nosqlを続行します。
マイクナキス

0

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

このユーザーが投稿したすべてのコメントを検索

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.