如何在 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;
我正在使用 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;