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