Cassandra更改主键与触发多个选择查询

Pha*_*aoh 2 cassandra nosql database-partitioning scylla cassandra-3.0

我有一个表存储用户拥有的列表产品.该表看起来像这样.

create table my_keyspace.userproducts{
  userid,
  username,
  productid,
  productname,
  producttype,
Primary Key(userid)
}
Run Code Online (Sandbox Code Playgroud)

所有用户都属于一个组,组中最多可以有1到100个用户

userid|groupid|groupname|
1     |g1     | grp1  
2     |g2     | grp2  
3     |g3     | grp3  
Run Code Online (Sandbox Code Playgroud)

我们有新要求在一个组中显示所有用户的所有产品.

所以我更改了我的用户产品,以便我的分区键现在是groupid并将userid作为我的群集密钥,这样我就可以在一个查询中获得所有结果.

或者我保持我的表设计原样并通过从第二个表中选择组中的所有用户来激发多个选择查询,然后为每个用户触发一个选择查询,在我的代码中合并数据然后将其返回给用户

谢谢.

Nad*_*'El 5

甚至在回答您的问题之前,您提交的数据建模存在问题:您说您要存储"用户拥有的列表产品".但这不是您提供的表格 - 您的表格为每个用户ID都有一个产品."userid"是表的键,表中的每个条目(即每个唯一的用户ID)都具有其他字段的组合.

如果您确实希望每个用户都有一个产品列表,那么您需要使用主键(userid, productid).这意味着每个记录由索引两种用户名字和产品ID,或者换句话说-一个用户ID有其自身的productid每个记录列表.Cassandra允许您有效地获取单个用户标识的所有productid记录,因为它将密钥的第一部分实现为"分区密钥",但第二部分是"集群密钥".

关于你的实际问题,你确实有两个选择:要么对原始表进行多次查询,要么进行所谓的非规范化,即创建第二个表,其中包含您想要立即搜索的内容.对于第二个选项,您可以手动执行(每次有新数据时更新两个表),或者让Cassandra使用名为Materialized Views的功能自动更新第二个表.

使用哪两个选项(多个查询或多个更新)实际上取决于您的工作负载.如果它有许多更新和罕见的查询,最好快速保留更新并使查询更慢.另一方面,如果它只有很少的更新但是查询很多,那么最好使更新速度变慢(每次更新需要更新两个表时),但更快地进行查询.另一个重要问题是多少查询延迟对您来说很重要 - 多个查询选项不仅会增加群集上的负载(您可以通过在问题上投入更多硬件来解决),还会增加延迟 - 这个问题不会发生远离更多的硬件和一些用例可能会成为一个问题.

您还可以使用辅助索引功能在Cassandra中实现类似的目标,该功能具有自己的性能特征(在某些方面类似于"多个查询"解决方案).