Cassandra中的主键是否可以包含集合列?

时间:2013-05-09 20:43:28

标签: cassandra

Cassandra中的主键是否可以包含集合列?

示例:

CREATE TABLE person (
  first_name text,
  emails set<text>,
  description text

  PRIMARY KEY (first_name, emails)
);

3 个答案:

答案 0 :(得分:14)

集合类型不能是主键的一部分,计数器类型也不能。您可以自己轻松测试,但原因可能并不明显。

设置,列表,地图是存储模型之上的黑客(但我并不是以负面的方式)。集合实际上只是具有相同密钥前缀的多个列。要成为主键的一部分,值必须是标量,而集合类型则不是。

答案 1 :(得分:9)

已经有一段时间了,但是当您在主键中查找使用地图时,这是在Google的第一页上,我认为有必要对其进行更新。

Cassandra now allows(我认为从2.1开始)在主键中使用集合,只要它是冻结

冻结值将多个组件序列化为单个值。非冻结类型允许更新单个字段。 Cassandra将冻结类型的值视为blob。必须覆盖整个值。

通过冻结,该集合基本上是不可变的,不允许就地修改,因此适合主键。

以下是使用冻结列表的示例。

CREATE TABLE test_frozen (
    app_id varchar,
    kind varchar,
    properties frozen <list<text>>,
    PRIMARY KEY ((app_id, kind), properties));

从2.1开始,Cassandra还允许在map,set或list类型的列上创建索引 - 尽管这不一定是个好主意。

答案 2 :(得分:6)

我会说不:因为这个集合是可变的,你不能拥有一个不断变化的主键。