Cassandra中的主键是否可以包含集合列?
示例:
CREATE TABLE person (
first_name text,
emails set<text>,
description text
PRIMARY KEY (first_name, emails)
);
答案 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)
我会说不:因为这个集合是可变的,你不能拥有一个不断变化的主键。