0

我的任务是在 Cassandra 中简单地建模。不过,我几乎完全来自 SQL 背景,但在弄清楚它时遇到了一些麻烦。

基本上,我们有一个订阅列表,我们会定期收听该更新。这可以是 RSS、JSON、ATOM、XML 等(取决于提要)。

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

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

Feed:
feedId
name
URL

FeedItem:
feedItemId
feedId
title
json
rss
created_time

我很困惑如何在 Cassandra 中对数据进行建模以促进简单的事情,例如按创建的降序获取特定提要的 x 数量的项目(这可能是最常见的查询)。

我听说过一种策略提到有一个复合键存储,在这个例子中,created_time 作为一个基于时间的 UUID 和提要项 ID,但我仍然有点困惑。

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

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

4

2 回答 2

1

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

例如,Feed 可以有 1 个列族,该键的列是 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

Feeds 列可让您快速获取 Feed 的最后 N 项,但查询 Feed 的最后 N 项不需要获取每个 FeedItem 的所有数据,要么不获取任何数据,要么仅获取摘要。

然后你可以使用另一个列族来存储实际的 FeedItem 数据,

FeedItems # column family 
    feed-item-id1 # key
        rss   # 1 column for each field of a FeedItem
        title # 
        ...
于 2013-03-03T22:02:51.020 回答
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 使用不同的数据类型,可用的数据类型可以在此处找到,并且根据您使用的语言和客户端,它可以是透明的,也可以需要更多的工作才能使其正常工作。

您可能想要添加一些二级索引。例如,如果您想从特定的 feedId 中搜索 feed 项目,例如:

SELECT * FROM FeedItem where feedId = '123';

创建索引:

CREATE INDEX FeedItem_feedId ON FeedItem (feedId);

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

于 2013-03-06T11:28:48.850 回答