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

mfpqipee  于 2021-06-15  发布在  Cassandra
关注(0)|答案(3)|浏览(309)

cassandra中的主键是否可以包含集合列?
例子:

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

  PRIMARY KEY (first_name, emails)
);
new9mtju

new9mtju1#

我会说不:因为集合是可变的,并且您不能拥有一个随时间不断变化的主键。

syqv5f0l

syqv5f0l2#

集合类型不能是主键的一部分,计数器类型也不能。你可以很容易地亲自测试,但原因可能并不明显。
集合、列表、Map都是存储模型之上的黑客(但我并不是说用一种消极的方式)。一个集合实际上只是具有相同键前缀的许多列。要成为主键的一部分,值必须是标量,而集合类型不是标量。

7lrncoxx

7lrncoxx3#

这已经有一段时间了,但由于这是在谷歌的第一页,当你寻找使用一个Map的主键,我认为它是值得更新。
cassandra现在允许(我认为从2.1开始)在主键中使用集合,只要它是冻结的。
冻结值将多个组件序列化为单个值。非冻结类型允许更新单个字段。cassandra将冻结类型的值视为blob。必须覆盖整个值。
使用freeze时,集合基本上是不可变的,不允许进行适当的修改,因此适合于主键。
下面是一个使用冻结列表的示例。

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类型的列上创建索引——尽管这不一定是个好主意。

相关问题