我目前正在处理涉及NoSQL数据库的项目的规范阶段(具体是Apache Cassandra)。
正如我猜想的那样,我必须在规范化和数据复制之间进行权衡。
在我的情况下,我愿意快速进行大量的分析和数据获取,这样我的数据就会完全去标准化,并且我们会在表格中复制数据(我们在写入时会放松,我们会在读取时获得)
考虑这个用户表:
CREATE TABLE users (
user_id UUID,
first_name TEXT,
last_name TEXT,
profile_pic TEXT,
PRIMARY KEY (user_id)
);
字段:first_name, last_name
。可以在不同的表上多次使用和复制,有时使用不同的字段名称,例如:creator_first_name, poster_first_name, taker_first_name, contributor_first_name
,...等等。
这是有趣的部分。
答案 0 :(得分:1)
为了保持一致性,您最终会在应用程序级别上多次编写这些表。
一种类似的方法是在后端有一个队列,其名称已经改变了#39;并有一个后台服务去更新所有适当的表。这意味着有点延迟,但整体上可能更安全。
此外,您可以在这些表中使用user_id取代名称,并使用像cassandra前面的redis来缓存用户的名称。在钻探探索用户配置文件时,请直接访问源。也就是说,最初我只是从cassandra读取,这将是一个性能提升。 Reddit有关于我们如何构建/ r / place`的博文:https://redditblog.com/2017/04/13/how-we-built-rplace/
不要使用批量插入。这些不是原子插入。如果一个失败,则作业失败,但部分或全部插入可能已写入某些节点。