Лучшее хранилище ключей-значений для моего сервиса node.js - PullRequest
3 голосов
/ 27 марта 2012

Мне нужно написать сервис node.js с хранилищем ключей-значений в качестве бэкэнда.Мои данные выглядят так:

Item
  Name: "Item 1"
  Attributes
    AttributeA: "ValueA"
    AttributeB: "ValueB"
    AttributeC: "ValueC"

Item
  Name: "Item 2"
  Attributes
    AttributeA: "ValueC"
    AttributeB: "ValueD"

Я спросил себя, какой сервер лучше всего подходит для моих требований.Мне нужен быстрый бэкэнд, который легко доступен из node.js и может обрабатывать большие объемы данных (1-2 миллиона элементов с 15-20 атрибутами).Важно то, что атрибуты могут отличаться от элемента к элементу, поэтому нет 20 фиксированных атрибутов.Мои последующие запросы будут выглядеть так:

  • Получить все атрибуты для элемента 1
  • Получить все значения атрибута A (из всех элементов)
  • Получить все элементы, содержащиеattributeB

Или, может быть, лучше использовать базу данных noSQL, например couchDB?Буду признателен за некоторые советы.;)

Спасибо

Торбен

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Хотя это, вероятно, зависит от других параметров (таких как размер атрибутов, их тип, соотношение чтения / записи), я думаю, что база данных документов, такая как MongoDb (или couchDb, даже если я не использую ее лично) было бы хорошо подходит. Причина в том, что вы хотите делать запрос на основе «значения» атрибутов, что невозможно в базе данных, такой как Redis (без изменения предложенной вами схемы, и хотя Redis отлично подходит для многих случаев использования) ).

С такими документами: {name: "Item 1", AttributeA: "ValueA", AttributeB "ValueB" ...} вы можете реализовать запросы, о которых вы упомянули:

db.docs.find ({имя: "Элемент 2"}); (возможно, установив индекс на имя, если вы часто используете этот запрос) db.docs.distinct ( 'attributeA'); db.docs.find ({attributeB: {$ exist: true}}});

и так далее ...

Вы можете найти очень хороший драйвер для nodejs mongodb здесь: https://github.com/christkv/node-mongodb-native

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

1 голос
/ 27 марта 2012

Я думаю, что mongoDB подойдет для вас. Это не совсем хранилище ключей / значений, а хранилище документов, которое немного отличается.

Вот что хорошо в монго с nodejs:

  • Индексные клавиши.
  • Составные индексы позволяют быстро запрашивать несколько атрибутов.
  • Схема меньше. Вы можете добавлять / удалять атрибуты по своему усмотрению. Это будет полезно для вас, если у вас нет атрибутов для некоторых предметов.
  • Быстро, все, что я когда-либо делал с этим, удивительно быстро.
  • Сделано для тонны документов. Ваши миллионы предметов, правильно проиндексированных, только заставят mongodb смеяться над любыми сомнениями.
  • Мощный. Такие вещи, как findAndModify и map / lower дают вам удивительную гибкость. И в большинстве случаев они вам даже не нужны.
  • Знакомый синтаксис JavaScript. this.db.items.findOne ({attrA: 'value'}) просто чувствует себя хорошо.

Вот некоторые ограничения:

  • Кажется, что все запустили драйвер node-js / mongodb. Самый полный, https://github.com/christkv/node-mongodb-native, имеет некоторые проблемы с юзабилити. Ваш код в конечном итоге выглядит очень управляемым обратным вызовом.
  • 16 МБ ограничение на документ. Обычно это не проблема, но нужно быть осторожнее.
  • Sharding - это упражнение в проектировании / дизайне. Это не слишком сложно, но для этого нужно немного подумать. Я бы начал с одного сервера и расширил бы по мере необходимости.
  • Вам нужен 64-битный сервер. Не обычно проблема в этот день, но кое-что, о чем нужно знать.

Как всегда, знайте свои инструменты. Я бы порекомендовал прочитать эту книгу: http://manning.com/banker/. Она очень хорошо написана.

0 голосов
/ 28 марта 2012

Если вы хотите сделать это с помощью Redis, это немного сложно.

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

Добавление чего-либо

HMSET item1 attributeA value attributeB value
SADD set_attributeA item1
SADD set_attributeB item1

Для ваших дел

1

HGETALL item1

2

SMEMBERS set_attributeA

затем просто итерируйте и получите все значения

HGET item1 attributeA

3

use HGETALL instead of HGET

Для использования библиотеки узлов https://github.com/mranney/node_redis она имеет несколько приятных дополнительных вещей, таких как создание объектов из результатов HGETALL, а также хранение объектов в хешах с помощью hmset

...