首页 文章

Cassandra cql有点多种

提问于
浏览
0

我想一次查询两个列系列...我正在使用cassandra-cql gem用于rails,我的列系列是:

用户
以下
追随者
USER_COUNT
MESSAGE_COUNT
消息

现在我想从用户关注的人那里获取所有消息 . 是否有一种带有cassandra-cql的multiget或者是否有任何其他可能性通过更改datamodel来获取这种数据?

1 回答

  • 2

    我会将您当前的数据模型称为传统的实体/关系设计 . 这对于使用SQL数据库是有意义的 . 当您拥有关系数据库时,依靠连接来构建跨多个实体的视图 .

    Cassandra没有任何执行连接的能力 . 因此,不应根据实体和关系对数据进行建模,而应根据打算查询的方式对其进行建模 . 对于“来自用户正在关注的人的所有消息”的示例,您可能有一个列族,其中rowkey是userid,列是来自用户所关注的人的所有消息(其中列名是时间戳用户ID和值是消息):

    RowKey                              Columns
    -------------------------------------------------------------------
    |        | TimeStamp0:UserA | TimeStamp1:UserB | TimeStamp2:UserA |
    | UserID |------------------|------------------|------------------|
    |        | Message          | Message          | Message          |
    -------------------------------------------------------------------
    

    您可能还需要一个列系列,其中包含特定用户编写的所有消息(我假设该消息是向所有用户广播的,而不是发送给某个特定用户):

    RowKey                   Columns
    --------------------------------------------------------
    |        | TimeStamp0 | TimeStamp1 | TimeStamp2        |
    | UserID |------------|------------|-------------------|
    |        | Message    | Message    | Message           |
    --------------------------------------------------------
    

    现在,当您创建新消息时,您需要将其插入多个位置 . 但是,当您需要列出用户关注的所有消息时,您只需要从一行获取(这很快) .

    显然,如果您支持更新或删除邮件,则需要在存在邮件副本的任何地方执行此操作 . 您还需要考虑当用户关注或取消关注某人时应该发生什么 . 此问题有多种解决方案,您的解决方案将取决于您希望应用程序的行为方式 .

相关问题