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

Chr*_*row 12 cassandra

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

例:

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

  PRIMARY KEY (first_name, emails)
);
Run Code Online (Sandbox Code Playgroud)

The*_*heo 14

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

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


小智 9

已经有一段时间了,但是当你在主键中寻找使用地图时,这是在谷歌的第一页,我认为值得更新它.

Cassandra 现在允许(我认为从2.1开始)在主键中使用它被冻结的集合.

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

通过冻结,集合变得基本上不可变,不允许就地修改,因此适合于主键.

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

CREATE TABLE test_frozen (
    app_id varchar,
    kind varchar,
    properties frozen <list<text>>,
    PRIMARY KEY ((app_id, kind), properties));
Run Code Online (Sandbox Code Playgroud)

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


Ósc*_*pez 6

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