3

キー値ストアをバックエンドとして node.js サービスを作成する必要があります。私のデータは次のようになります。

Item
  Name: "Item 1"
  Attributes
    AttributeA: "ValueA"
    AttributeB: "ValueB"
    AttributeC: "ValueC"

Item
  Name: "Item 2"
  Attributes
    AttributeA: "ValueC"
    AttributeB: "ValueD"

自分の要件に最適なバックエンドはどれかを自問しました。node.js から簡単にアクセスでき、大量のデータ (15 ~ 20 個の属性を持つ 1 ~ 200 万個のアイテム) を処理できる高速なバックエンドが必要です。重要なのは、属性がアイテムごとに異なる可能性があるため、20 個の修正属性がないことです。私の後のクエリは次のようになります。

  • アイテム 1 のすべての属性を取得する
  • (すべての項目から) attributeA のすべての値を取得します
  • attributeB を含むすべてのアイテムを取得する

それとも、couchDB のような noSQL DB の方がよいでしょうか? いくつかのヒントをいただければ幸いです。;)

ありがとうございました

トルベン

4

3 に答える 3

3

おそらく他のパラメーター (属性のサイズ、タイプ、読み取り/書き込み比率など) に依存しますが、MongoDb (個人的には使用していませんが、couchDb など) のようなドキュメント データベースは、ぴったり。その理由は、属性の「値」に基づいてクエリを実行する必要があるためです。これは、Redis のようなデータベースでは不可能です (提案したスキーマを変更することなく、Redis は多くのユースケースに非常に適していますが)。 )。

{name: "Item 1", AttributeA: "ValueA", AttributeB "ValueB"...} のようなドキュメントを使用すると、言及したクエリを実装できます。

db.docs.find({name: "項目 2"}); (このクエリを頻繁に使用する場合は、おそらく名前にインデックスを設定します) db.docs.distinct('attributeA'); db.docs.find({attributeB: {$exists: true}}});

等々...

ここで非常に優れた nodejs mongodb ドライバーを見つけることができます: https://github.com/christkv/node-mongodb-native

お役に立てれば!

于 2012-03-27T12:46:30.507 に答える
1

mongoDB はあなたにぴったりだと思います。これは厳密にはキー/バリュー ストアではありませんが、少し異なるドキュメント ストアです。

nodejs を使用した mongo の優れている点は次のとおりです。

  • インデックス可能なキー。
  • 複合インデックスを使用すると、複数属性のクエリを高速に実行できます。
  • スキーマレス。必要に応じて属性を追加/削除できます。これは、一部のアイテムの属性がない場合に役立ちます。
  • 高速です。私がこれまでに行ったことはすべて驚くほど高速です。
  • 大量のドキュメント用に作られています。適切に索引付けされた何百万ものアイテムは、mongodb を疑問に笑わせるだけです。
  • パワフル。findAndModify や map/reduce などを使用すると、驚くほどの柔軟性が得られます。そして、ほとんどの場合、それらは必要ありません。
  • おなじみの JavaScript 構文。this.db.items.findOne({attrA : 'value'}) はちょうどいい感じです。

いくつかの制限があります:

  • 誰もが node-js/mongodb ドライバーを開始したようです。最も完全なhttps://github.com/christkv/node-mongodb-nativeには、ユーザビリティの問題がいくつかあります。あなたのコードは、非常にコールバック主導のように見えます。
  • ドキュメントごとに 16 MB の制限。通常は問題ありませんが、注意が必要です。
  • シャーディングは、エンジニアリング/設計の演習です。それほど複雑ではありませんが、少し前もって考えておく必要があります。単一のサーバーから始めて、必要に応じて拡張します。
  • 64 ビット サーバーが必要です。今日では通常問題ではありませんが、注意すべきことがあります。

いつものように、ツールを知っておいてください。この本を読むことをお勧めします: http://manning.com/banker/ . とてもよく書かれています。

于 2012-03-27T17:55:38.783 に答える
0

Redis を使用して実行したい場合は、少し注意が必要です。

特定の属性を持つすべてのアイテムの取得を処理します。属性ごとに設定します。アイテムを追加するたびに、属性がある場合はセットに追加します。属性を持つすべてのアイテムを取得する場合は、セット全体を要求し、それに基づいてすべてのアイテムを取得します。

何かを追加する

HMSET item1 attributeA value attributeB value
SADD set_attributeA item1
SADD set_attributeB item1

あなたのケースのために

1.

HGETALL item1

2.

SMEMBERS set_attributeA

次に、反復してすべての値を取得します

HGET item1 attributeA

3.

use HGETALL instead of HGET

ノードライブラリの使用https://github.com/mranney/node_redisには、HGETALL の結果からオブジェクトを作成したり、hmset を使用してオブジェクトをハッシュに格納したりするなど、いくつかの優れた追加機能があります。

于 2012-03-28T02:56:26.300 に答える