我被赋予了在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,标题)?我是否必须将该“记录”的所有数据存储为列值?
我认为我混淆宽行和窄(短?)行,因为我喜欢复合键的想法,但我也想在每条记录中存储其他数据,我不知道如何将两者融合在一起...
答案 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并不容易。也许阅读here和here可以为您提供一些线索,从哪里开始寻找,而且这实际上取决于您将要使用的cassandra版本。