如何以正确的方式创建 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 必须至少有一个分区键和零个或多个集群键,但我不明白如何组织它才能最有效地工作(并且通常工作)。

有人可以给我建议吗?

所以听起来您希望能够同时通过 idcountry 进行查询。通常在 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,除非一个人可以有多个地址,否则您真的不会聚集在 countryaddress 上。但是单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 排序。理论上,只要您还拥有 countrycity,您也可以在此处通过 id 方法提供查询服务。但这在您的场景中可能是不可能的。

在 Cassandra (NoSQL) 中复制数据以帮助查询更好地执行是可以的。诀窍是保留 tables in-sync,但您可以使用 BATCH 功能以原子方式将写入应用到两个 tables。

如果您还没有,您可能会受益于 DataStax 的(免费)数据建模课程 - Data Modeling with Apache Cassandra and DataStax Enterprise