Mongodb - _id должен быть глобально уникальным при шардинге

Я хочу сегментировать коллекцию по их «внешнему ключу» (идентификатору пользователя), а не по полю идентификатора. Мне нужно только, чтобы комбинация идентификатора пользователя и идентификатора была уникальной. Но я не уверен, что это нормально с mongodb.

Предупреждение В любой сегментированной коллекции, в которой вы не сегментируете по полю _id, вы должны обеспечить уникальность поля _id. Лучший способ гарантировать, что _id всегда уникален, - это использовать ObjectId или другой универсальный уникальный идентификатор (UUID).

Это взято из: http://docs.mongodb.org/manual/tutorial/enforce-unique-keys-for-sharded-collections/#enforce-unique-keys-for-sharded-collections

Должен ли я гарантировать уникальность _id? Или это достаточно хорошо, если я всегда запрашиваю как по идентификатору пользователя, так и по _id?


person Ben    schedule 11.11.2012    source источник


Ответы (1)


Если вы не замените их вручную, автоматически сгенерированные _id являются UUID, которые, согласно документация состоит из" 4-байтовой отметки времени (секунды с начала эпохи), 3-байтового идентификатора машины, 2-байтового идентификатора процесса и 3-байтового счетчика ".

Как видите, уникальный идентификатор машины является частью UUID. Это гарантирует, что никакие две машины в шарде никогда не будут создавать одинаковый UUID независимо (если у них нет одного и того же идентификатора машины - вероятность этого составляет 1: 16777215, и когда это произойдет, это можно легко проверить). Единственная ситуация, когда теоретически может быть дублированный UUID, - это когда один процесс создает более 2 ^ 24 (более 16 миллионов) UUID за одну секунду.

tl; dr: Вам не нужно беспокоиться о повторяющихся UUID - они, как сказано в документации, «разработаны так, чтобы иметь достаточно высокую вероятность быть уникальными при выделении».

person Philipp    schedule 11.11.2012