NoSQL 数据库中的数据建模 (Cassandra DB)

Data modeling in NoSQL Databases ( Cassandra DB )

我目前正在从事涉及 NoSQL 数据库(具体是 Apache Cassandra)的项目的规范阶段。

我想你们中的许多人都经历过,我必须在规范化和数据复制之间做出权衡。

就我而言,我愿意快速进行大量分析和数据获取,这样我的数据将完全去规范化,并且我们在 table 之间复制数据(我们在写入时丢失的,我们在写入时获得的阅读 )

考虑这个用户 table:

CREATE TABLE users (
   user_id UUID,
   first_name TEXT,
   last_name TEXT,
   profile_pic TEXT,
   PRIMARY KEY (user_id)
); 

字段:first_name, last_name。可以在不同的 table 上多次使用和复制,有时具有不同的字段名称,例如:creator_first_name, poster_first_name, taker_first_name, contributor_first_name,...仅举几例。

这是有趣的部分。

为了保持一致性,您将最终在许多这些表的应用程序级别编写多次。

一种类似的方法是在 'names changed' 的后端有一个队列,并有一个后台服务去更新所有适当的表。这将意味着一点延迟,但总体上可能会更安全。

此外,您可以在这些表中使用 user_id 代替名称,并在 cassandra 前面使用诸如 redis 之类的东西来缓存用户名。在钻探用户配置文件时,直接进入源头。也就是说,最初我只是从 cassandra 读取,这将是一个性能改进。 Reddit 有一篇关于“我们如何构建 /r/place”的博客 post:https://redditblog.com/2017/04/13/how-we-built-rplace/

不要 使用批量插入。这些不是原子插入。如果一个失败,则作业失败,但您的部分或全部插入可能已写入某些节点。