Cassandra中的宽行与集合比较

3
我正在尝试在Cassandra中建模多对多的关系,例如Item-User关系。用户可以喜欢许多物品,而物品也可以被许多用户购买。假设“喜欢”事件发生的顺序不是一个问题,并且最常用的查询是根据物品和用户返回“喜欢”。
有一些帖子讨论数据建模的问题,请参考这里
另一种方法是在用户表中存储一组ItemID以表示该用户喜欢的物品,并在CQL3的Items表中执行类似的操作。
问题:
  1. 使用集合会影响性能吗?我认为它们转换为复合列? 因此读取模式、缓存和其他因素应该类似?
  2. 对于写入频繁的应用程序,集合的性能是否较差?频繁更新集合是否性能较差?
1个回答

2
使用宽行而不是集合有几个优点:
  1. 集合中允许的元素数量为65535(无符号短整型)。如果可能存在超过该数量的记录,请使用宽行,因为该限制要高得多(每个分区的20亿个单元格(行*列))。
  2. 读取集合列时,每次都会读取整个集合。与宽行相比,您可以在查询中限制要读取的行数,或者根据聚簇键限制查询条件(即日期>2015-07-01)。
对于您特定的用例,我认为建模“items_by_user”表比在“users”表上使用list<item>列更理想。

你不觉得如果我创建一个 items_by_user 表,那么在读取数据时我将不得不进行单独的 SELECT 查询吗? - Manish Kumar
这并不是什么不寻常的事情。你只需要考虑将数据存储在查询的上下文中。如果每次查询项目时都需要完整的用户数据,那么可以将用户数据存储在静态列(姓名、地址等)中,这样它们就可以在用户共享的所有项目之间共享。如果您已经从先前的查询中获取了用户数据或根本不需要它,则不需要在items_by_user中使用该数据。 - Andy Tolbert
Cassandra适合将数据插入到多个表中,并在不同的表上执行多个SELECT操作吗?例如,Select id FROM table1,然后SELECT col FROM table2 where rowId = <来自第一个表的id> - Manish Kumar
当然可以这样做,如果这是一个常见的模式,如果合理的话,你可以考虑将所有数据放在一个表中。 - Andy Tolbert
您的问题略微偏题,如果您需要更多信息,请创建一个新问题,我可以提供更多信息。 - Andy Tolbert
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接