我是 Cassandra 的新手,从 20 年的 RDBMS 开始,在过去的几天里,我一直在阅读和观看我能掌握的所有适用于我的情况的内容。我确定这是一个基本问题,但由于某种原因它没有点击,所以如果在其他地方回答了这个问题,请原谅。
我正在尝试设计一个表来存储用户之间的关联列表。任何用户都可以拥有任意数量的关联用户。这有点像朋友列表。
现在我有 3 个字段:
id (timeuuid) (PK)
用户 (uuid)
朋友 (uuid)
我希望能够做到:
SELECT * FROM friends WHERE user = ?
Run Code Online (Sandbox Code Playgroud)
所以因为user不是 PK,所以不能在查询中使用。而且,如果我让它成为 PK 的一部分,它必须是唯一的,这意味着用户最多只能有 1 个朋友。
我通过在user上使用二级索引解决了这个问题,但我认为这种方法不是最好的主意。查询响应相当慢,显然是因为它必须向我所有的集群节点询问它们的部分数据。
那么:设计这张桌子的正确方法是什么?非常感谢您的任何指导。
Cassandra 中的模式设计,对于高效的表,将不利于您的 RDBMS 经验;为了效率,Cassandra更喜欢 denormalization,而不是 normalization 。通过这种方式,我的意思是,如果你有一些用户信息和你想查找,使用两个不同的主键,然后使用数据卡珊德拉,它实际上是更好地使用两个表(和复制数据)。是的,这意味着更多的存储空间,但它也允许更快的读取。
作为旁注,根据我自己的经验,我建议不要使用二级索引,而是简单地使用另一个表。Cassandra 中的二级索引的处理方式略有不同,后台线程会定期更新索引;这使得从索引中读取数据不如仅使用表那么可靠(即更可能以一种不好的方式让您感到惊讶)。
因此,我会根据您的需要推荐类似于以下两个表的内容:
CREATE TABLE users (
id TIMEUUID PRIMARY KEY,
user UUID,
friend UUID
);
CREATE TABLE friends (
id TIMEUUID,
user UUID,
friend UUID,
PRIMARY KEY (user, friend)
);
Run Code Online (Sandbox Code Playgroud)
第二个表可以让你做你的 CQL 查询:
SELECT * FROM friends WHERE user = ?
Run Code Online (Sandbox Code Playgroud)
请注意,该friends
表使用复合主键。这允许有多个friend
值与该单个值相关联user
。
这种多表方法的缺点之一是,您的应用程序代码现在必须负责为单个“更新”写入两个表,并且您必须处理任何潜在的偏差/协调。Cassandra 通过避免强制执行外键约束等并将其留给应用程序,以多种方式实现其性能。
希望这可以帮助!
归档时间: |
|
查看次数: |
7042 次 |
最近记录: |