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

guardar dirección IP en mongoDB

Definitivamente, guarde las direcciones IP como números, si no le importa el trabajo adicional que requiere, especialmente si necesita hacer consultas sobre las direcciones y tiene tablas/colecciones grandes.

He aquí por qué:

Almacenamiento

  • Una dirección IPv4 tiene 4 bytes si se almacena como un número entero sin firmar.
  • Una dirección IPv4 varía entre 10 bytes y 18 bytes cuando se escribe como una cadena en forma de octava y puntos. (Supongamos que el promedio es de 14 bytes).

Eso es 7-15 bytes para los caracteres, más 2-3 bytes si está utilizando un tipo de cadena de longitud variable, que varía según la base de datos que esté utilizando. Si tiene una representación de cadena de longitud fija disponible, debe usar un campo de ancho fijo de 15 caracteres.

El almacenamiento en disco es económico, por lo que no es un factor en la mayoría de los casos de uso. Sin embargo, la memoria no es tan barata, y si tiene una tabla/colección grande y desea realizar consultas rápidas, entonces necesita un índice. La penalización de almacenamiento de 2-3x de la codificación de cadenas reduce drásticamente la cantidad de registros que puede indexar mientras mantiene el índice residente en la memoria.

  • Una dirección IPv6 tiene 16 bytes si se almacena como un número entero sin signo. (Probablemente como múltiples enteros de 4 u 8 bytes, dependiendo de su plataforma).
  • Una dirección IPv6 varía de 6 bytes a 42 bytes cuando se codifica como una cadena en notación hexadecimal abreviada.

En el extremo inferior, una dirección de bucle invertido (::1) tiene 3 bytes más la sobrecarga de la cadena de longitud variable. En el extremo superior, una dirección como 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2 utiliza 39 bytes más la sobrecarga de cadena de longitud variable.

A diferencia de IPv4, no es seguro asumir que la longitud de cadena promedio de IPv6 será una media de 6 y 42, porque la cantidad de direcciones con una cantidad significativa de ceros consecutivos es una fracción muy pequeña del espacio total de direcciones de IPv6. Solo algunas direcciones especiales, como direcciones loopback y autoconf, probablemente se puedan comprimir de esta manera.

Nuevamente, esta es una penalización de almacenamiento de>2x para la codificación de cadenas frente a la codificación de enteros.

Matemáticas en red

¿Crees que los enrutadores almacenan direcciones IP como cadenas? Por supuesto que no.

Si necesita hacer cálculos de red en direcciones IP, la representación de cadenas es una molestia. P.ej. si desea escribir una consulta que busque todas las direcciones en una subred específica ("devolver todos los registros con una dirección IP en 10.7.200.104/27", puede hacerlo fácilmente enmascarando una dirección entera con una máscara de subred entera. ( Mongo no es compatible con esta consulta en particular, pero la mayoría de los RDBMS sí lo son). para una dirección IPv4 se puede hacer en unos pocos ciclos de CPU usando 2 registros. Convertir una cadena en un número entero requiere recorrer la cadena.)

De manera similar, las consultas de rango ("devolver todos los registros, todos los registros entre 192.168.1.50 y 192.168.50.100") con direcciones enteras podrán usar índices, mientras que las consultas de rango en direcciones de cadena no lo harán.

El resultado final

Requiere un poco más de trabajo, pero no mucho (hay un millón de funciones aton() y ntoa() por ahí), pero si está construyendo algo serio y sólido y quiere prepararlo para el futuro contra requisitos futuros y la posibilidad de un gran conjunto de datos, debe almacenar las direcciones IP como números enteros, no como cadenas.

Si está haciendo algo rápido y sucio y no le importa la posibilidad de remodelarlo en el futuro, entonces use cuerdas.

Para el propósito del OP, si está optimizando la velocidad y el espacio y no cree que quiera consultarlo con frecuencia, ¿por qué usar una base de datos? Simplemente imprima direcciones IP en un archivo. Eso sería más rápido y eficiente en almacenamiento que almacenarlo en una base de datos (con API asociada y sobrecarga de almacenamiento).