许多 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
表中所有三列都在主键中,因为我假设多个项目可以具有相同属性的相同值,但在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 之一(因为可以匹配多个,请记住)。