SQL 環境から来る場合、バケットをテーブルとして扱い、小さな個々のレコードをそこに保存するのは簡単です。多くの場合、セカンダリ インデックスに依存してデータを取得します。Riak はコンシステント ハッシュを使用するキーと値のストアであるため、これは多くの場合、最も効率的またはスケーラブルなアプローチではありません。
Riak のキーに基づくルックアップにより、データを保持しているパーティションを直接識別でき、調整ノードはこれらのパーティションに直接クエリを実行できます。セカンダリ インデックスをクエリするとき、Riak はインデックスに一致する可能性のあるデータがどのパーティションに存在するかを知りません。したがって、一致するすべてのオブジェクトが確実に見つかるようにするには、クエリを多数のパーティションに送信する必要があります。これは「カバレッジ クエリ」と呼ばれ、バケットに 3 の n_val が使用されると仮定すると、すべてのパーティションの少なくとも 1/3 をクエリする必要があることを意味します。これは通常、クラスターの負荷が高くなり、直接的なキー ルックアップと同様にスケーリングされません。レイテンシも高くなる傾向があります。
したがって、Riak を使用する場合は、データを構造化して、非正規化などにより直接キー検索を可能な限り使用できるようにすることをお勧めします。
メッセージ/投稿をユーザーや会話など、何らかの方法でグループ化できる場合は、個別のオブジェクトとしてではなく、このグループ化を表す単一のオブジェクトにそれらを保存することが理にかなっている場合があります。
投稿がテキストまたは画像で構成され、会話スレッドにリンクされていると仮定すると、会話スレッドを表すオブジェクトを作成できます。これには、会話に関する情報と投稿のリストが含まれます。この投稿のリストには、投稿者の ID、タイムスタンプ、投稿を含むレコードのキーなどを含めることができます。投稿が適度に短いテキスト メッセージである場合は、投稿全体が含まれている場合もあり、取得する必要があるレコードの数が減ります。
この会話に投稿が入ると、レコードが更新され、投稿のリストが長くなります。兄弟を有効にするために true に設定するのが賢明な場合がありますallow_mult
。これにより、同時書き込みを処理できるようになります。このアプローチにより、1 回のダイレクト キー ルックアップで常に会話と最新の投稿を取得できます。
Riak は、オブジェクトのサイズが数 MB 未満に保たれている場合に最適に機能します。したがって、サイズを抑えるために、ある時点で最も古い投稿を別のオブジェクトに移動する必要があります。これらの関連オブジェクトのリストをメインの会話オブジェクトに保持し、それらがカバーする時間間隔に関する情報を一緒に保持している場合、古い投稿をスクロールして戻る必要がある場合に、キーを直接検索することでこれらに簡単にアクセスできます。
通常、最も一般的なクエリは最新のエントリに対するものであるため、これは常にメインの会話オブジェクトを通じて実行できます。
また、この種の問題が非常に頻繁に議論されている非常に活発なメーリング リストがあることも指摘したいと思います。