MongoDB или CouchDB или что-то еще? - PullRequest
1 голос
/ 02 октября 2010

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

ТИП 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

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

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

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

Несколько дополнительных вещей:

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

1 Ответ

3 голосов
/ 02 октября 2010

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

Массив строк

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

Набор строк KV

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

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

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

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

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

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

Так же просто:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...