Как взять среднее значение больших данных в MongoDB против CouchDB? - PullRequest
6 голосов
/ 13 июля 2011

Я смотрю на этот график ...

http://www.mongodb.org/display/DOCS/MongoDB,+CouchDB,+MySQL+Compare+Grid

... что говорит:

Метод запроса

CouchDB - Отображение / уменьшение функций javascript для ленивого построения индекса для запроса

MongoDB - Динамический; объектно-ориентированный язык запросов

Что именно это значит? Например, если я хочу взять в среднем 1 000 000 000 значений, автоматически ли CouchDB делает это способом MapReduce?

Может кто-нибудь подсказать мне, как взять в среднем 1 000 000 000 значений в обеих системах ... это был бы очень яркий пример.

Спасибо.

Ответы [ 2 ]

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

Представления CouchDB - странный и захватывающий зверь.

CouchDB выполняет инкрементное отображение / уменьшение, то есть, если вы укажете свой «вид», он будет работать как материализованный вид.из реляционной базы данных.Не имеет значения, составляете ли вы в среднем 3 или 3 миллиарда документов.Результат есть.

Но здесь есть тройная ошибка

1) Запросы выполняются быстро после создания представления и обновления .Создание представления может быть медленным, если у вас много небольших документов (если возможно, используйте более толстые документы).Как только представление создано, промежуточные шаги сокращения сохраняются в узлах B-дерева, и вам не нужно будет повторно вычислять их.

2) Представления обновляются лениво, когда вы выполняете запрос.Чтобы иметь предсказуемую производительность, лучше настроить какую-либо работу, чтобы регулярно обновлять их. Как вы планируете обновления индекса в CouchDB

3) У вас должно быть довольно хорошее представление о том, как вы будете запрашивать данные с помощью составных ключей, диапазонов и группировки.CouchDB отстой при выполнении специальных запросов.http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

Я уверен, что кто-то скоро опубликует детали того, как усреднить 1 000 000 000 элементов в обеих базах данных, но вы должны понимать, что CouchDB заставляет вас выполнять более предварительную работу, чтобы воспользоваться ее преимуществами.поэтапный подход.Это действительно нечто совершенно уникальное, но на самом деле оно не предназначено для сценариев, когда вы выполняете средние значения или что-то еще для специальных запрашиваемых данных.

В Mongo вы можете использовать либо map / проводить (не инкрементно. Этобудет иметь значение, усредняете ли вы в среднем 3 или 3 миллиарда документов, но монго считается невероятно быстрым благодаря подходу ввода-вывода с отображением в памяти) или их функциям агрегирования.http://www.mongodb.org/display/DOCS/Aggregation

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

Я не могу говорить о MongoDB, но могу рассказать вам о CouchDB. CouchDB может быть запрошен только через Map / Reduce View Engine. На самом деле, отличное место для начала - это раздел вики.

Представление содержит функцию map и опциональную функцию уменьшения . Типичным языком для написания этих функций является JavaScript, но есть опция Erlang, и можно создать движок представления практически на любом другом языке программирования.

Функция карты служит для построения набора данных из документов в базе данных. Функция сокращения служит для агрегирования этого набора данных. Таким образом, функция карты запускается для каждого отдельного документа в базе данных после создания представления. (и первый запрос) После создания эта функция запускается только для документа, который был только что создан, или изменен / удален. Таким образом, индексы представления строятся постепенно , а не динамически.

В случае 1 000 000 000 значений CouchDB не нужно будет вычислять результаты вашего запроса каждый раз, когда он запрашивается. Вместо этого он будет сообщать только о значении сохраненного индекса представления, который сам меняется только при создании / обновлении / удалении документа.

Что касается написания функций Map / Reduce, большая часть этой работы остается за программистом, так как нет встроенных функций карты. (т.е. это не «автоматический») Однако, есть несколько собственных функций уменьшения (_sum, _count, _stats).

Вот простой пример, мы подсчитаем средний рост некоторых людей.

// sample documents
{ "_id": "Dominic Barnes", "height": 64 }
{ "_id": "Some Tall Guy", "height": 75 }
{ "_id": "Some Short(er) Guy", "height": 58 }

// map function
function (doc) {
  // first param is "key", which we do not need since `_id` is stored anyways
  emit(null, doc.height);
}

// reduce function
_stats

Результаты этого представления будут выглядеть так:

{
  "rows": [
    {
      "key": null
      "value": {
        "sum": 197,
        "count": 3,
        "min": 58,
        "max": 75,
        "sumsqr": 13085
      }
    }
  ]
}

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

...