Создание пользовательского идентификатора объекта в MongoDB
Я создаю сервис, для которого я буду использовать MongoDB в качестве хранилища данных. Служба создаст хэш пользовательского ввода и затем увидит, существует ли тот же самый хэш (+ input) в нашем наборе данных.
Хеш будет уникальным, но случайным ( = неинкрементным / последовательным), поэтому мой вопрос:
- Можно ли использовать случайное значение для идентификатора объекта? Пример:
$object_id = new MongoId(HEX-OF-96BIT-HASH);
Или MongoDB будет относиться к Object ID иначе, чем к другим серверным, поскольку "реальный" ObjectID также содержит метки времени, machine_id и т. Д.?
Каковы плюсы и минусы использования "случайного" значения? Я полагаю, что движок будет статистически медленнее обновлять индекс для вставок, когда новые _id никак не увеличиваются - я прав?
4 ответа
Да, совершенно нормально использовать случайное значение для идентификатора объекта, если какое-либо значение присутствует в _id
поле сохраняемого документа, оно обрабатывается как objectId.
поскольку _id
Поле всегда индексируется, а первичным ключом необходимо убедиться, что разные объекты генерируются для каждого объекта. Есть несколько рекомендаций по оптимизации пользовательских идентификаторов объектов:
В то время как любые значения, включая хэши, могут использоваться для _id
поле, я бы рекомендовал не использовать случайные значения по двум причинам:
Возможно, вам потребуется разработать стратегию управления столкновениями в случае, если вы создаете одинаковые случайные значения для двух разных объектов. В этом вопросе вы подразумеваете, что вы будете генерировать идентификаторы, используя некоторый тип алгоритма хеширования. Я не считаю эти значения "случайными", так как они основаны на контенте, который вы перевариваете с помощью хэша. В этом случае вероятность коллизии является функцией разнообразия контента и алгоритма хеширования. Если вы используете что-то вроде MD5 или SHA-1, я не буду беспокоиться об алгоритме, а только о том, что вы хэшируете. Если вам необходимо разработать стратегию управления коллизиями, вам определенно не следует использовать случайные или основанные на хэше идентификаторы, поскольку управление коллизиями в кластерной среде является сложным и требует дополнительных запросов.
Случайные значения, а также хэш-значения специально предназначены для разброса по числовой строке. Это (a) потребует, чтобы больше индекса B-дерева постоянно сохранялось в памяти, и (b) может вызвать переменную производительность вставки из-за перебалансировки B-дерева. MongoDB оптимизирован для обработки идентификаторов объектов, которые располагаются в порядке возрастания (с точностью до секунды). Вы, вероятно, лучше придерживаться их.
Хорошо это или плохо, зависит от его уникальности. Конечно, ObjectId, предоставляемый MongoDB, является уникальным, так что это хорошая вещь. Пока вы можете воспроизвести эту уникальность, все будет в порядке.
При использовании вашего собственного идентификатора нет никаких рисков и потерь производительности. Я предполагаю, что использование его в строковой форме может потребовать больше мощности индекса / хранилища / запросов, но там вы используете его в форме MongoID (ObjectId), которая должна сохранить сильные стороны, не сохраняя ее в простой строке.
Я только что нашел ответ на один из моих вопросов, касающихся эффективности индексации:
Если _id находятся в несколько хорошо определенном порядке, при вставке не нужно загружать все b-дерево для индекса _id. BSON ObjectIds имеют это свойство.
Источник: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs