¿Cuál es su opinión sobre el uso de los Uuid como base de datos de identificadores de fila, particularmente en aplicaciones web?

StackOverflow https://stackoverflow.com/questions/5949

  •  08-06-2019
  •  | 
  •  

Pregunta

Siempre he preferido el uso de enteros largos como claves primarias en las bases de datos, por simplicidad y (se supone) de la velocidad.Pero cuando se utiliza un RESTO o Rieles-como esquema de URL para las instancias de objeto, me gustaría terminar con una Url como esta:

http://example.com/user/783

Y, a continuación, la suposición es que también hay usuarios con Id de 782, 781, ..., 2, y 1.Suponiendo que la aplicación web en cuestión es lo suficientemente seguro como para evitar que las personas que entren otros números a la vista de otros usuarios sin autorización, una simple forma secuencial asignado por el sustituto clave también "fugas" el número total de casos (mayor que este otro), en este caso los usuarios, lo que podría ser información privilegiada.(Por ejemplo, yo soy usuario de #726 en stackoverflow.)

Sería un UUID/GUID ser una mejor solución?Entonces yo podría configurar las direcciones Url como esta:

http://example.com/user/035a46e0-6550-11dd-ad8b-0800200c9a66

No exactamente sucinta, pero hay menos implícita la información acerca de los usuarios en la pantalla.Seguro, huele a "seguridad por oscuridad", que no es un sustituto para la correcta seguridad, pero parece que, al menos, un poco más seguro.

Es que el beneficio vale la pena el costo y la complejidad de la implementación de los Uuid para web-direccionable instancias de objeto?Creo que todavía desea utilizar las columnas de enteros como de la base de datos de PKs para acelerar une.

También está la cuestión de en la base de datos representación de los Uuid.Sé MySQL almacena como 36 cadenas de caracteres.Postgres parece tener una más eficiente representación interna (128 bits?) pero no he probado a mí mismo.Alguien tiene alguna experiencia con esto?


Actualización:para aquellos que le preguntó acerca de simplemente utilizando el nombre de usuario en la URL (por ejemplo, http://example.com/user/yukondude), que funciona bien para las instancias de objetos con nombres que son únicas, pero, ¿qué acerca de los millones y millones de la aplicación web de objetos que sólo puede ser identificado por el número?Pedidos, transacciones, facturas, duplicar nombres de imagen, stackoverflow preguntas, ...

¿Fue útil?

Solución

No puedo decir acerca de la web, de su pregunta.Pero uuid son ideales para aplicaciones de n niveles.PK generación puede ser descentralizado:cada cliente genera su propia pk sin riesgo de colisión.Y la diferencia de velocidad es generalmente pequeño.

Asegúrese de que su base de datos admite un almacenamiento eficiente de tipo de datos (16 bytes, de 128 bits).A menos que usted puede codificar el uuid de la cadena en base64 y uso char(22).

He utilizado ampliamente con Firebird y lo recomiendo.

Otros consejos

Para lo que vale, la he visto una larga ejecución del procedimiento almacenado (9+ segundos) se reduce a unos pocos cientos de milisegundos de tiempo de ejecución, simplemente por cambiar de GUID las claves principales para los números enteros.Eso no quiere decir mostrar un GUID es una mala idea, pero como otros han señalado, de unirse a ellos, y la indexación de los mismos, por definición, no va a ser ni de lejos tan rápido como con números enteros.

Puedo responder que en SQL server si utiliza un uniqueidentifier (GUID) tipo de datos y el uso de la función NEWID() para crear valores obtendrá horrible fragmentación debido a la división de la página.La razón es que cuando se utiliza la función NEWID() el valor generado no es secuencial.SQL 2005 agregó el NEWSEQUANTIAL() función para remedio que

Una manera de seguir el uso GUID e int es tener un guid y un int en una tabla, de forma que el guid se asigna a la int.el guid se utiliza externamente, pero la int internamente en la base de datos

por ejemplo

457180FB-C2EA-48DF-8BEF-458573DA1C10    1
9A70FF3C-B7DA-4593-93AE-4A8945943C8A    2

1 y 2 serán utilizados en las combinaciones y el guid en la aplicación web.Esta tabla va a ser bastante estrechas y debe ser bastante rápido para consulta

Por qué pareja de la clave principal con su URI?

¿Por qué no tener su URI clave de ser legible para los humanos (o imposible de adivinar, dependiendo de sus necesidades), y su índice principal entero de base, de esa manera usted obtiene lo mejor de ambos mundos.Un montón de blog de software hace que, donde expuesto el id de la entrada es identificado por un 'slug', y el id numérico está escondido en el interior del sistema.

El beneficio adicional es que usted ahora tiene un muy agradable de la estructura de la URL, lo cual es bueno para el SEO.Obviamente para una transacción esta no es una buena cosa, pero para algo como stackoverflow, es importante (véase la URL en la parte superior...).Conseguir que la singularidad no es tan difícil.Si estás realmente interesado, tienda de un hash de la babosa dentro de una tabla en algún lugar, y hacer una búsqueda antes de la inserción.

editar: Stackoverflow no acaba de utilizar el sistema de describir, ver el Chico del comentario de abajo.

En lugar de Url como esta:

http://example.com/user/783

¿Por qué no tener:

http://example.com/user/yukondude

Que es más amigable con las personas y no de fugas de esa pequeña cantidad de información?

Usted podría utilizar un número entero que está relacionado con el número de fila, pero no es secuencial.Por ejemplo, usted podría tomar los 32 bits de la secuencia de ID y reorganizar con un esquema fijo (por ejemplo, el bit 1 se convierte en el bit 6 bit 2 se convierte en el bit 15, etc..).
Este será bidireccional de cifrado, y usted estará seguro de que dos diferentes Identificadores siempre tendrá diferentes cifrados.
Obviamente, sería fácil de decodificar, si uno se toma el tiempo para generar suficiente Identificadores y obtener el esquema, pero, si he entendido bien tu problema, solo quiero que no dan información muy fácilmente.

Utilizamos Guid como claves principales para todas nuestras tablas ya que se dobla como el RowGUID para MS SQL Server Replicación.Hace que sea muy fácil cuando el cliente de repente se abre una oficina en otra parte del mundo...

No creo que un GUID te da muchos beneficios.Los usuarios odian mucho, incomprensible Url.

Crear un corto de IDENTIFICACIÓN que usted puede asignar a la dirección URL, o hacer valer un nombre de usuario único (convención dehttp://example.com/user/brianly).Los chicos de 37Signals probablemente se burlen de preocuparse por algo como esto cuando se trata de una aplicación web.

Por cierto puede forzar a su base de datos para iniciar la creación de Identificadores de enteros a partir de una base de valor.

También depende de lo que usted se preocupa acerca de su aplicación.Por la n-tier aplicaciones Guid/Uuid son más sencillos de implementar y son más fáciles de puerto entre diferentes bases de datos.Para producir Entero claves de algunos de soporte de base de datos a un objeto de secuencia de forma nativa y algunos requieren de encargo de la construcción de una secuencia de la tabla.

Claves de enteros probablemente (no tengo los números) proporcionan una ventaja para la consulta y el rendimiento de la indexación, así como el uso del espacio.Directo DB consultar también es mucho más fácil usando las teclas numéricas, menos de copiar/pegar, ya que son más fáciles de recordar.

Yo trabajo con un sistema de manejo de estudiantes que usa el UUID en la forma de un entero.Tienen una tabla que contenga la siguiente IDENTIFICADOR único.

Aunque esto es probablemente una buena idea para un punto de vista arquitectónico, hace que el trabajar con sobre una base diaria difícil.A veces es necesario hacer inserciones masivas y tener un UUID hace muy difícil, y normalmente requiere la escritura de un cursor en lugar de una simple instrucción SELECT INTO.

He intentado tanto en real de aplicaciones web.

Mi opinión es que es preferible utilizar los números enteros y han breve url.

Como desarrollador, se siente un poco horrible ver secuencial de los números enteros y sabiendo que la información sobre el total de número de registro se está filtrando, pero la verdad es la mayoría de la gente probablemente no le importa, y que la información nunca ha sido realmente crítico para mis negocios.

Tras largos feo UUID url me parece mucho más de una vuelta a la normalidad de los usuarios.

Creo que este es uno de esos temas que causa cuasi-religiosa de los debates, y de su casi inútil hablar.Sólo quiero decir que el uso de lo que usted prefiere.En el 99% de los sistemas que no importa qué tipo de clave que utilice, por lo que los beneficios (que se indica en los otros posts) de la utilización de un tipo sobre el otro nunca será un problema.

Creo que el uso de un GUID sería la mejor opción en su situación.Ocupa más espacio, pero es más seguro.

Youtube utiliza 11 caracteres con codificación base64, que ofrece 11^64 posibilidades, y son normalmente bastante manejable para escribir.Me pregunto si los que ofrecen un mejor rendimiento que un lleno en el UUID.UUID convertido a base 64 sería el doble del tamaño que yo creo.

Más información se puede encontrar aquí: https://www.youtube.com/watch?v=gocwRvLhDf8

Siempre que utilice una base de datos con sistema eficiente de almacenamiento, el disco duro es barato en estos días de todos modos...

Sé GUID puede ser una b*tch de trabajar con algunos de veces y vienen con algunas consultas de sobrecarga sin embargo, desde una perspectiva de seguridad son un salvador.

Pensando en la seguridad por oscuridad se ajuste bien al formar oscuro URI y la construcción normalizada DB con Tabla, Registro de Columna y de seguridad definidos usted no puede ir mal con el GUID, trata de hacerlo con el entero basado en id.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top