Подтвердить что ты не робот

Какова наилучшая практика при создании идентификаторов документов в couchdb?

Мы все знаем, что для реляционных баз данных лучше использовать числовые идентификаторы для первичного ключа.

В couchdb идентификатор по умолчанию, который генерируется, представляет собой UUID. Лучше ли придерживаться значения по умолчанию или использовать легко запоминающийся идентификатор, который будет использоваться в приложении пользователем?

Например, если вы создавали базу данных stackoverflow.com в couchdb, вы бы использовали вопрос slug (например, is-best-practice-when-create-document-ids-in-couchdb) или UUID для каждого документа?

4b9b3361

Ответ 1

Я не эксперт couchdb, но, проведя небольшое исследование, это то, что я нашел.

Простой ответ: используйте UUID, если у вас нет веских оснований.

Более длинный ответ: он зависит от:

Стоимость изменения идентификатора Vs Вероятность изменения идентификатора

Низкая стоимость изменения и вероятность изменения ID

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

Каждый раз, когда другой сайт ссылается на сообщение в блоге, это еще одна ссылка на идентификатор, поэтому стоимость изменения идентификатора увеличивается.

Высокая стоимость изменения идентификатора и идентификатора, который никогда не изменится

Примером этого является любой проект БД, который сильно нормирован, который использует идентификаторы автоматического увеличения. Stackoverflow.com - хороший пример с автоинкрементными идентификаторами запросов, которые вы видите в каждом URL-адресе. Стоимость изменения идентификатора чрезвычайно высока, так как каждый внешний ключ нуждается в обновлении.

Сколько ссылок или "внешних ключей" (в языке реляционных БД) будет на id?

Любые "внешние ключи" значительно увеличивают стоимость смены идентификатора. Необходимость обновления других документов - медленная операция, и ее следует избегать.

Насколько вероятен ID для изменения?

Если вы не хотите использовать UUID, вы, вероятно, уже имеете представление о том, какой идентификатор вы хотите использовать.

Если это может измениться, стоимость изменения идентификатора должна быть низкой. Если это не так, выберите другой идентификатор.

Какова ваша мотивация к желанию использовать легко запоминающийся идентификатор?

Не говорите о производительности.

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

Будете ли вы делать много объемных вставок?

Если это так, лучше использовать инкрементные UUID для лучшей производительности.

Смотрите post о вставках. Дэмиен Кац комментирует и говорит:

"Если вы хотите иметь самый быстрый возможные времена вставки, вы должны дать _id по возрастанию, поэтому получите UUID и увеличить его на 1, таким образом он всегда вставляет в то же самое место в индексе и быть кешем когда вы имеете дело с файлов больше, чем ОЗУ. Для более простого способ сделать то же самое, просто последовательно указывать документы, но сделайте фиксированную длину с заполнением так, чтобы что они правильно сортируют," 0000001 "вместо" 1", например.

Ответ 2

Исходя из точки зрения реляционной базы данных, мне потребовалось некоторое время, чтобы вычислить couchdb. Но истина противоположна принятому ответу;

Вместо использования uuid по умолчанию создание интеллектуального идентификатора может значительно помочь вам в получении и сортировке данных.

Скажем, у вас есть фильмы с базами данных. Все документы можно найти где-нибудь по URL/фильмам, но где именно?

Если вы храните документ с _id Jabberwocky ({ "_id": "Jabberwocky}} в своей базе данных фильмов, он будет доступен по URL/movies/Jabberwocky. Поэтому, если вы отправляете запрос GET в /movies/Jabberwocky, вы получите обратно JSON, который составляет ваш документ ({ "_id": "Jabberwocky"}).

http://guide.couchdb.org/draft/documents.html

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

https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html

Ответ 3

Я понимаю, что это длинный ответ, но есть еще одно важное соображение для тех, кто обнаруживает проблему. Когда документ удаляется, все, что вы знаете об этом, - это идентификатор. Ввод текста, явный (type:foo) или подразумеваемый (утиная печать) не работает. Поэтому вы не можете подписаться на изменения для doc.deleted===true && doc.type==foo, потому что после удаления, doc.type===undefined. Значение _id, которое вы можете декодировать post-hoc, полезно, особенно если ваш код клиента должен быть в противном случае неактивен (и поэтому не может кэшировать список _id по типу).

Ответ 4

В внутренности CouchDB используется много, и любая дополнительная хеширующая стоимость замедляет кучу внутренних компонентов, поэтому лучше всего придерживаться предоставленного UUID.

Ответ 5

Вы можете пойти с идентификатором CouchDB по умолчанию (UUID), как сказано в документации, основные причины использования UUID по умолчанию следующие:

  • UUID - это случайные числа с такой низкой вероятностью столкновения, что каждый может сделать тысячи UUID минуту в течение миллионов лет, не создавая дубликатов. Это отличный способ обеспечить, чтобы два независимых человека не могли создавать два разных документа с помощью тот же идентификатор.
  • Репликация CouchDB позволяет обмениваться документами с другими, а использование UUID гарантирует, что все это работает.

Теперь, С другой стороны, если вы полагаетесь на сервер (CouchDB), чтобы сгенерировать UUID, и вы в конечном итоге делаете два запроса POST, потому что первый запрос POST разбомблен, вы можете создать два документа и никогда не узнавать о первый, потому что будет возвращен только второй, так что это хорошая идея для создания собственных UUID, чтобы убедиться, что вы никогда не закончите с дублирующимися документами, но я обязательно поеду с UUID, если вам конкретно не требуется иное. documenta.

Ответ 6

Первичный ключ в БД никогда не должен иметь никакого "значения", кроме, может быть, для кодирования последовательности. Возможно, вы захотите изменить SLUG, но не первичный ключ.

Может быть хороший аргумент, чтобы использовать что-то, начиная с отметки времени, чтобы иметь встроенный порядок в ваших ключах. Я часто использую "% f @% s" % (time(), hostname()), чтобы получить упорядоченные уникальные ключи. (Это работает, только если ваша реализация time() никогда не возвращает одно и то же значение дважды.)

Для других вещей (например, изображений), где я хочу избежать дубликатов, я часто использую sha (data) в качестве ключа.