我想存储大量(数亿到数千亿)任意嵌套的散列结构(通常是4-6层),顶层有一些属性。我不需要在嵌套的散列中查询,只需要查询顶级属性。查询必须可以在不编写代码的情况下进行,通常是为了在顶级属性上进行精确匹配。在更新记录时,我希望能够只更新子散列结构中已更改的部分,而不必读/写整个记录。数据库必须具有C、Ruby和Python的绑定/驱动程序。
Mongodb似乎是理想的,除了对单个项目有4MB (很快就会是8MB或16MB)的限制。这些项目中的大多数都很小,但其中一些可能会有100-200MB甚至更大。
是否有其他数据库符合这些条件?
发布于 2011-02-08 10:49:32
Redis不能满足你声明的许多需求,但如果你愿意在它的基础上构建一些东西,它是可以的。
遗漏了两件关键的事情。
首先,Redis不支持嵌套哈希。但是,如果您愿意使用某种编码,一个值可以指向具有另一个散列的键。这将允许任意的嵌套结构。使用这种方法,更新只需要更新已更改的部分。您必须用C、Ruby和Python编写此层。但这将非常简单。
其次,没有一个接口可以让您在不编写代码的情况下查询它。但是这应该是很容易写的。而且你只需要写一次。
发布于 2012-08-07 14:27:06
您可以进行后处理。你将不得不为你的子哈希表中的'id‘键单独命名,但是如果你这样做了,像下面这样的东西应该work...so到目前为止还不错:
给定一个如下所示的存储散列:
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()将执行任何操作。所以这可能不是一个“生产模式”的解决方案。实际上不是这样的,但是在你学会如何使用一些真正的文档数据库解决方案之前,它在过渡阶段是有效的。再次提醒:警告!运行eval可能会很危险!
(如果这对你有帮助,请先-我被禁止问太多问题,需要更多的代表点才能再次提问)
https://stackoverflow.com/questions/4928958
复制相似问题