按价值Cassandra搜索多个属性

时间:2013-07-08 09:45:37

标签: cassandra

我们如何设计一个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二级索引,但似乎不适用。

2 个答案:

答案 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_idproperty,因为我假设一个项只能有一个属性值 - 你也可以为多值属性解决这个问题,但是你必须做几个更多的事情,这将使例子复杂化)

每次插入项目时,您还会在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之一(因为多个匹配,请记住)。