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

Поле _id документа базы данных Cloudant должно быть уникальным. Когда вы создаете документ и оставляете поле _id пустым, база данных создаст его за вас:

Созданные Cloudant _id поля имеют длину 32 символа и полностью состоят из цифр и строчных букв. Они уникальны или, по крайней мере, имеют незначительную вероятность столкновения, поскольку представляют собой длинную псевдослучайную строку символов.

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

В этом случае я использую _id для хранения как типа документа ('user'), так и чего-то уникального для каждого пользователя, которого я сохраняю ('glynn'), в одном и том же портмоне _id.

Создание сортируемого поля _id

В некоторых приложениях было бы полезно, чтобы поле _id было отсортировано по дате / времени. _id используется для создания первичного индекса базы данных, который используется для выборки документов по их идентификатору (GET /db/id) и при выборе диапазонов документов (GET /db/_all_docs). Если _id поля базы данных отсортированы по времени, я мог бы извлекать данные по времени, не создавая вторичный индекс, например. Я мог бы получить 100 последних добавленных документов в базу данных, просто запросив первичный индекс:

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

Одно решение опубликовано в библиотеке kuuid Node.js, которую я написал специально для этой цели. Просто используйте kuuid.id() для генерации ваших _id значений:

который создает документ, который выглядит следующим образом:

Как работают сортируемые идентификаторы?

Идентификатор, сгенерированный kuuid, состоит из 32 символов, состоящих из цифр и букв верхнего и нижнего регистра. Он разделен на две части:

  1. первые восемь символов содержат дату / время, сохраненные как количество секунд с 1 января 1970 года.
  2. остальные двадцать четыре символа - это 128 бит случайных данных.

Обе части информации закодированы в «базе 62», что позволяет упаковать больше информации в то же количество символов с использованием набора символов с учетом регистра.

Два идентификатора, сгенерированные в одну и ту же секунду, будут иметь одинаковые первые восемь символов, но шансы на то, что оставшиеся 24 символа столкнутся, исчезающе малы.

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

Путем разумного использования GET / db / _all_docs и параметров _16 _ / _ 17 _ / _ 18_ можно запросить первичный индекс базы данных для предоставления диапазонов документов по типу в приблизительном временном порядке. Библиотека kuuid предоставляет функцию prefix, которая вычисляет 8-значное число для строки, которая соответствует предоставленной пользователем дате или отметке времени:

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

Комбинирование кууида и типа документа

При желании мы могли бы сохранить соглашение о хранении документа type в поле _id:

Наше поле _id теперь отсортировано по типу документа И времени!

Исходный код этого генератора идентификаторов не сложен и может быть легко воспроизведен на других языках программирования. Реализация Node.js опубликована на npm.

Дальнейшее чтение: