SQL desarrollo web MySQL

SQL: ¿Por qué evitar el incremento automático?

Identificación de las entidades

Uno de estos problemas está directamente relacionado con la identificación (ID) de las entidades.

La clave primaria

Una base de datos relacional “es una colección de items de datos” con relaciones predefinidas entre ellos. Es, por tanto, un grafo en que los nodos se llaman entidades y las aristas son las relaciones. Para expresar una relación entre entidades necesitamos referir a una entidad de forma única, y es para ello que sirve la clave primaria.

Número de serie

Algunos proyectos — seguro que todos los tuyos — utilizan el número de serie para tener claves primarias estables, ya que los número de series son claves técnicas y no están relacionados con los contenidos de su entidad.

  • Divulgación de la información. El valor actual corresponde al último valor usado como clave primaria y, si no hay eliminaciones, corresponde también al número de líneas en la tabla. Normalmente este valor de la clave primaria es el que se utiliza en URLs, y cualquier usuario tiene acceso a ella. Si alguien quiere saber, por ejemplo, cuántos usuarios tienes en tu base de datos de tu SaaS, lo único que tiene que hacer es crear una cuenta y mirar la URL. Los resultados pueden ser catastróficos a nivel de seguridad.
  • Enumeraciones de entidades. Otro problema, relacionado con el anterior, es que es muy fácil enumerar las entidades en una tabla, ya que empiezas con el valor 1 y vas incrementando el valor. Así es muy fácil “rascar” datos de todas tus entidades, ya que cualquier spammer que descubra que no controlas correctamente el acceso al contenido puede acceder a esta información, también mediante una URL, de cualquier entidad.
  • No unicidad entre tablas. Cada tabla tiene su propia secuencia y cada valor idéntico (p.e.1) se puede encontrar como clave primaria de entidades diferentes. Si te equivocas eliminando una línea de otra entidad cualquiera en tu base de datos, tendrás problemas. Estos problemas son aún mayores si tienes configuradas reglas ON DELETE CASCADE.

¿Cuál es la solución?

Creo que en el mundo IT todos los problemas tienen solución. Podrías hacer algún workaround, como por ejemplo empezar la secuencia en un punto arbitrario, o que el valor de incremento sea mayor que uno, o incluso compartir la secuencia entre las tablas. Lo que pasa es que seguirás divulgando información sobre el crecimiento de la base de datos y alcanzarás rápidamente el desbordamiento de enteros.

¿Por qué los UUIDs pueden ser una buena alternativa?

Los UUIDs, por ejemplo los UUIDv4, se basan en la aleatoriedad. Esto significa que no puedes garantizar la unicidad, pero la probabilidad de colisión es muy pequeña.

  • No puedes enumerar valores
  • No puedes saber cuántos valores hay actualmente en cada tabla
  • No tienes que comunicar con la base de datos para construir un valor

¿Cómo generar UUIDs de forma fácil?

Recuerda que en sistemas como MySQL o PostgreSQL tienes disponibles tipos de columna uuid que te permiten generar uuids de forma fácil. Si por casualidad el motor que utilizas para tus bases de datos no lo permite hacer de forma nativa para valores de UUIDv4, puedes usar extensiones para lograrlo. También puedes generar UUIDs en tu lenguaje o framework de programación preferido, utilizando Java, Scala, Node.js, Python, o PHP.

PHP 8. ¿Qué hay de nuevo?

Artículo anterior

CSS: El estado en 2020

Siguiente artículo
I help Organizations to use Technology to improve people's lives

También te puede interesar

Fluidez en movimiento: dominando el cálculo para animaciones web suaves

Matrices mágicas: transformando la web con Álgebra Lineal y CSS

Coordenadas y Curvas: Domina la Geometría Analítica en el Diseño Web

¿Qué efectos secundarios tiene NPM para la Web?