Какую базу данных следует использовать для хранения огромного количества потенциально больших вложенных хеш-структур? - PullRequest
3 голосов
/ 08 февраля 2011

Я хочу хранить большое количество (от сотен миллионов до сотен миллиардов) произвольно вложенных хеш-структур (обычно 4-6 уровней) с некоторыми атрибутами на верхнем уровне.Мне не нужно делать запросы внутри вложенного хэша, только по атрибутам верхнего уровня.Запросы должны быть возможны без написания кода, как правило, для точных совпадений атрибутов верхнего уровня.При обновлении записей я хотел бы иметь возможность обновлять только часть структур подхешей, которые изменились и не должны читать / записывать всю запись.БД должен иметь привязки / драйверы для C, Ruby и Python.

Mongodb может показаться идеальным, за исключением того, что для отдельных элементов существует ограничение в 4 МБ (и скоро оно составит 8 МБ или 16 МБ).Большинство из этих элементов будут небольшими, но некоторые из них могут быть размером 100–200 МБ и, возможно, больше.

Существует ли другая база данных, которая соответствует этим критериям?

Ответы [ 2 ]

0 голосов
/ 07 августа 2012

Вы можете сделать пост-обработку. Вам нужно будет дать отдельные имена для ключей '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 за то, что задаю слишком много вопросов, и мне нужно больше точек повторения, чтобы я мог снова задавать вопросы)

0 голосов
/ 08 февраля 2011

Redis не удовлетворяет многим вашим заявленным требованиям, но может , если вы хотите что-то построить на его основе.

Две ключевые вещи отсутствуют.

Прежде всего Redis не поддерживает вложенные хэши.Но если вы хотите использовать какую-то кодировку, значение может указывать на ключ с другим хешем.Это позволило бы произвольные вложенные структуры.С этим хаком обновления должны обновлять только ту часть, которая изменилась.Вы должны написать этот слой на C, Ruby и Python.Но это было бы довольно просто.

Во-вторых, не существует интерфейса, который позволял бы запрашивать его без написания кода.Но это должно быть довольно легко написать.И вам нужно написать это только один раз.

...