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