2010-10-02 5 views
1

Я знаю, что это еще один вопрос по этой теме, но я полный новичок в мире NoSQL, поэтому я хотел бы получить некоторые советы. Люди в SO сказали мне, что MySQL может быть плохой идеей для этого набора данных, поэтому я спрашиваю об этом. У меня есть много данных, в следующем формате:MongoDB или CouchDB или что-то еще?

ТИПА 1

ID1: String String String ... 
ID2: String String String ... 
ID3: String String String ... 
ID4: String String String ... 

, который я надеюсь, чтобы преобразовать в нечто вроде этого:

ТИПА 2

ID1: String 
ID1: String 
ID1: String 
ID1: String 
ID2: String 
ID2: String 

Это самый неэффективный способ, но мне нужно иметь возможность искать как ключ, так и v ALUE. Например, мои запросы будут выглядеть так:

  • Возможно, мне нужно знать, что содержит все строки, заданные идентификатором, а затем пересекают список с другим списком, полученным для другого идентификатора.
  • я, возможно, необходимо знать, что все идентификаторы содержат заданную строку

Я хотел бы, чтобы достичь этой цели без преобразования типа 1 в 2 типа из-за требований отвесных пространства, но хотелось бы знать, если любой из MongoDB или CouchDB или что-то еще (кто-то предложил NoSQL, так начал Googling и нашел, что эти два очень популярны) поможет мне в этой ситуации. Я могу кластер из 14 узлов, который я могу использовать, но хотел бы получить некоторые советы, по которым одна из них является подходящей базой данных для этой утилиты. Какие-либо предложения?

Несколько лишних вещей:

  • вход будет в основном статическим. Я создам новые данные, но не буду изменять какие-либо существующие данные.
  • Идентификатор составляет 40 байт в длину, тогда как строки около 20 байт
+0

Сколько идентификаторов и строк на идентификатор вы ожидаете? – methodin

+0

@methodin: Per ID может быть около 10 - 80000 строк. – Legend

+0

@methodin: О, а также, в Type-1 у меня около 2 миллионов записей. Если я конвертирую это в Type-2, число будет равным 4 миллиардам. – Legend

ответ

3

MongoDB позволит вам хранить эти данные эффективно Тип 1. В зависимости от вашего использования он будет выглядеть, как эти (данные в формате JSON):

массив строк

{ "_id" : 1, "strings" : ["a", "b", "c", "d", "e"] }

Набор кВ Струны

{ "_id" : 1, "s1" : "a", "s2" : "b", "s3" : "c", "s4" : "d", "s5" : "e" }

на основе ваших запросов, я бы, вероятно, использовать массив строк метода. Вот почему:

я, возможно, необходимо знать, что все строки данный ID содержит и затем пересекаются список с другим списком, полученным для другого ID.

Это легко, вы получите один ключевой ключ для идентификатора.В коде, это будет выглядеть примерно так:

db.my_collection.find({ "_id" : 1});

мне может понадобиться знать, что все идентификаторы содержат заданную строку

Точно так же легко:

db.my_collection.find({ "strings" : "my_string" })

Да, это так просто. Я знаю, что «строки» - это технически массив, но MongoDB будет распознавать элемент как массив и прокручивать его, чтобы найти значение. Документы для этого are here.

В качестве бонуса вы можете проиндексировать поле «строки», и вы получите индекс в массиве. Таким образом, находка выше будет действовать относительно быстро (с очевидным компромиссом, что индекс будет очень большим).

С точки зрения масштабирования кластер из 14 узлов может быть почти переполнен. Тем не менее, Mongo поддерживает авто-осколки и репликации. Они даже работают вместе, вот член blog post from a 10gen, чтобы вы начали (10gen делает Mongo).

+0

Спасибо за подробное объяснение. – Legend

Смежные вопросы