Cassandra に次のような items テーブルがあるとします。
CREATE TABLE items (
id uuid,
tags set<text>,
name text,
available boolean,
PRIMARY KEY (id));
だから私は基本的にタグ付きのアイテムを持っています.タグの数は不明で、数百に達する可能性があり、異なるアイテムがいくつかのタグを共有する場合があります. 2 つの要件があります。
特定のタグ セットを含むアイテムの数を照会したい。たとえば、タグ列に tag1、tag2、または tag200 を持つアイテムの数を知りたい。
特定のタグのセット (要件 1 にあります) を含むすべてのアイテムを更新したいので、たとえば
available = true
、タグ列に tag1 または tag2、または tag200 を持つすべてのアイテムに設定したいとします。
これらは Spark またはセカンダリ インデックスを使用して実行できますが、私はそれを使用したくありません。純粋な CQL を使用して効果的に実行できるかどうかを調べたいと思います。したがって、次のようなテーブルから始める必要があるかもしれません。
CREATE TABLE itemsByTag (
id uuid,
tag text,
tags set<text>,
name text,
available boolean,
PRIMARY KEY ((tag),id);
しかし、このテーブルは同じアイテムを 2 回以上提供する可能性があります (item1 に tag1 と tag2 と tag200 があるとすると、前のテーブルをタグでクエリすると item1 が 3 回取得されます) また、Cassandra カウンターに適したテーブルを構築する方法要件 1 を満たすためのテーブル?
RDBMS では、ここで説明したように 3 つのテーブルを使用してこれを行います。問題は、Cassandra でこれを効果的に非正規化する方法です。