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

Cassandra更改主键与触发多个选择查询,cassandra,nosql,cassandra-3.0,database-partitioning,scylla,Cassandra,Nosql,Cassandra 3.0,Database Partitioning,Scylla,我有一个表,用于存储用户拥有的产品列表。这张桌子看起来像这样 create table my_keyspace.userproducts{ userid, username, productid, productname, producttype, Primary Key(userid) } 所有用户都属于一个组,一个组中可能有至少1到最多100个用户 userid|groupid|groupname| 1 |g1 | grp1 2 |g2

我有一个表,用于存储用户拥有的产品列表。这张桌子看起来像这样

create table my_keyspace.userproducts{
  userid,
  username,
  productid,
  productname,
  producttype,
Primary Key(userid)
}
所有用户都属于一个组,一个组中可能有至少1到最多100个用户

userid|groupid|groupname|
1     |g1     | grp1  
2     |g2     | grp2  
3     |g3     | grp3  
我们有一个新的要求,即在一个组中为所有用户显示所有产品

所以我要更改我的userproducts,这样我的分区键现在是groupid,并将userid作为集群键,这样我就可以在一个查询中获得所有结果

或者,我是否保持表的设计不变,通过从第二个表中选择组中的所有用户来启动多个select查询,然后为每个用户启动一个select查询,合并代码中的数据,然后将其返回给用户


谢谢。

甚至在开始讨论您的问题之前,您所展示的数据建模存在一个问题:您说您想存储“用户拥有的产品列表”。但这并不是您展示的表所具有的功能—您的表中的每个用户ID都有一个产品。“userid”是表的键,表中的每个条目,即每个唯一的userid,都有一个其他字段的组合

如果确实希望每个用户都有一个产品列表,则需要主键为
(userid,productid)
。这意味着每个记录都由用户ID和产品ID编制索引,或者换句话说,用户ID有一个记录列表,每个记录都有自己的产品ID。Cassandra允许您高效地获取单个用户ID的所有productid记录,因为它实现了键的第一部分作为“分区键”,而第二部分是“集群键”

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

要使用这两个选项中的哪一个—多个查询或多个更新—实际上取决于您的工作负载。如果它有很多更新和罕见的查询,最好让更新保持快速,让查询变慢。另一方面,如果更新很少但查询较多,则最好使更新速度变慢(当每次更新都需要更新两个表时),但使查询速度变快。另一个重要的问题是查询延迟对您来说有多重要-多个查询选项不仅会增加集群上的负载(您可以通过在问题上投入更多硬件来解决),而且还会增加延迟-这个问题不会随着更多硬件而消失,对于某些用例,可能会成为一个问题


在Cassandra中,您也可以通过使用次级索引功能来实现类似的目标,次级索引功能有其自身的性能特点(在某些方面类似于“多查询”解决方案)。

谢谢,我读过有关物化视图的内容,但我读到物化视图存在不一致的问题,其中视图不会随表更新,因此我对创建物化视图有点犹豫。当然,创建一个新表是另一种选择,但这意味着我的代码必须确保数据在各个表之间保持一致,这意味着如果在第一次写入我的数据后,对任何一个表的写入都失败,那么与MV的一致性保证就不完美了。例如,在某些极端情况下(涉及网络问题、重新启动节点等),最终可能会有一段数据出现在原始表中,但不在视图表中,反之亦然。但是,如果您在应用程序中手动执行此操作,那么要获得更好的一致性保证并不容易——正如您所注意到的!最后一个问题,二级索引与多个查询有何相似之处,是不是因为每个查询都必须转到不同的分区才能获取数据?但是由于Cassandra将不负责合并这些查询的结果,这是否会减少延迟,特别是如果我在多个线程中运行select查询并将结果合并到代码中?当您使用辅助索引时,Cassandra内部需要查询该索引以获得行列表,然后读取这些行(因为与MV不同,在SI中,索引只包含行键,而不包含这些行的全部内容)