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 量のアイテムを取得するなどの単純なことを容易にする方法について混乱しています。

この例では、フィード アイテム ID を持つ時間ベースの UUID としての created_time を格納する複合キーを持つことに言及している 1 つの戦略について聞いたことがありますが、まだ少し混乱しています。

たとえば、キーが基本的に feedId である一連の行があるとします。上記のように、各行内に一連の列を格納します。問題は、実際のデータ (つまり、JSON、RSS、タイトル) がどこに行くのかということです。その「レコード」のすべてのデータを列の値として保存する必要がありますか?

複合キーのアイデアが好きなので、幅の広い行と狭い(短い?)行を混同していると思いますが、各レコードに他のデータも保存したいので、2つを融合する方法がわかりません...

4

2 に答える 2

1

すべてを 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 列を使用すると、フィードから最後の 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

CQL を使用すると、SQL のバックグラウンドが理解しやすくなります。

Cassandra (および一般的な NoSQL) は非常に高速であり、フィードに関連テーブルを使用しても実際のメリットはありません。とにかく、JOIN を実行することはできません。明らかに、快適であれば 2 つのテーブルを作成することもできますが、アプリケーション コード内でデータのリンクを管理する必要があります。

次のようなものを使用できます。

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 からフィード アイテムを検索する場合は、次のようになります。

SELECT * FROM FeedItem where feedId = '123';

索引を作成するには:

CREATE INDEX FeedItem_feedId ON FeedItem (feedId);

残念ながら、並べ替え/順序付けは、Cassandra では簡単なことではありません。ここここを読むと、探し始める手がかりが得られるかもしれません。また、それは実際に使用するcassandraのバージョンにもよります。

于 2013-03-06T11:28:48.850 に答える