Предложить базу данных для ключа с несколькими значениями, с высокой степенью масштабируемости - PullRequest
5 голосов
/ 11 июля 2011

У нас есть данные с key-множественными значениями.Каждый ключ может иметь около 500 значений (каждое значение будет около 200-300 символов), а количество таких ключей будет около 10 миллионов.Основная операция - проверка значения, заданного ключом.

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

Я рассматриваю использование базы данных nosql для этой цели, яЯ использовал mongodb раньше, и я не думаю, что он подходит для моего текущего случая.nosql db на основе ключевого значения или семейства столбцов будет лучше. Его не нужно распространять. Кто-то, кто использовал riak, redis, cassandra и т. д., поделится своими мыслями.

Ответы [ 4 ]

2 голосов
/ 13 июля 2011

Из вашего описания кажется, что какое-то хранилище значений ключей будет лучше для вас, сравнивая реляционные БД.

Сами данные кажутся нереляционными.Кажется правильным использовать что-то вроде Cassandra.

Я думаю, что типичной структурой данных для хранения этих данных будет семейство столбцов с Key как Row-key и Columns в качестве значения.

Данные будут выглядеть (нотация JSON):

MyDATA (CF){
    [
      {key1:[{val1-1:'', timestamp}, {val1-2:'', timestamp}, .., {val1-500:'', timestamp}]},
      {key2:[{val2-1:'', timestamp}, {val2-2:'', timestamp}, .., {val2-500:'', timestamp}]},
      ...
      ...
    ]
}

Надеюсь, это поможет.

2 голосов
/ 12 июля 2011

Это делает карту прямо к Кассандре.Ключ строки будет ключом вашей модели, а значения вашей модели будут именами столбцов (да, имена) в Cassandra.Вы можете оставить значение столбца Cassandra пустым или добавить туда метаданные, такие как отметка времени, если это будет полезно.

2 голосов
/ 11 июля 2011

Попробуйте прямой нормализованный подход: одна таблица с этой схемой:

id (primary key)
key
value

У вас есть одна строка для каждого отношения ключ-> значение

Добавьте индекс для каждого столбца, и поиск должен быть достаточно эффективным. Вы профилировали что-либо из этого, чтобы показать узкое место?

0 голосов
/ 13 июля 2011

Я не думаю, что это выходит за рамки MySQL на одной машине.Вам нужно будет настроить вставки, или это займет целую вечность, чтобы загрузить.Вы можете также рассмотреть возможность сжатия ваших значений с помощью COMPRESS () или непосредственно в вашем приложении.Может сэкономить вам 50% или около того.

Redis - это, в основном, база данных в памяти, поэтому, вероятно, ее нетRiak может быть достойным выбором или HBase или Cassandra.

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