пятница, 28 октября 2011 г.

А если в CouchDB View на View надо позарез?

Когда уже на "ты" с CouchDB, почти всегда оказывается, что чего-то не хватает: нет полнотекстового поиска "из коробки", хранилище растёт как на дрожжах и приходится самому следить за его размером и т.д.. С поиском вопрос решается подключением сторонних модулей. С пугающим ростом базы данных в след. релизах вопрос уже решён. Но вот такая хитрая штука как обработка результатов другого представления - этого в ближайших планах разработчиков CouchDB не предвидится. Хотя вещь, безусловно, полезная.

Например, мы можем держать в хранилище сырые данные - скажем, список фактических адресов, забитых кем как попало - и создать для них представление (view), результатом которого будет чёткая структура с разбивкой по стране / городу / индексу / улице / номеру дома и пр.. Чем хорош такой подход? Написать идеальный парсер вручную введённых адресов - дело не одного дня и даже месяца (спорить с этим может только тот, кто с подобной задачей в промышленных масштабах не сталкивался). А вот достаточный для начала работы парсер адресов - дело 1 часа. И это позволит начать разработку след. этапов системы без необходимости ждать полностью готового списка структурированных адресов и (!) даже когда-либо возвращаться к сырым адресам. Непробиваемые аргументы, когда работает команда и/или требуется видимый результат "уже завтра". Мало? Тогда представьте, что каждый день добавляется сотня новых адресов... Потом к парсеру можно возвращаться, делая его всё лучше. Но структурированные данные благодаря созданному представлению уже на руках! И, раз уж начали представлять, предположим, что проект - большой и было принято решение оставить это живое представление (живое - потому что формирует адреса из сырого потока) как источник для других модулей системы. Т.е. менять его вывод - ни-ни!

И вот, хотим некоторым адресатам что-то сами доставлять. Для этой цели хорошо бы группировать адреса по индексам, чтобы раздать списки водителям, сэкономив и бензин, и время (Вы ведь знаете, что такое почтовый индекс). И тут CouchDB оказывается не на высоте, т.к. живой список адресов (в виде гранитного представления) - есть, а вот работать с ним - не можем: CouchDB не поддерживает создание представления для другого представления.

В общем-то, задачу подобную задачу можно решить, периодически копируя результаты работы представления в новую базу; или создав новое представление, которое помимо структурирования адресов (copy / paste здесь поможет) будет делать необходимую нам выборку и группировку по почтовым индексам. Оба решения усложнят дальнейшее сопровождение системы. А ведь как красиво задача решается простым созданием нового представления... на готовые результаты другого!

К счастью, на этой неделе появилась разработка, позволяющая создавать цепочки представлений, благодаря которым изложенная выше задача решается и просто, и красиво > https://github.com/afters/Couch-Incarnate

Для своей работы требует Node.js.

P.S. Строго говоря, couch-incarnate не является единственной альтернативой реализовать представление по результатам другого map/reduce. Активно ведётся разработка целой системы - CloudAnt - на базе CouchDB, где, помимо прочего, поддерживается view на view что называется "из коробки". CloudAnt, безусловно, заслуживает отдельного внимания, но это - не тот CouchDB.

Комментариев нет: