在Cassandra处理以下用例?

时间:2013-02-27 10:42:38

标签: cassandra

我被赋予了在Cassandra中建模简单的任务。但是,几乎完全是SQL背景,我在搞清楚方面遇到了一些麻烦。

基本上,我们有一个我们正在定期收听该更新的供稿列表。这可以是RSS,JSON,ATOM,XML等(取决于提要)。

我们想要做的是定期检查每个Feed中的新项目,将数据转换为几种格式(即JSON和RSS)并将其存储在Cassandra商店中。

因此,在RBDMS中,结构类似于:

Feed:
feedId
name
URL

FeedItem:
feedItemId
feedId
title
json
rss
created_time

我很困惑如何在Cassandra中对数据进行建模以简化诸如以降序创建的顺序获取特定Feed的x项目数量(这可能是最常见的查询)。

我听说过一个策略提到有一个复合键存储,在本例中,created_time是一个带有源项ID的基于时间的UUID,但我仍然有点困惑。

例如,假设我有一系列行,其键基本上是feedId。在每行中,我存储了如上所述的一系列列。问题是,实际数据在哪里(即JSON,RSS,标题)?我是否必须将该“记录”的所有数据存储为列值?

我认为我混淆宽行和窄(短?)行,因为我喜欢复合键的想法,但我也想在每条记录中存储其他数据,我不知道如何将两者融合在一起...

2 个答案:

答案 0 :(得分:1)

您可以将所有内容存储在一个列族中。但是,如果每个FeedItem的数据非常大,则可以将每个FeedItem的数据拆分为另一个列族。

例如,您可以为Feed提供1列family,该键的列为FeedItem ID,类似于

Feeds  # column family
   FeedId1  #key
      time-stamp-1-feed-item-id1   #columns have no value, or values are enough info
      time-stamp-2-feed-item-id2   #to show summary info in a results list

“订阅源”列允许您快速获取订阅源中的最后N个项目,但查询订阅源的最后N个项目不需要获取每个FeedItem的所有数据,无论是提取任何内容还是仅提取摘要

然后,您可以使用其他列族来存储实际的FeedItem数据

FeedItems # column family 
    feed-item-id1 # key
        rss   # 1 column for each field of a FeedItem
        title # 
        ...

答案 1 :(得分:1)

根据您的SQL背景,使用CQL应该更容易理解。

Cassandra(和NoSQL一般)非常快,你没有从使用相关表格获得真正的好处,无论如何你将无法做JOIN。显然,如果您觉得舒适,仍然可以创建两个表,但是您必须管理应用程序代码中的链接数据。

您可以使用以下内容:

CREATE TABLE FeedItem (
  feedItemId ascii PRIMARY KEY,
  feedId ascii,
  feedName ascii,
  feedURL ascii,
  title ascii,
  json ascii,
  rss ascii,
  created_time ascii );

在这里,我使用了ascii字段。您可以选择为feedItemId或created_time使用不同的数据类型,并且可以找到可用的数据类型here,并且根据您使用的语言和客户端,它可以是透明的,或者需要更多工作才能使它们正常工作。

您可能想要添加一些二级索引。例如,如果要搜索特定feedId中的Feed项,请执行以下操作:

SELECT * FROM FeedItem where feedId = '123';

创建索引:

CREATE INDEX FeedItem_feedId ON FeedItem (feedId);

排序/订购,唉,这在Cassandra并不容易。也许阅读herehere可以为您提供一些线索,从哪里开始寻找,而且这实际上取决于您将要使用的cassandra版本。