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

3df52oht  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(386)

我正在使用apachecassandra在go中开发一个简单的api,我想知道什么是表示我拥有的数据的最佳方式。
我有下面的结构。

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)
);
w46czmvw

w46czmvw1#

最好的方法是什么?为要提供服务的每个查询创建一个表。使用要查询的列和生成主键定义 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));

在向这些表中写入行时,请使用 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;

相关问题