0

我们如何设计一个 cassandra 模型来存储具有 n 个属性 P1、P2...PN 的组“项目”并通过按值搜索项目属性来检索项目

例如

Item  Item_Type   State  Country

Item1  Solid      State1 Country1

在传统RDBMS中,我们可以发出选择查询

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

我们如何实现这样的模型NoSql Cassandra,我们尝试过 cassandra 二级索引,但它似乎不适用。

4

2 回答 2

1

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

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

对于SELECT具有多个子句的 ing 值,WHERE您可以使用二级索引,或者如果您知道 WHERE 子句中需要哪些列,您可以使用复合键,但如果您将有很多列,我建议您使用二级索引需要在 WHERE 子句中。

于 2013-07-08T10:53:57.613 回答
1

许多 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_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从第一个查询返回的 s 之一(因为可以匹配多个,请记住)。

于 2013-07-08T19:06:49.903 回答