2011-02-08 9 views
3

任意のネストされたハッシュ構造(通常は4〜6レベル)を大量に(数億〜数十億)保存したいと考えています。ネストされたハッシュの内部でクエリを実行する必要はなく、トップレベルの属性に対してのみクエリを実行する必要があります。通常、最上位の属性と完全に一致するように、コードを記述することなく照会が可能でなければなりません。レコードを更新するときに、変更されたサブハッシュ構造の一部だけを更新し、レコード全体を読み書きする必要がないようにしたいと考えています。 dbには、C、Ruby、およびPython用のバインディング/ドライバが必要です。潜在的に大きなネストされたハッシュ構造の膨大な数を格納するために使用するデータベースは何ですか?

Mongodbは、個々のアイテムに4MB(とすぐに8MBまたは16MB)という制限があることを除いて、理想的なようです。これらのアイテムのほとんどは小さくなりますが、その中には100〜200MBで潜在的に大きいものもあります。

これらの基準に一致する別のデータベースがありますか?

+0

あなたがのサンプルを提供することができますそのハッシュ構造はどのように見えますか? –

+0

いいえ、私はあなたに似たようなものを与えることができるかもしれません。具体的に何を知りたいですか? – fields

答えて

0

Redisが指定した要件の多くを満たしていませんが、となります。

2つの重要なことがありません。

まず、Redisはネストされたハッシュをサポートしていません。しかし、ある種のエンコーディングを使用したい場合、値は別のハッシュを持つキーを指すことができます。これにより、任意のネストされた構造が可能になります。このハックでは、更新は変更された部分のみを更新する必要があります。このレイヤーをC、Ruby、およびPythonで記述する必要があります。しかし、それはかなり簡単です。

第2に、コードを記述せずにクエリを実行できるインターフェイスがありません。しかし、それはかなり簡単に書くべきです。そしてあなたはそれを一度書く必要があります。

+0

サブハッシュを別々のレコードに格納するレイヤーを作成する場合、mongodbの場合と同じように簡単に行うことができます。私は大規模な構造を再構築する際の読み込み性能について心配していましたが、それはまた、ターゲットテーブルの項目数/行数を数桁爆発させます。 – fields

+0

@fields:はい、あなたはmongodbのためにそれを行うことができます。 Redisのパフォーマンスはmongodbより優れている可能性が高いですが、読者のパフォーマンスが問題になる可能性があることに私は同意します。そして、はい、それはアイテムの数を爆発させるでしょう。 – btilly

+0

redisを使用すると、複数の属性でアイテム/行をどのようにクエリしますか?私がドキュメントで見たすべてのものには、単一のキーで参照される項目があります。 – fields

0

後処理を行うことができます。あなたはサブハッシュの中の 'id'キーのために別々の名前をつけなければならないでしょうが、あなたがそうするなら、このような何かがうまくいくはずです...とにかくこれほど良いとにかく:とにかくこれほど良いとにかく:とにかくこれほど良い:とにかく今のところ:

そう:

x => #<Company id: 16, name: "JRapid", markets: {"markets"=>"[{:market_id=>12, :market_name=>\"enterprise software\", :parents=>[{:parent_id=>12, :name=>\"enterprise software\", :grandparents=>{:parent_id=>12, :name=>\"enterprise software\"}}]}, {:market_id=>38, :market_name=>\"cloud computing\", :parents=>[{:parent_id=>38, :name=>\"cloud computing\", :grandparents=>{:parent_id=>38, :name=>\"cloud computing\"}}]}, {:market_id=>409, :market_name=>\"development platforms\", :parents=>[{:parent_id=>409, :name=>\"development platforms\", :grandparents=>{:parent_id=>409, :name=>\"development platforms\"}}]}, {:market_id=>1132, :market_name=>\"developer tools\", :parents=>[{}]}]"}, locations: {"locations"=>"[{:location_id=>1624, :location_name=>\"california\", :parents=>[{}]}, {:location_id=>1703, :location_name=>\"sunnyvale\", :parents=>[{}]}]"}, follower_count: 8, high_concept: "Rapid development Java cloud platform", product_desc: "JRapid is a Platform as a Service and is the fastes...", urls: {"blog_url"=>"http://www.jrapid.com/blog", "logo_url"=>"https://angel.co/images/icons/startup-nopic.png", "thumb_url"=>"https://angel.co/images/icons/startup-nopic.png", "company_url"=>"http://www.jrapid.com", "twitter_url"=>"http://www.twitter.com/JRapid", "angellist_url"=>"https://angel.co/jrapid"}, status: nil, created_at_or_updated_at: {"created_at"=>"2010-07-21T18:48:32Z", "updated_at"=>"2011-05-07T20:00:37Z"}, screenshots: {"screenshots"=>"[[nil]]"}, created_at: "2012-08-07 05:37:54", updated_at: "2012-08-07 05:37:54"> 

あなたはこのような何かを行うことができます:

x = x.locations 
x = x['locations'] 
x = eval(x) 
x[0][:id] 
#=> 1624 

警告:実行中のeval()は、指定された文字列に何でもかかります。だから、これは "生産モード"の解決策ではないかもしれません。実際にはそうではありません。しかし、実際のDocument-DBソリューションを使用する方法を学ぶまでは、暫定的には機能します。 もう一度:警告!ランニングエバールは危険です!

(これはあなたを助けている場合、してください1アップ---私はあまりにも多くの質問をするためにSOから禁止して、再度質問をすることができるように多くの担当者のポイントを必要としています)

関連する問題