Подтвердить что ты не робот

Какой из CouchDB или MongoDB соответствует моим потребностям?

Где я работаю, мы используем Ruby on Rails для создания как бэкэнд, так и внешних приложений. Обычно эти приложения взаимодействуют с одной и той же базой данных MySQL. Он отлично работает для большинства наших данных, но у нас есть одна ситуация, которую я хотел бы переместить в среду NoSQL.

У нас есть клиенты, и у наших клиентов есть то, что мы называем "запасами" - один или несколько из них. В инвентаре может быть много тысяч предметов. В настоящее время это делается через две таблицы реляционной базы данных, inventories и inventory_items.

Проблемы начинаются, когда два разных инвентаря имеют разные параметры:

# Inventory item from inventory 1, televisions 
{
  inventory_id: 1
  sku: 12345
  name: Samsung LCD 40 inches
  model: 582903-4
  brand: Samsung
  screen_size: 40
  type: LCD
  price: 999.95
}

# Inventory item from inventory 2, accomodation
{
  inventory_id: 2
  sku: 48cab23fa
  name: New York Hilton
  accomodation_type: hotel
  star_rating: 5
  price_per_night: 395
}

Поскольку мы, очевидно, не можем использовать brand или star_rating в качестве имени столбца в inventory_items, наше решение до сих пор заключалось в том, чтобы использовать имена общих столбцов, такие как text_a, text_b, float_a, int_a и т.д., и введите третью таблицу, inventory_schemas. Теперь таблицы выглядят так:

# Inventory schema for inventory 1, televisions 
{
  inventory_id: 1
  int_a: sku
  text_a: name
  text_b: model
  text_c: brand
  int_b: screen_size
  text_d: type
  float_a: price
}

# Inventory item from inventory 1, televisions 
{
  inventory_id: 1
  int_a: 12345
  text_a: Samsung LCD 40 inches
  text_b: 582903-4
  text_c: Samsung
  int_a: 40
  text_d: LCD
  float_a: 999.95
}

Это хорошо работает... до определенной степени. Он неуклюжий, он неинтуитивный, и ему не хватает масштабируемости. Мы должны выделять ресурсы для настройки схем инвентаризации. Использование отдельных таблиц не является вариантом.

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

В частности, я посмотрел на CouchDB и MongoDB. Оба выглядят великолепно. Однако есть еще несколько бит и кусочков, которые нам нужно сделать с нашим инвентарем:

  • Нам нужно иметь возможность выбирать элементы только из одного (или нескольких) кадастров.
  • Нам нужно иметь возможность фильтровать элементы на основе его параметров (например, получить все предметы из инвентаря 2, где type - "отель" ).
  • Нам нужно иметь возможность группировать элементы на основе параметров (например, получить самую низкую цену с позиций в инвентаре 1, где бренд "Samsung" ).
  • Мы должны (потенциально) иметь возможность извлекать тысячи элементов за раз.
  • Нам нужно иметь доступ к данным из нескольких приложений; (для обработки данных) и интерфейса (для отображения данных).
  • Желательна быстрая загрузка вставки, хотя это и не требуется.

Основываясь на структуре и требованиях, подходят ли нам CouchDB или MongoDB? Если да, то какой из них лучше всего подходит?

Спасибо за чтение и заблаговременно за ответы.

EDIT: Одна из причин, по которой мне нравится CouchDB, заключается в том, что мы могли бы в интерфейсном приложении запросить данные через JavaScript непосредственно с сервера после загрузки страницы и отобразить результаты без использования какого-либо внутреннего кода. Это приведет к улучшению загрузки страницы и снижению нагрузки на сервер, поскольку выборка/обработка данных будет выполнена на стороне клиента.

4b9b3361

Ответ 1

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

  • Нам нужно иметь возможность выбирать элементы только из одного (или нескольких) кадастров.

Это легко для специальных запросов в любых полях.

  • Нам нужно иметь возможность фильтровать элементы на основе его параметров (например, получить все предметы из инвентаря 2, где type - "отель" ).

Запрос для этого: {"inventory_id" : 2, "type" : "hotel"}.

  • Нам нужно иметь возможность группировать элементы на основе параметров (например, получить самую низкую цену с позиций в инвентаре 1, где бренд "Samsung" ).

Опять же, супер легко: db.items.find({"brand" : "Samsung"}).sort({"price" : 1})

  • Мы должны (потенциально) иметь возможность извлекать тысячи элементов за раз.

Нет проблем.

  • Желательна быстрая загрузка вставки, хотя это и не требуется.

MongoDB имеет гораздо более быстрые объемные вставки, чем CouchDB.

Кроме того, существует интерфейс REST для MongoDB: http://github.com/kchodorow/sleepy.mongoose

Возможно, вы захотите прочитать http://chemeo.com/doc/technology, который рассмотрел проблему поиска свойств с помощью MongoDB.