我想一次查询两个列族......我正在使用 cassandra-cql gem for rails 并且我的列族是:
关注
关注者的用户
user_count
message_count个
消息
现在我想从用户关注的人那里获取所有消息。是否有一种带有 cassandra-cql 的 multiget 或者通过更改数据模型来获取这种数据是否有其他可能性?
我想一次查询两个列族......我正在使用 cassandra-cql gem for rails 并且我的列族是:
关注
关注者的用户
user_count
message_count个
消息
现在我想从用户关注的人那里获取所有消息。是否有一种带有 cassandra-cql 的 multiget 或者通过更改数据模型来获取这种数据是否有其他可能性?
我将您当前的数据模型称为传统的实体/关系设计。这对于使用 SQL 数据库是有意义的。当您拥有一个关系数据库时,您依靠连接来构建跨越多个实体的视图。
Cassandra 没有任何执行连接的能力。因此,您不应根据实体和关系对数据进行建模,而应根据您打算如何查询数据对其进行建模。对于“来自用户关注的人的所有消息”的示例,您可能有一个列族,其中行键是用户 ID,列是来自用户关注的人的所有消息(其中列名是时间戳+用户 ID值是消息):
RowKey Columns
-------------------------------------------------------------------
| | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA |
| UserID |------------------|------------------|------------------|
| | Message | Message | Message |
-------------------------------------------------------------------
您可能还需要一个包含特定用户编写的所有消息的列族(我假设该消息被广播给所有用户,而不是发送给一个特定用户):
RowKey Columns
--------------------------------------------------------
| | TimeStamp0 | TimeStamp1 | TimeStamp2 |
| UserID |------------|------------|-------------------|
| | Message | Message | Message |
--------------------------------------------------------
现在,当您创建一条新消息时,您需要将其插入多个位置。但是,当您需要列出来自用户关注的人的所有消息时,您只需要从一行中获取(这很快)。
显然,如果您支持更新或删除消息,您将需要在有消息副本的任何地方执行此操作。您还需要考虑当用户关注或取消关注某人时会发生什么。这个问题有多种解决方案,您的解决方案将取决于您希望应用程序的行为方式。