13

Riakでデータをモデル化する方法を理解しようとしています。ニュースと製品の2つの機能を備えたCMSのようなものを構築しているとしましょう。この情報を複数のクライアントXおよびYに保存できる必要があります。通常、これをどのように構成しますか?

  1. クライアントごとに1つのバケット、次に2つの主要なニュース製品。各キーの下に複数のオブジェクトを保存し、map/reduceを使用してそれらを並べ替えます。

  2. ニュースと製品の両方を同じバケットに保存しますが、ニュースアイテムと製品アイテムごとに新しい自動生成キーを使用します。つまり、X用に1つ、Y用に1つのバケットです。

  3. クライアント/機能の組み合わせごとに1つのバケット、つまり、バケットはX-newsX-productsY-news、およびY-productsになります。次に、バケット全体でmap / reduceを使用して、結果を順番に返します。

この問題を処理するための最良の方法はどれですか?

4

2 に答える 2

15

ニュースと製品の2つのバケットを作成します。次に、各バケットのキーにクライアント名のプレフィックスを付けます。日付の範囲を簡単にするために、ニュースキーにも日付を含めると思います。

news/acme_2011-02-23_01
news/acme_2011-02-23_02
news/bigcorp_2011-02-21_01

オプションで、製品名の前にカテゴリ名を付けます

products/acme_blacksmithing_anvil
products/bigcorp_databases_oracle

次に、map / reduceでキーフィルタリングを使用できます:

// BigCorp News items
{
  "inputs":{
     "bucket":"news",
     "key_filters":[["starts_with", "bigcorp"]]
  }
  // ... rest of mapreduce job
}

// Acme Blacksmithing items
{
  "inputs":{
     "bucket":"products",
     "key_filters":[["starts_with", "acme_blacksmithing"]]
  }
  // ... rest of mapreduce job
}

// News for all clients from Feb 12th to 19th
{
  "inputs":{
     "bucket":"news",
     "key_filters":[["tokenize", "_", 2],
                    ["between", "2011-02-12", "2011-02-19"]]
  }
  // ... rest of mapreduce job
}
于 2011-02-24T00:34:33.527 に答える
7

キーフィルタリングを使用するよりもさらに効率的なアプローチは、このシナリオをモデル化するために、セカンダリインデックスまたはRiakSearchを使用することです。

メッセージを保存する目的でクラスター化されたNoSQLDBに対する私の回答を見てください。およびRiakのリンク:グラフデータベースと比較して、何ができるか、何ができないか?同様のケースの議論のため。

ユースケースに応じて、いくつかの決定を行う必要があります。いずれの場合も、会社のバケットから開始するため、会社ごとに一意のキーがあります。

1)関心のあるアイテムを2つの別々のバケット(ニュース製品)に保存するか、1つのバケット( items_of_interestのようなもの)に保存するかは、好みとクエリのしやすさによって異なります。会社のニュースと製品の両方を1つのクエリで常にクエリする場合は、それらを1つのバケットに保存することをお勧めします。ただし、特に「CompanyX-Products」と「CompanyX-News」に別々のタブやページがある場合は、それらを簡単に追跡できるように、2つの別々のものを使用することをお勧めします。また、それらを1つのフィードに結合する必要がある場合は、2つのクエリ(1つはニュース用、もう1つは製品用)を作成し、クライアントコードで(日付などで)結合します。

2)ニュース/製品アイテムが属する会社を1つだけ持つことができる場合は、アイテムごとにcompany_keyにセカンダリインデックスを作成します。このようにして、その会社のセカンダリインデックス(2i)クエリを介して、その会社のすべてのニュースまたは製品を簡単に取得できます。

3)多対多の関係がある場合(ニュース/製品アイテムが複数の会社に属することができる場合(おそらくニュースアイテムは2つの別々の会社の合弁事業に関するものです))、関係を別のRiakとしてモデル化することをお勧めしますオブジェクト。たとえば、メンションバケットを作成し、ニュースストーリーで言及された会社ごとに、独自のキーとcompany_keyのセカンダリインデックスを持つMentionオブジェクトを挿入し、値にタイプ('news'または'product')およびitem_key(ニュースキーまたはプロダクトキー)。このようにRiakオブジェクトを分離するために関係を抽出すると、多くの興味深いことを実行できます。RiakSearchを使用して任意にタグを付けたり、サブスクリプションイベント通知を照会したりできます。

于 2012-10-21T20:46:52.850 に答える