CouchDB - Параметр и представления - Что происходит за кулисами, и это быстрее / быстрее, чем временные представления? - PullRequest
2 голосов
/ 08 апреля 2011

Учитывая эти три документа ...

[
    {
        _id: "...",
        _rev: "...",
        title: "Foo",
        body: "..."
    },
    {
        _id: "...",
        _rev: "...",
        title: "Bar",
        body: "..."
    },
    {
        _id: "...",
        _rev: "...",
        title: "Hello World!",
        body: "..."
    },
]

И это представление ...

byTitle: {
    map: function (document)
    {
        emit(document.title, document);
    }
}

Что происходит за кулисами, когда я запрашиваю представление?...

GET /database/_design/posts/_view/byTitle?key="Foo"

В последнее время я задавал несколько вопросов о представлениях ... вопросы о том, что я назвал "динамическими параметрами" ... По сути, я хотел знать, как сделать эквивалент SELECT ... WHERE field = parameter

Все ответы подтолкнули меня к использованию временных представлений, которые очень медленные и не должны использоваться в производстве.Итак, мой второй вопрос ... является ли вышеуказанный метод запроса по названию пригодным для использования в производстве?Или я заставляю CouchDB делать невыразимые ужасы с точки зрения производительности? ... По сути, я делаю то же самое, что и временное представление?

Ответы [ 2 ]

6 голосов
/ 09 апреля 2011

Я думаю, что вы неправильно поняли какой-то ответ.Вы можете использовать временный вид для проверки различных функций карты / сокращения.Когда вы удовлетворены кодом, вы должны поместить его в проектный документ и использовать его для запросов.

Временные представления медленные, поскольку индекс создается и удаляется для каждого запроса.Помещая его в проектный документ, CouchDB указывает не удалять индекс и обновлять его (это делается во время запроса).

Так что

GET /database/_design/posts/_view/byTitle?key="Foo"

- самый быстрый способ запросапо названию, поскольку он проиндексирован.

В качестве примечания: вы можете использовать

byTitle: {
    map: function (document)
    {
        emit(document.title, null);
    }
}

и запрос с include_docs=true, чтобы сэкономить место на диске.

2 голосов
/ 09 апреля 2011

Для ответа на ваш вопрос необходимо прояснить несколько вещей (и я надеюсь, что я все понял):

Постоянные и временные представления. Разница между постоянными и временными представлениями заключается в том, что постоянные представленияпредставления хранятся постоянно.

Чтобы понять часть хранения, вам нужно знать, что механизм хранения CouchDB опирается на B + Tree, предлагая очень мощные возможности индексации, которые позволяют нам находить данные в этом хранилище по ключу в «логарифмическом амортизированном времени»."( CouchDB book ).

CouchDB обрабатывает документы «только для добавления».Это означает, что это не так, как в большинстве реляционных СУБД, где отдельные значения в строке таблицы обновляются и происходит блокировка.Если документ обновляется, он просто постепенно устанавливает новую редакцию (_rev) и добавляется в хранилище.

Когда вы создаете постоянное представление при первом запросе для каждого документа в вашем документеВ базе данных выполняется ваше новое представление, которое сохраняет эти данные в новом файле B + дерева для этого представления, обеспечивая тем самым новый индекс для агрегирования данных в соответствии с ключом, который вы определили в своем представлении.

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

Теперь вы должны быть в состоянии понять, почему временные представления хороши для разработки или тестирования в Futon, но, поскольку они должны быть вычислены как новые для всех ваших документов, не рекомендуется для чего-либо другого, кроме разработки.

В любом случае.Марчелло прав.Если вы намереваетесь просто вернуть полные документы, рекомендуется выполнить запрос с помощью «include_docs = true».Зачем?Поскольку B-дерево для вашего постоянного просмотра просто должно будет хранить скопированные данные рядом с вашим индексным ключом.

@ Marcello-Nuccio Я не уверен, хотя, если это правильно сказать, что динамические представления не имеютиндекс?Как я понял, у них есть индекс, но это не имеет смысла, поскольку они вычисляются как новые при каждом запросе?Хорошо, теперь у меня болит боль!

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