Cassandra 中的主键可以包含集合列吗?
例子:
CREATE TABLE person (
first_name text,
emails set<text>,
description text
PRIMARY KEY (first_name, emails)
);
Cassandra 中的主键可以包含集合列吗?
例子:
CREATE TABLE person (
first_name text,
emails set<text>,
description text
PRIMARY KEY (first_name, emails)
);
集合类型不能是主键的一部分,计数器类型也不能。您可以自己轻松地进行测试,但原因可能并不明显。
集合、列表、地图是存储模型之上的黑客(但我并不是说消极的)。一个集合实际上只是一些具有相同键前缀的列。要成为主键的一部分,值必须是标量,而集合类型不是。
已经有一段时间了,但是当您在主键中寻找使用地图时,这是在谷歌的第一页上,我认为值得更新它。
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 类型的列上创建索引——尽管这不一定是一个好主意。
我会说不:因为集合是可变的,你不能有一个随时变化的主键。