Cassandra - 我必须写这么多吗?

Cassandra - Shall I have to do so many writes?

我有 5 张桌子:

users_by_id
users_by_username
users_by_email
users_by_likes
users_by_followers

如果用户注册,我每次都要写 5 条语句。那不贵还是不好?

INSERT INTO users_by_id (...) values (..)
INSERT INTO users_by_email (...) values (..)
INSERT INTO users_by_username (...) values (..)
INSERT INTO users_by_likes (...) values (..)
INSERT INTO users_by_followers (...) values (..)

第二个问题:可能我更新了users_by_id我要写5条更新语句。还有其他解决方案吗?还是没那么糟糕?

Cassandra 提倡对数据进行非规范化,并根据您的查询创建数据模型。您将必须编写数据模型,使其能够以良好的性能满足所有查询。为了性能(由于其体系结构和设计),Cassandra 要求使用分区键进行写入和读取。

在5个不同的表中为同一组数据写5次插入并不昂贵。您的读取性能会更好,并且随着数据大小增加到网络规模,您会感谢您创建 5 个表并写入它们的决定。

您可以探索实体化视图(Materialized View and Datastax Link for Materialized View,但请记住它是一项实验性功能。因此您必须正确理解它并确定实体化视图的未解决问题。

我建议您学习 Cassandra 数据模型,这将使​​事情更容易掌握。

Cassandra 被设计为写入密集型数据库,因此请不要犹豫复制您的数据。人们应该总是为读取查询设计 tables。如果一个table满足一个查询,就是一个很好的设计。

回答你的第二个问题,你应该设计你的 tables 这样你就不必更新 table。始终考虑插入新值。

例如下面table设计

CREATE TABLE user_by_email (
email text,
timestamp timestamp,
name text,
fullname text,
userId text,
PRIMARY KEY (email,timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);

INSERT INTO user_by_email (email, DateTime.Now ........)

在此设计中,您应该获取最新插入的值。此外,此设计保留该密钥的更改历史记录。 想一想,我们必须更新用户 ID、电子邮件、用户名等值多少次?很少。