Как говорит Доминик Барнс, целые числа с автоматическим приращением не масштабируются, не подходят для распределения или облака. Кажется, что каждое приложение в настоящее время нуждается в мобильной версии с автономной поддержкой, которая напрямую не совместима с целыми числами с автоматическим приращением. Мы все это знаем, но это правда: целые числа с автоматическим приращением необходимы для устаревшего кода и, возможно, для других вещей.
В обоих сценариях вы несете ответственность за создание автоматически увеличивающегося целого числа. Представление выполняется emit(the_numeric_id, null)
. (У вас также может быть пространство имен "тип", например, emit([doc.type, the_numeric_id], null)
. Запрос последней строки (например, с startkey=MAXINT&descending=true&limit=1
, увеличьте возвращаемое значение на единицу, и это будет ваш следующий идентификатор. Попытка сохранения находится в цикле, который может повторить попытку, если произошло столкновение.
Вы также можете подшутить, если вам не нужна 100% плотность списка идентификаторов. Например, вы можете добавить отметки времени к emit()
строкам, оценить скорость создания документа и увеличить на эту скорость, умноженную на время вычислений и передачи. Вы также можете просто увеличить на случайное целое число от 1 до N, поэтому большую часть времени первая вставка работает за счет неоднородных идентификационных номеров.
Что касается того, где хранить целое число, я думаю, что есть стратегия id и стратегия попробуйте и проверьте.
Стратегия id проще и быстрее в краткосрочной перспективе. Идентификаторы документов являются целыми числами (возможно, с префиксом типа для добавления пространства имен). Поскольку Couch гарантирует уникальность поля _id
, вы просто беспокоитесь об автоинкременте. Сделайте это в цикле: 409 Conflict
запускает повторную попытку, 201 Accepted
означает, что все готово.
Я думаю, что основная проблема этого трюка заключается в том, что если и когда возникают конфликты, у вас есть два совершенно не связанных друг с другом документа, и один из них необходимо скопировать в новый документ. . Если были связи с другими документами, все они должны быть исправлены. (На ум приходит трюк с CouchDB 0.11 emit(key, {_id: some_foreign_doc_id})
.)
В стратегии попробуйте и проверьте в качестве doc._id
используется UUID по умолчанию, поэтому каждая вставка будет успешной. В идеале все или большая часть ваших междокументных отношений основана на неизменяемом UUID _id
, а не на целом числе. Это просто используется для пользователей и пользовательского интерфейса. Автоматически увеличивающееся целое число - это просто поле в документе {"int_id":20}
. Вид конечно же emit(doc.int_id, null)
. (Вы можете искать документ по целочисленному идентификатору с параметром ?key=23?include_docs=true
представления.
Конечно, после репликации у вас могут возникнуть конфликты идентификаторов (не официальные конфликты CouchDB, а просто документы с одним и тем же числовым идентификатором). Представление, которое генерируется по идентификатору, также будет иметь фазу сокращения: достаточно просто _count
. Затем вы должны патрулировать БД, запрашивая это представление с помощью ?group=true
и ища любую строку (соответствующую целочисленному идентификатору), которая имеет счетчик> 1. С другой стороны, исправление числового идентификатора документа является незначительным изменением, потому что оно действительно не требовать создания нового документа.
Это мои идеи. Теперь, когда я их записал, я чувствую, что вы должны поддерживать отношения независимо от того, где хранится идентификатор; так что, возможно, использование _id
все-таки лучше. Единственный другой недостаток, который я вижу, - это то, что вы постоянно состоите в браке с принципиально нарушенной моделью именования для некоторого определения «навсегда».
person
JasonSmith
schedule
22.02.2011