多くの Cassandra データ モデリングの質問に対する答えは、非正規化です。
自分でインデックスを作成することで問題を解決できます。プロパティごとに、プロパティ名をキーとし、値と項目 ID を列とする行があります。
CREATE TABLE item_index (
property TEXT,
value TEXT,
item_id TEXT,
PRIMARY KEY (property, value, item_id)
)
アイテム用のテーブルも必要です。
CREATE TABLE items (
item_id TEXT,
property TEXT,
value TEXT,
PRIMARY KEY (item_id, property)
)
(複数のアイテムが同じプロパティに対して同じ値を持つことができると想定しているため、テーブルでitem_index
は 3 つの列すべてが主キーにあることに注意してください。プロパティの値は 1 つだけです -- 複数値のプロパティについてもこれを解決できますが、さらにいくつかのことを行う必要があり、例が複雑になります)items
item_id
property
アイテムを挿入するたびitem_index
に、アイテムの各プロパティのテーブルに行も挿入します。
INSERT INTO items (item_id, property, value) VALUES ('thing1', 'color', 'blue');
INSERT INTO items (item_id, property, value) VALUES ('thing1', 'shoe_size', '8');
INSERT INTO item_index (property, value, item_id) VALUES ('color', 'blue', 'thing1');
INSERT INTO item_index (property, value, item_id) VALUES ('shoe_size', '8', 'thing1');
(アイテムを単一のBATCH
コマンドとして挿入することもできます)
靴のサイズでアイテムを見つけるには、2 つのクエリを実行する必要があります (申し訳ありませんが、それは柔軟性を得るために支払う代償です。2 つのクエリを必要としないソリューションを他の誰かが考え出すことができるかもしれません)。
SELECT item_id FROM item_index WHERE property = 'shoe_size' AND value = '8';
SELECT * FROM items WHERE item_id = ?;
ここで、 the?
はitem_id
最初のクエリから返された の 1 つです (複数が一致する可能性があるため、覚えておいてください)。