Cassandraの正規化は反パターンと見なされますが、それが意味する記憶要件が高すぎるとすれば何ができるのでしょうか?例えばCassandraの正規化
、我々は現在、多くの受信者に配布される「フィード」の大きなテーブルを持っているので、現在のスキーマがそのようなものです:このスキーマでは
CREATE TABLE feed_items_duplicated(recipient_id int, feed_id timeuuid,
<data columns d1 to dn>
PRIMARY KEY ((recipient_id), feed_id);
すべてがいいですし、フィードがありますフィードID上に単一範囲クエリを使用して、単一の受信者のために容易に取り込まれた:
SELECT * from feed_items_duplicated where recipient_id = 123
and feed_id > minTimeuuid('2013-09-30 22:19:06+0100');
問題は、単一のフィードが受信者の数百に分配することができ、各行はDNに列D1と非常に大規模であることができるということです1つ1つに複製そのうちの。
SELECT * from feed_data where feed_id in (f1, f2, f3...);
だから質問1:
は、ストレージ要件が含まれているために、私たちは別のオプションこれはまだその後の追加のクエリ実行して上記のクエリを実行している必要となるCREATE TABLE feed_items(recipient_id int, feed_id timeuuid,
PRIMARY KEY ((recipient_id), feed_id);
CREATE TABLE feed_data(feed_id timeuuid, <data columns d1 to dn>
PRIMARY KEY (feed_id);
と考えられていますクラスタ内のすべてのノードに当てはまる可能性が高いため、上記のクエリを実行することをお勧めします。どのf1からfnまでの専用クエリを並行して実行するのと比較してどれほど悪いですか?
もう1つの方法は、feed_dataテーブルに対してわずかな制限範囲([1-20]と言う)内に任意のクラスタリングキーを作成して、実行する次のタイプのクエリを最大20個しか持たないようにすることです:
このアプローチでは、すべてのクエリが1つの実行ノードに制限されますが、そのようなカーディナリティパーティションキーが低いと、データがノード間で均等に分散されることを保証できますか?