Короткие и уникальные ключи в CouchDB

Я хочу написать средство сокращения URL-адресов как отдельное приложение CouchApp, но мне интересно, возможно ли это. Очевидно, что основным требованием к сокращателю URL-адресов является наличие коротких и уникальных ключей.

Я хочу отправить длинный URL-адрес в CouchDB и получить сокращенный URL-адрес. Я думал об использовании обработчика обновлений, но ему пришлось бы запрашивать БД, чтобы проверить, уникален ли ключ, что кажется невозможным.

Есть ли способ генерировать короткие и уникальные ключи с помощью CouchDB? Или мне нужна тонкая оболочка вокруг CouchDB?


person Daniel Hepper    schedule 07.12.2010    source источник


Ответы (1)


Я бы выбрал тонкую обертку, основанную на документах со следующей структурой:

{ _id : short_url , url : long_url }

Вставка нового длинного URL-адреса может быть выполнена за один шаг: пусть оболочка сгенерирует новый _id, попытается выполнить PUT и повторит попытку с новым _id, пока не добьется успеха. Это гарантирует, что каждый короткий URL-адрес используется только один раз.

Боюсь, что подход "создать, попытаться, повторить" — единственная стратегия, обеспечивающая уникальность, и она недоступна без оболочки.

Если вы хотите, чтобы один и тот же длинный URL-адрес повторно использовал один и тот же короткий URL-адрес, вы также можете добавить представление, которое echo(doc.url,null), и получить _id для вашего URL-адреса, если он существует. Это означает, что если несколько клиентов не попытаются добавить один и тот же длинный URL-адрес одновременно, для этого длинного URL-адреса будет использоваться только один короткий URL-адрес.

person Victor Nicollet    schedule 07.12.2010
comment
Я обнаружил, что реализация стратегии генерации, попытки, повторной попытки возможна с помощью внешнего процесса, но это некрасиво. wiki.apache.org/couchdb/ExternalProcesses - person Daniel Hepper; 09.12.2010
comment
Вы также должны убедиться, что _id вашего документа уникальны для всех узлов, чтобы вы могли безопасно реплицировать! Один из способов — добавить уникальный префикс для каждого узла. Хотя это не бесконечно масштабируемо, поскольку у вас может быть только n * 64 узлов, где n — это количество символов, которое вы разрешаете для каждого префикса узла (64 — это количество безопасных символов URL, которые вы можете использовать в своих _ids). Кроме того, если у вас есть несколько миллионов URL-адресов, вам, возможно, придется много раз повторять PUT, прежде чем вы получите уникальный короткий идентификатор... - person ActionOwl; 10.10.2011