【问题标题】:Search For Multiple Properties by Value Cassandra按值搜索多个属性 Cassandra
【发布时间】:2013-07-09 03:28:30
【问题描述】:

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

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

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

    对于具有多个 WHERE 子句的 SELECTing 值,您可以使用二级索引,或者如果您知道 WHERE 子句中需要哪些列,您可以使用 composite key,但我会推荐二级索引,如果您将有很多列需​​要在 WHERE 子句中。

    【讨论】:

      【解决方案2】:

      许多 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_ids 之一(因为可以匹配多个,请记住)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-05
        • 2014-03-18
        • 2014-12-19
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 2014-11-02
        相关资源
        最近更新 更多