許多卡桑德拉數據建模問題的答案是:denormalize。
你可以通過自己建立索引來解決你的問題。對於每個屬性與屬性名稱作爲關鍵字的行和值和項目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
表中的所有三列都在主鍵中,因爲我假設多個項目對於同一個屬性可以具有相同的值,但在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
命令)
通過鞋子尺寸查找物品您需要做兩個查詢(對不起,但這是您付出的靈活性的代價 - 也許別人可以拿出一個不需要兩個查詢的解決方案):
SELECT item_id FROM item_index WHERE property = 'shoe_size' AND value = '8';
SELECT * FROM items WHERE item_id = ?;
其中?
是第一個查詢(因爲不止一個可匹敵,記不清了)返回item_id
S的一個。