如何在 Apache Cassandra 中正确建模数据以允许通过两个不唯一的不同字段进行查询

How to properly model data in Apache Cassandra to allow querying by two different fields that are not unique

我正在使用 Apache Cassandra 在 Go 中开发一个简单的 API,我想知道表示我拥有的数据的最佳方式是什么。

我在 Go 中有以下结构。

type Message struct {
    Id          gocql.UUID `json:"id"`
    Email       string     `json:"email"`
    Title       string     `json:"title"`
    Content     string     `json:"content"`
    Number      int64      `json:"number"`
    DateCreated time.Time  `json:"dateCreated"`
}

在 Cassandra 中创建数据结构以允许通过 而非 唯一的电子邮件和号码查询的最佳方法是什么(只有 ID 是唯一的。可以有多个消息具有相同的电子邮件 and/or 号码)?我是否应该创建两个单独的 table 以允许通过这两个字段进行查询?

为了按 Id 查询,我会像这样创建 table:

USE some_keyspace;

CREATE TABLE IF NOT EXISTS messages
(
    id           UUID,
    email        TEXT,
    title        TEXT,
    content      TEXT,
    number.      BIGINT,
    date_created TIMESTAMP,
    PRIMARY KEY (id)
);

最好的方式?为您要服务的每个查询创建一个 table。使用 both 要查询的列和 id (以确保唯一性)构建主键定义:

CREATE TABLE IF NOT EXISTS messages_by_email (
    id           UUID,
    email        TEXT,
    title        TEXT,
    content      TEXT,
    number      BIGINT,
    date_created TIMESTAMP,
    PRIMARY KEY (email,id));

CREATE TABLE IF NOT EXISTS messages_by_number (
    ....
    PRIMARY KEY (number,id));

写一行到这些table时,使用BATCH保证原子性。

BEGIN BATCH
    INSERT INTO messages (id,email,number,title,content,date_created)
        VALUES (uuid(),'aaron@dot.com',1,'Hi','Cassandra rocks!',toTimestamp(now()));
    INSERT INTO messages_by_email (id,email,number,title,content,date_created)
        VALUES (uuid(),'aaron@dot.com',1,'Hi','Cassandra rocks!',toTimestamp(now()));
    INSERT INTO messages_by_number (id,email,number,title,content,date_created)
        VALUES (uuid(),'aaron@dot.com',1,'Hi','Cassandra rocks!',toTimestamp(now()));
APPLY BATCH;