Создание идентификатора документа, который будет уникальным и сортируемым по времени
Поле _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 января 1970 года.
- остальные двадцать четыре символа - это 128 бит случайных данных.
Обе части информации закодированы в «базе 62», что позволяет упаковать больше информации в то же количество символов с использованием набора символов с учетом регистра.
Два идентификатора, сгенерированные в одну и ту же секунду, будут иметь одинаковые первые восемь символов, но шансы на то, что оставшиеся 24 символа столкнутся, исчезающе малы.
Документы будут отсортированы в первичном индексе базы данных в приблизительном порядке дат, то есть с точностью до одной секунды.
Путем разумного использования GET / db / _all_docs и параметров _16 _ / _ 17 _ / _ 18_ можно запросить первичный индекс базы данных для предоставления диапазонов документов по типу в приблизительном временном порядке. Библиотека kuuid
предоставляет функцию prefix
, которая вычисляет 8-значное число для строки, которая соответствует предоставленной пользователем дате или отметке времени:
Эта форма запросов немного запутана, но если ваши идентификаторы будут 32-символьными случайными строками, кажется полезным сделать их слабо упорядоченными по времени, чтобы иметь возможность быстро установить документы, которые были добавлены недавно, если ничего другого .
Комбинирование кууида и типа документа
При желании мы могли бы сохранить соглашение о хранении документа type в поле _id
:
Наше поле _id
теперь отсортировано по типу документа И времени!
Исходный код этого генератора идентификаторов не сложен и может быть легко воспроизведен на других языках программирования. Реализация Node.js опубликована на npm.
Дальнейшее чтение: