cassandra中的主键是否可以包含集合列?例子:
CREATE TABLE person ( first_name text, emails set<text>, description text PRIMARY KEY (first_name, emails) );
new9mtju1#
我会说不:因为集合是可变的,并且您不能拥有一个随时间不断变化的主键。
syqv5f0l2#
集合类型不能是主键的一部分,计数器类型也不能。你可以很容易地亲自测试,但原因可能并不明显。集合、列表、Map都是存储模型之上的黑客(但我并不是说用一种消极的方式)。一个集合实际上只是具有相同键前缀的许多列。要成为主键的一部分,值必须是标量,而集合类型不是标量。
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类型的列上创建索引——尽管这不一定是个好主意。
3条答案
按热度按时间new9mtju1#
我会说不:因为集合是可变的,并且您不能拥有一个随时间不断变化的主键。
syqv5f0l2#
集合类型不能是主键的一部分,计数器类型也不能。你可以很容易地亲自测试,但原因可能并不明显。
集合、列表、Map都是存储模型之上的黑客(但我并不是说用一种消极的方式)。一个集合实际上只是具有相同键前缀的许多列。要成为主键的一部分,值必须是标量,而集合类型不是标量。
7lrncoxx3#
这已经有一段时间了,但由于这是在谷歌的第一页,当你寻找使用一个Map的主键,我认为它是值得更新。
cassandra现在允许(我认为从2.1开始)在主键中使用集合,只要它是冻结的。
冻结值将多个组件序列化为单个值。非冻结类型允许更新单个字段。cassandra将冻结类型的值视为blob。必须覆盖整个值。
使用freeze时,集合基本上是不可变的,不允许进行适当的修改,因此适合于主键。
下面是一个使用冻结列表的示例。
从2.1开始,cassandra还允许在map、set或list类型的列上创建索引——尽管这不一定是个好主意。