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

我正在使用 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 是唯一的。可以有多个具有相同电子邮件和/或号码的消息)?我应该创建两个单独的表以允许通过这两个字段进行查询吗?


对于按 Id 查询,我将创建如下表:


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)

);


慕娘9325324
浏览 81回答 1
1回答

LEATH

最好的方法?为您要服务的每个查询创建一个表。使用您要查询的列和(id以确保唯一性)构建 PRIMARY KEY 定义: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));当您向这些表写入一行时,请使用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;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go