BigtableとNOSQLに関するいくつかの記事を読みました。それらがJOIN操作を回避することは非常に興味深いです。
基本的な例として、従業員と部門のテーブルを取り上げ、データが複数のテーブル/サーバーに分散していると仮定します。
知りたいだけなのですが、データが複数のサーバーに分散している場合、どのようにJOINまたはUNION操作を行うのでしょうか。
非常に大きなデータがある場合、おそらく結合を避けたいでしょう。これは、個々のキー検索のオーバーヘッドが比較的大きいためです(サービスは、クエリするノードを特定し、それらを並行してクエリして、応答を待つ必要があります)。オーバーヘッドとは、スループットの制限ではなく、レイテンシを意味します。
これは、多くの場合、多くの異なるノード(多くの場合)に到達することになる多くの外部キールックアップを実行する必要があるため、結合は非常にひどいものになります。したがって、これをパターンとして回避する必要があります。
それがあまり頻繁に発生しない場合は、おそらくヒットを取得できますが、それらの多くを実行する場合は、データを「非正規化」する価値があるかもしれません。
NoSQLストアに保存される種類のものは、通常、最初はかなり「異常」です。ルックアップを容易にするために、さまざまな場所で同じデータを複製することは珍しくありません。
さらに、ほとんどのnosqlは(実際には)セカンダリインデックスもサポートしていません。つまり、他の基準でクエリを実行する場合は、データを複製する必要があります。
従業員や部門などのデータを保存している場合は、従来のデータベースを使用するほうがよいでしょう。
複数の選択を行い、アプリケーションでデータを手動で結合する必要があります。詳細は this SO post を参照してください。その投稿から:
Bigtableデータセットは、SQLのサブセットに基づくGQL( "gee-kwal")と呼ばれる言語を使用して、AppEngineなどのサービスからクエリを実行できます。 GQLから目立って欠けているのは、あらゆる種類のJOINコマンドです。 Bigtableデータベースの分散された性質のため、2つのテーブル間で結合を実行することは非常に非効率的です。代わりに、プログラマーはこのようなロジックを自分のアプリケーションに実装するか、それが不要になるように自分のアプリケーションを設計する必要があります。
カレブの権利。データがKey-Valueストアにうまく適合しない場合は、NoSQLソリューションを使用してカスタムコードを記述します。 Map-Reduce/Async処理とカスタムビューキャッシュは一般的です。ブライアンエイカーは、2009年11月のOpenSQLCamp http://www.youtube.com/watch?v=LhnGarRsKnA で非常に面白い(そして風刺的で偏った)プレゼンテーションを行いました。参加について聞くには、40秒でスキップしてください。