我应该使用什么数据库来存储大量可能较大的嵌套散列结构?

问题描述:

我想存储大量(数亿至数千亿)任意嵌套的散列结构(通常为4-6层),并且顶层有一些属性。我不需要在嵌套散列内查询,只需要在顶层属性中查询。无需编写代码就可以进行查询,通常用于精确匹配*属性。当更新记录时,我希望能够仅更新已更改的部分子哈希结构,而不必读取/写入整个记录。 db必须具有C,Ruby和Python的绑定/驱动程序。我应该使用什么数据库来存储大量可能较大的嵌套散列结构?

Mongodb似乎是理想的,除了单个项目有4MB(很快将达到8MB或16MB)限制。这些项目中的大部分都很小,但其中一些可能是100-200MB,可能更大。

是否有另一个符合这些标准的数据库?

+0

你能提供的样本那个哈希结构可能看起来像什么? – 2011-02-09 21:10:25

+0

不,但我可能会给你看起来类似的东西。你想知道什么? – fields 2011-02-09 21:10:25

Redis不符合您所陈述的许多要求,但如果您愿意在其上构建某个产品,则它可能会

缺少两个关键的东西。

首先,Redis不支持嵌套散列。但是如果你愿意使用某种编码,一个值可以指向另一个散列的密钥。这将允许任意嵌套结构。有了这个黑客,更新只需要更新更改的部分。你必须用C,Ruby和Python编写这个图层。但它会很简单。

其次,没有一个接口可以让你查询它而无需编写代码。但是这应该很容易编写。你只需要写一次。

你可以做后期处理。你将不得不为你的subhashes中的'id'键分别命名,但是如果你这样做了,像这样的东西应该可以工作...至今如此好:

给出一个存储的散列所以:在给定的字符串运行的eval()将采取任何事情:

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可能很危险!

(如果这帮助了你,请一起来---我从SO禁止问太多的问题,需要更多的代表处点,以便能够再次发问)