如何在Cassandra 1.2中为同一个表建模两个单独的复合键?

时间:2013-07-14 04:33:55

标签: cassandra data-modeling cql3

我的用例如下:我必须存储和查询来自多个第三方来源的数据。我所拥有的唯一预定义模式知识是它包含具有额外Source组件的Entity-Attribute-Value元组:(E, A, V, S)。我事先并不知道将出现哪些属性(因此使用实际属性本身作为列是有问题的)。组合(E,A,V)必须是唯一的,因此我认为使用它作为复合键将是建模的最佳方式,因此我们得到:

CREATE TABLE t1 (
       E text,
       A text,
       V text,
       S text,
       PRIMARY KEY(E, A, V)
);

这将使我能够询问如下问题:

  • 给定E,显示所有属性A和值V以及它们出现的源S
  • 给出E和A,给予所有V.

计划是使用不同排序的复合键创建此表的镜像,以便我也可以回答表单的查询:

  • 给定A,显示所有实体E和值V.
  • 给出S,显示所有E,A,V元组。
等等(实际上,镜像表起着索引的作用,并且为了得到完整的索引,我将需要6个有效相同数据的副本 - 不确定该方法的可扩展性,但这是一个我猜单独的问题)。

到目前为止一直很好,但是,我正在努力的部分是:V实际上是一个具有多个属性的对象。如果这是一个关系模型,我会V成为一个外键字段,指向将id映射到例如type字段和value的关系}字段。但是,摆脱外键(以及与它们一起使用的连接)或多或少是我猜的BigTable方法的重点,所以我正在寻找一种方法将其合并到我的表t1中。

当然,我可以这样做:

CREATE TABLE t1 (
       E text,
       A text,
       V_id text,
       S text,
       V_type text,
       V_value text,
       PRIMARY KEY(E, A, V_id)
);

但是我看到的问题是,它无法捕获V的id,类型和值之间的(反函数)关系:使用上面的表格,我可以得到,例如:

 E  | A  | V_id | V_type | V_value
 ---+----+------+--------+--------
 a1 | b1 |    1 | X      | foo
 a1 | b1 |    2 | X      | foo
 a1 | b2 |    1 | Y      | bar

虽然我希望能够确保给定V_id,但类型和值是唯一的,反之亦然。我想我所追求的是旧的Cassandra版本中的嵌套超级列,但我正在尝试用CQL3实现我需要的东西。

我简要介绍了集合类型,但这似乎不适合我的用例。

有人可以建议一种更好的方法对此进行建模,请记住,理想情况下,我希望能够尽可能少地查询(E, A, V)并进行查询吗?或者我只是过度思考它并且是方法,因为我现在确实很好(我当然可以尝试并确保在应用程序级别的唯一性)?

2 个答案:

答案 0 :(得分:2)

Jeen,考虑使用地图代表V.见http://www.datastax.com/docs/1.2/cql_cli/using/collections 引入了映射,列表,集合类型,以避免将字符串/字节数组中的键值对进行编码/解码。

答案 1 :(得分:1)

您可以对t1进行非规范化并创建一个新表,您可以在其中存储特定v_id的属性。这样您就可以实现SQL的连接等价物。假设v_id是唯一的,您的新表可以具有以下结构:

    CREATE TABLE t2 (
        V_id text PRIMARY KEY,
        type text,
        value text,
    );

关于将SQL操作映射到Cassandra的阅读非常好:http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/ enter link description here