6

Me preguntaba cuáles eran las mejores prácticas para crear y almacenar ID. Hace unos años, un profesor me habló de los peligros de un sistema de identificación mal construido, utilizando como ejemplo el número de la Seguridad Social. En particular, debido a que los SSN no tienen ninguna detección de error ... es imposible distinguir la diferencia entre una cadena de 9 dígitos y una SSN válida. Y ahora las agencias gubernamentales necesitan cosas como Apellido + SSN o Cumpleaños + SSN para realizar un seguimiento de sus datos y garantizar su verificación. Además, su número de seguro social es un tanto predecible según el lugar donde nació.Mejores prácticas de identificación para bases de datos

Ahora estoy construyendo una base de datos de usuario ... y en base a este consejo "userid mediumint auto_increment" sería inaceptable. Especialmente si planeo usar este ID como la identificación primaria para el usuario. (por ejemplo, si permito a los usuarios cambiar su nombre de usuario, entonces sería más difícil hacer un seguimiento del nombre de usuario que el ID de usuario numérico ... que requiere claves en cascada y demás). Los correos electrónicos cambian, los nombres de usuario pueden cambiar, las contraseñas cambian. .pero un usuario debe permanecer constante para siempre.

Claramente, auto_increment está diseñado solo para surrogate_keys. Es decir, es un acceso directo útil solo cuando ya tiene un mecanismo de identificación principal, pero no debe usarse como un "identificador innato" para los datos. Crear UUID aleatorio parece interesante, pero la aleatoriedad me apaga.

Y entonces pregunto: ¿cuáles son las mejores prácticas para crear un número de identificación de "clave principal"?

+3

¿Qué hay de los consejos de su profesor que le llevaron a la conclusión de que los números enteros de auto incremento no eran apropiados como identificadores únicos para los datos del usuario? – jwiscarson

+0

Los enteros de incremento automático son predecibles y no contienen ninguna forma de detección de errores. Por lo menos, esperaría que una práctica de ID de "grado profesional" fuera algo impredecible y autoidentificable. Por ejemplo, los números de la tarjeta de crédito tienen un dígito de suma de comprobación, lo que significa que si un ser humano ingresa incorrectamente una tarjeta de crédito, solo hay una probabilidad de 1/10 de que sea aceptada. También son razonablemente impredecibles, por lo que un hacker no puede simplemente ingresar números de tarjetas de crédito al azar en Amazon y esperar que incluso tenga un número de tarjeta de crédito válido. Del mismo modo, un pirata informático no debe criticar ataques de diccionario en UID predecibles. – Dragontamer5788

+2

No entiendo su comparación aquí. Me sorprendería si las compañías de tarjetas de crédito usaran números reales de tarjetas de crédito como ID de bases de datos, en lugar de almacenarlos como un atributo fuertemente asegurado en una tabla. Su comentario implica que el conocimiento de una ID sería una especie de puerta trasera en la base de datos. La autenticación de algún tipo debe ser la defensa contra el acceso no autorizado a los datos, no el conocimiento de los valores aleatorios de la base de datos. – jwiscarson

Respuesta

7

Está confundiendo la funcionalidad de la base de datos interna con los criterios de búsqueda externos.

Las claves sustitutas de incremento automático son útiles para el uso interno de la aplicación. Nunca le pase eso al usuario. La identificación de los objetos comerciales, ya sea un usuario o una factura, se realiza con información única sobre el objeto, como SSN, CCN o DOB. Use tanta información como sea necesario para identificar de manera única el objeto.

Recomiendo encarecidamente que si debe proporcionar algún valor de ID recientemente inventado a cada cliente, NO sea el campo en el que vincule todas las tablas de datos del cliente.

+0

Esta respuesta tiene más sentido para mí. Gracias. – Dragontamer5788

3

La mejor práctica es usar un número entero de incremento automático. No hay una razón real por la que no deba usarse como un "identificador innato". Proporcionará el uso más compacto en claves externas y búsquedas más rápidas. Casi cualquier otro valor puede cambiar y es inapropiado para usarlo como clave.

