为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕娘9325324 2022-06-13 16:29:09
我正在使用 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));
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

最好的方法?为您要服务的每个查询创建一个表。使用您要查询的列和(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;


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信