sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Posibilidad de que se generen Mongo ObjectId duplicados en dos colecciones diferentes?

Respuesta corta

Solo para agregar una respuesta directa a su pregunta inicial:SÍ, si usa la generación de ID de objeto BSON, entonces para la mayoría de los controladores Es casi seguro que los ID serán únicos en todas las colecciones. Vea a continuación lo que significa "casi seguro".

Respuesta larga

Es muy probable que los ID de objeto BSON generados por los controladores Mongo DB sean únicos en todas las colecciones. Esto se debe principalmente a los últimos 3 bytes de la ID, que para la mayoría de los controladores se genera a través de un contador incremental estático. Ese contador es independiente de la colección; es mundial El controlador de Java, por ejemplo, utiliza un AtomicInteger estático inicializado aleatoriamente.

Entonces, ¿por qué, en los documentos de Mongo, dicen que es "muy probable" que las identificaciones sean únicas, en lugar de decir directamente que SERÁN únicas? Pueden ocurrir tres posibilidades en las que no obtendrá una identificación única (infórmeme si hay más):

Antes de esta discusión, recuerde que el ID de objeto BSON consta de:

[4 bytes segundos desde época, 3 bytes hash de máquina, 2 bytes ID de proceso, 3 bytes contador]

Estas son las tres posibilidades, para que juzgues por ti mismo qué tan probable es que te engañen:

1) Desbordamiento del contador:hay 3 bytes en el contador. Si inserta más de 16 777 216 (2 ^ 24) documentos en un solo segundo, en la misma máquina, en el mismo proceso, entonces puede desbordar los bytes del contador incremental y terminar con dos ID de objeto que comparten el mismo tiempo, máquina , proceso y valores de contador.

2) Contador no incremental:algunos controladores de Mongo usan números aleatorios en lugar de números incrementales para los bytes del contador. En estos casos, existe una probabilidad de 1/16 777 216 de generar una identificación no única, pero solo si esas dos identificaciones se generan en el mismo segundo (es decir, antes de que la sección de tiempo de la identificación se actualice al segundo siguiente), en el mismo máquina, en el mismo proceso.

3) Mecanizar y procesar hash con los mismos valores. Los valores de ID de máquina e ID de proceso pueden, en algún escenario muy poco probable, asignarse a los mismos valores para dos máquinas diferentes. Si esto ocurre, y al mismo tiempo los dos contadores en las dos máquinas diferentes, durante el mismo segundo, generan el mismo valor, terminará con una ID duplicada.

Estos son los tres escenarios a tener en cuenta. Los escenarios 1 y 3 parecen muy poco probables, y el escenario 2 es totalmente evitable si utiliza el controlador adecuado. Tendrá que verificar la fuente del controlador para estar seguro.