+0

¿este valor llegaría a ser grande para almacenarlo para muchos usuarios? – Mike

+0

@mike, use un código int de 64 bits y nunca se quedará sin valores cuando rastree a los usuarios. 9,223,372,036,854,775,807 valores posibles, o el doble que si usa un int sin firmar 64. –

+0

Tiene razón parcialmente. Pero debemos tener en cuenta que si no exponemos la identificación al usuario, es decir, para buscar, no aprovecharemos los índices agrupados. – kerzek

1

La comparación de SSN con enteros autoincrementados es de manzanas y naranjas. Personalmente, evito los GUID/UUID/UID a menos que haya tantos registros en la tabla que resulte ineficaz o irracional usar un número entero.

Es muy raro que encuentre una verdadera clave natural. Lo que parece único hoy puede cambiar mañana en función de los requisitos/leyes comerciales.

0

Esto es lo que las secuencias fueron diseñadas para resolver. Cree un objeto que pueda aumentarse atómicamente por inserción. En algunos DBs, el número se incrementa automáticamente y en otros es un objeto de secuencia, pero la idea es la misma, es decir, crea una clave que no puede entrar en conflicto y es única.

También los UUID como ID están bien y lo he usado anteriormente por razones especiales. ¿Por qué la aleatoriedad te "apaga"? Prácticamente no hay posibilidad de un conflicto.

0

Al final del día, la manera de verificar si un identificador de usuario dado es válido es el sistema mismo. Es decir, su sistema es la fuente autorizada para esos identificadores. ¿Es 555-45-9999 un SSN válido? La única forma de saberlo con certeza es que el Seguro Social lo busque y lo relacione con el nombre de la persona que dice tener ese número. Claro, podemos usar el esquema de identificador de SSN para plantear una suposición preliminar sobre si es válido. Sin embargo, solo una búsqueda en su sistema nos dirá con seguridad. La necesidad de dígitos de verificación surgiría en sistemas altamente distribuidos donde, por ejemplo, es posible que desee permitir que otras personas generen números respetados por su sistema (por ejemplo, empresas de envío que permiten a los clientes generar sus propios números de seguimiento). Dado que es su sistema el que generará los identificadores de manera automatizada, lo mejor que puede hacer un dígito de control es ayudar, de manera rudimentaria, con la validación de la entrada o búsqueda de datos.

1

Según nuestra conversación anterior en los comentarios, estoy publicando esto como una respuesta.Parece como si creyera que tener una ID aleatoria y única asignada a sus usuarios les proporcionaría la seguridad suficiente como para que pudieran renunciar a los métodos normales de autenticación.

En cualquier caso, estoy confundido por sus comparaciones entre datos seguros y autoincrementando, columnas de ID basadas en enteros en tablas de usuario. Estos dos tipos de datos nunca deben mezclarse. Su compañía de tarjeta de crédito no debe usar un CCN como clave principal en una tabla de base de datos, y el gobierno tampoco debe usar su nombre o SSN como clave principal en sus tablas de base de datos.

¿Por qué debería usted (o cualquiera) autenticar usuarios con solo conocimiento de algunos datos seguros? Las corporaciones ya no pueden autenticar a los usuarios según sus SSN, y sé que mi compañía de tarjetas de crédito no me identifica en función de mi CCN (especialmente porque tengo más de uno, y los números de tarjetas en las cuentas han cambiado varias veces).)

Incluso si implementó un UUID y generó un número aleatorio arbitrario, sigue siendo eso: un número . La autenticación de Active Directory usa GUID para sus ID, pero también requiere que los usuarios proporcionen nombres de usuario y contraseñas. Usar un tipo de datos más grande o más pequeño como columna de ID no significa que pueda lavarme las manos con otro tipo de autenticación o seguridad.

+0

Estaba a punto de expandir mi publicación a este efecto. Un número, cualquier número, por sí solo, nunca es suficiente para determinar la validez y la autenticidad de la persona con la que está asociado. – Thomas

Cuestiones relacionadas