0

私は小さなソーシャル ネットワーク アプリケーションを開発しており、N+1 選択の問題に直面しています。

アプリケーションで主要な役割を果たしている Post と Comment の 2 つのテーブルがあります。

すべての投稿を Post テーブルに保存し、投稿に対するコメントは Comment テーブルに保存します。次の方法で部分キー スキャン機能を使用してデータを取得しています。

 Post: Start row = userID  | Stop Row = userID +1

 Comment: Start row = postID | Stop Row = postID +1

データのフェッチに使用されるコード スニペットを次に示します。

 HTable table = resource.getTable(getTableName());

 Scan scan = new Scan();
 scan.setStartRow(Bytes.toBytes(prefixId.toString()));
 scan.setStopRow(Bytes.toBytes(prefixId.toString() + 1));

 ResultScanner scanner = table.getScanner(scan); //TODO store the scanner in cache.
 Result[] results = scanner.next(pageSize);

コードの問題は、単一のクエリでユーザーのすべての投稿を取得できることです。しかし、投稿ごとに、すべてのコメントを取得するために個別のクエリを作成する必要があります。HBase クライアントの Scan API を分析しましたが、単一のクエリまたは最大 2 つのクエリでそれを可能にするソリューションを見つけることができませんでした。1 つは投稿用、もう 1 つはコメント用です。

フィルターについて知りましたが、フィルターはやはりパフォーマンスのボトルネックです。

私は NOSQL テクノロジーを使い始めたばかりで、HBase は初めてです。この問題を解決するために、設計/フレームワーク レベルで私を助けてください。

ありがとう。

4

1 に答える 1

0

1 回のスキャンで必要なデータを取得するには、次の 2 つの方法があります
。 1. すべてのコメントを同じテーブル (POST) に保持することにより、新しいコメントが来るたびに、comment-(timestamp) または comment-(number) という名前でランタイム列を作成します。

2.別の方法で、2 つの列ファミリーを作成できます。1 つは「投稿」で、もう 1 つは「コメント」です。コメントはより多くできるため、バージョン数を列ファミリー「コメント」の最大 (最適) 値に設定します。

于 2012-07-06T08:59:54.597 に答える