13

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

例子:

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

  PRIMARY KEY (first_name, emails)
);
4

3 回答 3

16

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

集合、列表、地图是存储模型之上的黑客(但我并不是说消极的)。一个集合实际上只是一些具有相同键前缀的列。要成为主键的一部分,值必须是标量,而集合类型不是。

于 2013-05-11T21:26:46.657 回答
13

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

Cassandra现在允许(我认为是从 2.1 开始)在 Primary Key 中使用集合,前提是它是freeze的。

冻结值将多个组件序列化为单个值。非冻结类型允许更新单个字段。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 类型的列上创建索引——尽管这不一定是一个好主意。

于 2016-03-19T11:06:00.467 回答
7

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

于 2013-05-09T20:52:18.500 回答