我刚看过cassandra数据建模的this youtube video of Patrick McFadin。有一个表,如下:
create table user_activity_history {
username varchar,
interaction_date varchar,
activity_code varchar,
detail varchar,
PRIMARY KEY((username,interaction_date),interaction_time)
);
为什么主键为((username,interaction_date),interaction_time)
。
这与(username,interaction_date,interaction_time)
有什么不同。
答案 0 :(得分:13)
差异与表格partition_key
有关。通常,PRIMARY KEY中的第一个元素也是分区键 - 它定义了集群中数据的物理位置,例如,通过使用以下内容:
PRIMARY KEY(username,interaction_date,interaction_time)
插入表中的数据将根据username
进行分区(物理定位),而使用以下内容:
PRIMARY KEY((username,interaction_date),interaction_time)
它将根据username,interaction_date
组合进行分区。后一种方案的优点是可以跨群集中的节点存储与单个username
相关的数据。
在CREATE TABLE上的datastax的CQL文档中有关于partition_keys的更多详细信息:
使用复合PRIMARY KEY时,Cassandra会将定义中声明的第一列视为分区键,并将该行的所有列存储在同一物理节点上。使用复合分区键时,Cassandra会将嵌套括号中的列视为分区键,并将行的列存储在多个节点上。你宣布一个复合 分区键使用一组额外的括号来定义哪些列对数据进行分区。