我的用例如下:我必须存储和查询来自多个第三方来源的数据。我所拥有的唯一预定义模式知识是它包含具有额外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)
);
这将使我能够询问如下问题:
计划是使用不同排序的复合键创建此表的镜像,以便我也可以回答表单的查询:
到目前为止一直很好,但是,我正在努力的部分是: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)
并进行查询吗?或者我只是过度思考它并且是方法,因为我现在确实很好(我当然可以尝试并确保在应用程序级别的唯一性)?
答案 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