3

多数 (数億から数千億) の任意にネストされたハッシュ構造 (通常は 4 ~ 6 レベル) を格納し、いくつかの属性を最上位レベルに格納したいと考えています。ネストされたハッシュ内でクエリを実行する必要はなく、最上位の属性に対してのみクエリを実行します。通常、最上位の属性で完全に一致する場合は、コードを記述せずにクエリを実行できる必要があります。レコードを更新するとき、変更されたサブハッシュ構造の部分のみを更新でき、レコード全体を読み書きする必要がないようにしたいと考えています。データベースには、C、Ruby、および Python のバインディング/ドライバーが必要です。

個々のアイテムに 4MB (そして間もなく 8MB または 16MB になる) の制限があることを除けば、Mongodb は理想的であるように思われます。これらのアイテムのほとんどは小さいものですが、一部は 100 ~ 200 MB で、それより大きくなる可能性があります。

これらの条件に一致する別のデータベースはありますか?

4

2 に答える 2

0

Redis は、指定された要件の多くを満たしていませんが、その上に何かを構築する気があれば可能です。

2 つの重要なことが欠けています。

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

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

于 2011-02-08T02:49:32.313 に答える
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 ソリューションの使用方法を習得するまでは、暫定的に機能します。繰り返します: 警告! eval の実行は危険です!

(これが役に立った場合は、ワンアップしてください---質問が多すぎてSOから禁止されており、再度質問できるようにするにはより多くの担当者ポイントが必要です)

于 2012-08-07T06:27:05.590 に答える