CouchDB сопоставляет/уменьшает любое свойство документа во время выполнения?

Я пришел из мира SQL, где поиск выполняется по нескольким свойствам объекта (published = TRUE или user_id = X) и нигде нет объединений (из-за уровня кеша 1:1). Кажется, что база данных документов подойдет для моих данных.

Я пытаюсь выяснить, есть ли способ передать одно (или несколько) свойств объекта в CouchDB map/reduce для поиска соответствующих документов в базе данных без создания десятков представлений для каждого типа документа.

Можно ли передать требуемый ключ(и) свойства документа для сопоставления во время выполнения в CouchDB, чтобы он возвращал совпадающие объекты (или количество совпадающих объектов для разбиения на страницы)?

Например, на одной странице мне нужны все сообщения с doc.user_id из X, которые равны doc.published. На другой странице мне могут понадобиться все документы с doc.tags[] с тегом "спорт".


person Xeoncross    schedule 28.06.2011    source источник


Ответы (3)


Вы можете создать представление, которое выполняет итерацию по ключам в документе и выдает ключ [propertyName, propertyValue] - таким образом вы создаете один индекс со ВСЕМ реквизитом/значением в нем. Было бы массивно, понятия не имею, как будет строиться производительность, и использование диска (вероятно, плохое).

Функция карты будет выглядеть примерно так:

// note - totally untested, my CouchDB fu is rusty
function(doc) {
  for(prop in doc) {
    emit([prop, doc[prop]], null);
  }
}

Работает для базового случая простых свойств и может быть расширен для работы с массивами и создания пары prop/value для каждого элемента в массиве. Это позволит вам обрабатывать теги.

Чтобы запросить его, установите [prop] в качестве ключа запроса в представлении.

person madlep    schedule 28.06.2011
comment
Так что, похоже, это плохая идея. Это возможно, но это плохая идея. Облом, благодаря моему ORM я был свободен от создания SQL-запросов так долго, что мне не хотелось писать методы модели (или представления в CouchDB) для всех различных способов поиска данных. Опять же, по крайней мере, все запросы перечислены в документе _design для всех, кто плохо знаком с проектом. - person Xeoncross; 28.06.2011

В принципе, нет.

Ключевое различие между чем-то вроде Couch и SQL DB заключается в том, что единственный способ делать запросы в CouchDB — это, по сути, представления/индексы. Индексы в SQL необязательны. Они существуют (в основном) для повышения производительности. Например, если у вас небольшая БД, ваше приложение будет нормально работать на SQL с 0 индексами. (Может быть проблема с уникальными ограничениями, но это деталь.)

Общий смысл заключается в том, что часть процессора запросов в базе данных SQL включает в себя другие методы доступа к данным, помимо простых индексов, в частности сканирование таблиц, объединение слиянием и т. д.

В Couch нет процессора запросов. У него есть представления (определяемые JS), используемые для определения индексов B-Tree.

И это все. Это молот Дивана. Это хороший молоток. Он существует в мире обработки данных уже почти 40 лет.

Создание индексов в Couch несколько дорого (в зависимости от объема данных), поэтому «временные представления» не одобряются. И они также требуют затрат на обслуживание, поэтому представления должны быть осознанным элементом дизайна вашей базы данных. В то же время они немного мощнее, чем обычные индексы SQL.

Вы можете легко добавить свою собственную обработку запросов поверх Couch, но это потребует от вас больше работы. Вы можете создать несколько представлений выбора по наиболее популярным или избранным критериям, а затем отфильтровать полученные документы по другим критериям в своем собственном коде. Да, вы должны это сделать, поэтому вы должны задаться вопросом, стоят ли затраченные усилия больше, чем те преимущества, которые, по вашему мнению, предлагает Couch (HTTP API, репликация, безопасное, всегда согласованное хранилище данных и т. д.) по сравнению с решением SQL.

person Will Hartung    schedule 28.06.2011
comment
всегда согласованное хранилище данных - разве CouchDB в конечном итоге не является согласованным, что означает, что он не может быть всегда согласованным, потому что в противном случае он не будет высокодоступным с точки зрения теоремы CAP? - person yojimbo87; 28.06.2011
comment
Если вы говорите о репликации и кластеризации, то да. Что я имел в виду под всегда постоянным, так это то, что в отношении одного экземпляра Couch он защищен от сбоев. База данных всегда находится в согласованном, пригодном для использования состоянии, даже в случае сбоя системы или сервера. После перезапуска БД сразу становится согласованной и пригодной для использования. - person Will Hartung; 28.06.2011

Я столкнулся с похожей проблемой и нашел быстрое решение, используя CouchDB-Python (это отличная библиотека). Это не красивое решение (противоречит принципам CouchDB), но оно работает.

CouchDB-Python предоставляет вам функцию «Запрос», которая позволяет вам «выполнять специальное временное представление для базы данных». Вы можете прочитать об этом здесь

Что у меня есть, так это то, что я сохраняю функцию javascript в виде строки в python и объединяю ее с именами переменных, которые я определяю в Python.

В some_function.py

variable = value

# Map function (in javascript)
map_fn = """function(doc) {
     <javascript code>
     var survey_match = """ + variable + """;
     <javascript code>
"""

# Iterates through rows
for row in db.query(map_fn):
     <python code>

Это, конечно, не очень красиво и, вероятно, ломает кучу философии CouchDB, но это работает.

D

person Daniel    schedule 28.06.2011