我们如何设计一个cassandra模型来存储一个组,说'Item'有n个属性P1,P2 ... PN和 通过按值
搜索item属性来检索项目例如
Item Item_Type State Country
Item1 Solid State1 Country1
在传统RDBMS
中,我们可以发出选择查询
select Item from table where Item_Type='Solid' and Country='Country1'
我们如何在NoSql Cassandra
中实现这样的模型,我们尝试过cassandra二级索引,但似乎不适用。
答案 0 :(得分:1)
对于属性P1..PN,您将需要ALTER
表格与RDMS一样,或使用过时的基于thrift协议的API(我建议使用Astyanax),它可以即时添加列(但这被认为是不好的做法)。另一种可能性是使用一组属性,其中一列是值的集合:
CREATE TABLE item (
item_id text PRIMARY KEY,
property set<text>
);
对于具有多个SELECT
子句的WHERE
值,您可以使用二级索引,或者如果您知道WHERE子句中需要哪些列,则可以使用composite key,但是如果你要在WHERE子句中有很多列,我建议使用二级索引。
答案 1 :(得分:1)
许多Cassandra数据建模问题的答案是: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
之一(因为多个匹配,请记住)。