如何在Cassandra表中构造参与密钥以供用户关注

问题描述

我想创建一个表格,让用户关注其他用户。在此表中,我需要以下用户用户ID和后继用户用户ID。如果有一些用户,那么会有成千上万的用户关注,因此太大了,无法有效地将它们存储在集合中。

如何建模,单个用户的所有关注者都不会位于同一分区中?在意识到此问题之前,我想使用以下用户ID oder,然后再使用用户ID作为分区键,但是随后应该出现热分区问题。

我可以使用带有以下用户ID和后面的用户ID的复合分区键来解决热分区问题吗?还有什么可以解决这个问题?

我的2个主要查询获取用户的所有后续用户获取用户的所有关注用户。 如果我使用具有这两个ID的复合分区键,我什至可以查询上述内容吗?还是我需要同时查询两个ID,所以不可能吗?

谢谢您的帮助。

解决方法

这是社交图谱中的一个常见问题,其中某些人比其他人拥有数百万的追随者。我倾向于以泰勒·斯威夫特(Taylor Swift)和巴拉克·奥巴马(Barrack Obama)为例。

许多社交平台通过将它们隔离在单独的数据存储中来处理此“超级节点”问题,以便当有人穿越超级节点时主存储库不会排队。

这确实意味着您需要在应用程序中进行处理,以便您的应用程序需要根据超级用户/超级节点的参考表检查用户,以便随后在子表中进行查找,而不是在子表中进行查找主表。干杯!

,

您应该查看存储桶解决方案。在存储桶中,您引入了一个附加键作为分区键的一部分。例如,您可以使用这样的数据模型

CREATE TABLE user_followers (
user_id int,bucket_id  int,follower_id int,user_name text,PRIMARY KEY ((user_id,bucket_id)));

这是user_id和bucket_id是分区键。要查找所有分区,您应该事先了解bucket_ids。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...