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