MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Possibilité de génération de Mongo ObjectId en double dans deux collections différentes ?

Réponse courte

Juste pour ajouter une réponse directe à votre question initiale :OUI, si vous utilisez la génération d'ID d'objet BSON, alors pour la plupart des pilotes les identifiants seront presque certainement uniques dans toutes les collections. Voir ci-dessous ce que signifie "presque certainement".

Réponse longue

Les ID d'objet BSON générés par les pilotes Mongo DB sont très susceptibles d'être uniques dans toutes les collections. Cela est principalement dû aux 3 derniers octets de l'ID, qui pour la plupart des pilotes est généré via un compteur incrémentiel statique. Ce compteur est indépendant de la collection; c'est mondial. Le pilote Java, par exemple, utilise un AtomicInteger statique initialisé de manière aléatoire.

Alors pourquoi, dans les documents Mongo, disent-ils que les identifiants sont "très susceptibles" d'être uniques, au lieu de dire carrément qu'ils SERONT uniques ? Trois possibilités peuvent se présenter où vous n'obtiendrez pas d'identifiant unique (veuillez m'en informer s'il y en a d'autres) :

Avant cette discussion, rappelez-vous que l'ID d'objet BSON se compose de :

[4 octets de secondes depuis l'époque, 3 octets de hachage machine, 2 octets d'ID de processus, 3 octets de compteur]

Voici les trois possibilités, afin que vous jugez par vous-même de la probabilité d'être dupe :

1) Débordement du compteur :il y a 3 octets dans le compteur. S'il vous arrive d'insérer plus de 16 777 216 (2 ^ 24) documents en une seule seconde, sur la même machine, dans le même processus, vous risquez de déborder les octets du compteur d'incrémentation et de vous retrouver avec deux ID d'objet qui partagent le même temps, la machine , processus et valeurs de compteur.

2) Compteur non incrémenté :certains pilotes Mongo utilisent des nombres aléatoires au lieu d'incrémenter des nombres pour les octets du compteur. Dans ces cas, il y a 1 chance sur 16 777 216 de générer un identifiant non unique, mais uniquement si ces deux identifiants sont générés dans la même seconde (c'est-à-dire avant que la section horaire de l'identifiant ne soit mise à jour à la seconde suivante), à ​​la même machine, dans le même processus.

3) Machine et traite le hachage aux mêmes valeurs. Les valeurs d'ID de machine et d'ID de processus peuvent, dans certains scénarios hautement improbables, correspondre aux mêmes valeurs pour deux machines différentes. Si cela se produit, et qu'en même temps les deux compteurs sur les deux machines différentes, pendant la même seconde, génèrent la même valeur, alors vous vous retrouverez avec un identifiant en double.

Ce sont les trois scénarios à surveiller. Les scénarios 1 et 3 semblent hautement improbables, et le scénario 2 est totalement évitable si vous utilisez le bon pilote. Vous devrez vérifier la source du pilote pour en être sûr.