按值Cassandra搜索多个属性

按值Cassandra搜索多个属性,cassandra,Cassandra,我们如何设计一个cassandra模型来存储具有n个属性P1、P2…PN和 通过按值搜索项属性来检索项 比如说 Item Item_Type State Country Item1 Solid State1 Country1 在传统的RDBMS中,我们可以发出select查询 select Item from table where Item_Type='Solid' and Country='Country1' 我们如何在NoSql Cassandra中实现这样一个模

我们如何设计一个cassandra模型来存储具有n个属性P1、P2…PN和 通过按值搜索项属性来检索项

比如说

Item  Item_Type   State  Country

Item1  Solid      State1 Country1
在传统的RDBMS中,我们可以发出select查询

select Item from table where Item_Type='Solid' and Country='Country1'

我们如何在NoSql Cassandra中实现这样一个模型,我们尝试了Cassandra二级索引,但似乎不适用。

对于属性P1..PN,您必须像使用RDMSs一样更改表,或者使用过时的基于节约协议的API,我建议使用Astyanax,它可以动态添加列,但这被认为是不好的做法。另一种可能是使用属性集合,其中一列是值集合:

   CREATE TABLE item (
       item_id text PRIMARY KEY,
       property set<text>
   );

对于使用多个WHERE子句选择值,可以使用辅助索引,或者如果知道WHERE子句中需要哪些列,可以使用,但是,如果有很多列需要在WHERE子句中,我建议使用二级索引。

许多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和属性,因为我假设一个项目对一个属性只能有一个值-你也可以对多值属性解决这个问题,但是你必须做更多的事情,这会使示例复杂化

每次插入项目时,也会在项目索引表中为项目的每个属性插入一行:

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');
您可能还希望将该项作为单个批处理命令插入

要按鞋码查找商品,您需要执行两个查询对不起,这是您为灵活性付出的代价-也许其他人可以想出一个不需要两个查询的解决方案:

SELECT item_id FROM item_index WHERE property = 'shoe_size' AND value = '8';
SELECT * FROM items WHERE item_id = ?;
火车在哪里?是从第一个查询返回的项ID之一,因为不止一个项可以匹配,请记住