0

Libraryと呼ばれるデータのセットを考えてみましょう。これにはBooksのセットが含まれており、各ブックにはPagesのセットが含まれています。

このデータを格納するために Riak を使用していて、次の 2 つの方法でデータにアクセスする必要があるとします。 )

さらに、特定のBookのページを簡単に更新および削除できる必要があります。

Riak でこれを達成するための最良の方法は何でしょうか?

明らかに、Riak Search はそのトリックを実行しますが、おそらく私がやろうとしていることには非効率的です。各バケットが本になる可能性のあるバケットを設定することが理にかなっているのかどうか疑問に思っています(これにより、数百万の「本」バケットが作成される可能性があります)。たぶんそれは悪い考えです...

これはセカンダリ インデックスで実現できますか?

私はこれをシンプルにしようとしています...

私は Riak を初めて使用し、おそらく比較的単純な何かを達成するための最良の方法を見つけようとしています。Stack Overflow コミュニティからの助けをいただければ幸いです。ありがとう!

4

2 に答える 2

1

Riak でマスターとディテールの関係をモデル化する一般的な方法は、マスター レコードにディテール レコード ID のリストを含めることです。これには、取得するディテール レコードを決定する際に役立つ可能性があるディテール レコードに関する情報も一緒に含めることができます。

あなたの例では、「本」と「ページ」という 2 つのバケットを持つことができます。「books」バケットのマスター レコードには、本に含まれるページのリストとともに、本全体に関するメタデータと情報が含まれます。各ページには、ページ データを保持する「ページ」レコードの ID と、対応するページ番号が含まれます。たとえば、章ごとにクエリを実行できるようにしたい場合は、特定のページが属する章に関する情報を追加することもできます。

「ページ」バケットには、ページのテキストと、場合によってはそのページに含まれる画像やその他のメディア データへのリンクが含まれます。このデータは、さらに別のバケットに保存できます。

特定のページまたはページの範囲を取得するには、まず「books」バケットからマスター レコードを取得し、次にレコードの内容に基づいて適切なページを取得します。これにはいくつかの GET 操作が必要ですが、それらはすべてキーに基づく直接ルックアップであり、Riak からデータを取得する最も効率的でスケーラブルな方法であるため、パフォーマンスとスケーリングが良好です。

このアプローチでは、マスターレコードのみを更新する必要があるため、ページや章の順序を簡単に変更できます。ただし、ページを追加、削除、または変更するには、マスター レコードと 1 つまたは複数の詳細レコードの両方を更新、追加、または削除する必要があります。

オブジェクトにセカンダリ インデックスを追加し、これに基づいてクエリを実行することで、この問題を確実に解決することもできます。ただし、Riak のセカンダリ インデックス クエリは、リクエストを満たすために、パーティションのカバー セット (通常はリング サイズ / n_val) の処理を​​含める必要があります。そのため、システムに少し負荷がかかり、一般的に、クエリを取得するよりもレイテンシが高くなります。直接キー検索によるキーを含む単一のオブジェクト (オブジェクトが実際に格納されているパーティションのみが必要です)。

インデックスを含む別のオブジェクトを維持すると、ページ/エントリを挿入または削除するときに少し余分な作業が追加されますが、直接キーの検索のみが必要なため、このアプローチは通常、より効率的な読み取りになります。アプリケーションで読み取りが多い場合は、おそらくこのアプローチを使用するのが理にかなっていますが、書き込みが多いアプリケーションでは、より高価な読み取りを犠牲にして挿入と変更が安価になるため、セカンダリ インデックスの方が効率的です。ただし、オプションを開いたままにしておくために、念のためにいつでもセカンダリ インデックスを追加できます。

このような場合、通常、いくつかのベンチマークを実行してソリューションをテストし、特定のパフォーマンスとスケーリングの要件に最適なソリューションを確認することをお勧めします。

于 2013-03-23T20:47:53.580 に答える
1

最も効率的な方法は、ホール ブックを 1 つのオブジェクトとして保存し、そのページを別のオブジェクトとして複製することです。長所:

  • キーで任意のオブジェクトを選択できます (riak で最も安価な操作は kv クエリです)
  • すべてのクエリはレイテンシーによって予測されます
  • これは riak の自然な保存方法です

短所:

  • いずれかのページを更新する必要がある場合は、本全体を更新してからページを更新する必要があります。riak にはアトミックな ops がないため、失敗した状況を回復する方法を考える必要があります (たとえば、本は更新されましたが、ページは更新されませんでした)。

Riak は可用性の予測可能なレイテンシに関するものであるため、結果を収集するために 2i のようなものを使用すると、予測不可能な時間のクエリが作成され、ページ数とともに増加します。

于 2013-03-17T13:46:52.640 に答える