如何以正确的方式创建 Cassandra 主键
How to create Cassandra primary key in correct way
我有以下 table 结构:
CREATE TABLE test_keyspace.persons (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (id, country, address)
);
我的主要场景是通过id获取person。但有时我想获得国家内的所有城市以及城市内的所有人。
我知道 Cassandra 必须至少有一个分区键和零个或多个集群键,但我不明白如何组织它才能最有效地工作(并且通常工作)。
有人可以给我建议吗?
所以听起来您希望能够同时通过 id
和 country
进行查询。通常在 Cassandra 中,构建数据模型的方法是“一个 table == 一个查询”方法。在那种情况下,您将有两个 tables,只是键控不同:
CREATE TABLE test_keyspace.persons_by_id (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (id));
TBH,除非一个人可以有多个地址,否则您真的不会聚集在 country
和 address
上。但是单PK是完全合法的做法。
第二个table:
CREATE TABLE test_keyspace.persons_by_country (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (country,city,id));
这将允许您按 country
查询,grouped/sorted 按 city
查询,按 id
排序。理论上,只要您还拥有 country
和 city
,您也可以在此处通过 id
方法提供查询服务。但这在您的场景中可能是不可能的。
在 Cassandra (NoSQL) 中复制数据以帮助查询更好地执行是可以的。诀窍是保留 tables in-sync,但您可以使用 BATCH
功能以原子方式将写入应用到两个 tables。
如果您还没有,您可能会受益于 DataStax 的(免费)数据建模课程 - Data Modeling with Apache Cassandra and DataStax Enterprise。
我有以下 table 结构:
CREATE TABLE test_keyspace.persons (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (id, country, address)
);
我的主要场景是通过id获取person。但有时我想获得国家内的所有城市以及城市内的所有人。
我知道 Cassandra 必须至少有一个分区键和零个或多个集群键,但我不明白如何组织它才能最有效地工作(并且通常工作)。
有人可以给我建议吗?
所以听起来您希望能够同时通过 id
和 country
进行查询。通常在 Cassandra 中,构建数据模型的方法是“一个 table == 一个查询”方法。在那种情况下,您将有两个 tables,只是键控不同:
CREATE TABLE test_keyspace.persons_by_id (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (id));
TBH,除非一个人可以有多个地址,否则您真的不会聚集在 country
和 address
上。但是单PK是完全合法的做法。
第二个table:
CREATE TABLE test_keyspace.persons_by_country (
id uuid,
country text,
city text,
address text,
phone_number text,
PRIMARY KEY (country,city,id));
这将允许您按 country
查询,grouped/sorted 按 city
查询,按 id
排序。理论上,只要您还拥有 country
和 city
,您也可以在此处通过 id
方法提供查询服务。但这在您的场景中可能是不可能的。
在 Cassandra (NoSQL) 中复制数据以帮助查询更好地执行是可以的。诀窍是保留 tables in-sync,但您可以使用 BATCH
功能以原子方式将写入应用到两个 tables。
如果您还没有,您可能会受益于 DataStax 的(免费)数据建模课程 - Data Modeling with Apache Cassandra and DataStax Enterprise。