He trabajado en una serie de sistemas de base de datos en el pasado donde mover las entradas de datos entre bases de datos habría sido mucho más fácil si todas las claves de base de datos había sido GUID /UUID valores. He pensado en ir a esta ruta un par de veces, pero siempre hay un poco de incertidumbre, especialmente alrededor de desempeño y de la onu-lectura-sobre-el-teléfono-capaz de direcciones Url.

Alguien ha trabajado extensamente con el Guid en una base de datos? ¿Qué ventajas puedo obtener por ir de esa manera, y cuáles son las probabilidades de trampas?

8 Comentarios

  1. 221

    Ventajas:

    • Puede generar sin conexión.
    • Hace que la replicación trivial (como opuesto a int, lo que hace que sea MUY difícil)
    • ORM generalmente como ellos
    • Único a través de las aplicaciones. Por lo que podemos utilizar el PK es de nuestro CMS (guid) en nuestra aplicación (también guid) y saber que NUNCA lo vamos a conseguir un choque.

    Desventajas:

    • Mayor uso del espacio, pero el espacio es barato(er)
    • No puede ordenar por ID para conseguir la inserción de la orden.
    • Puede parecer feo en una dirección URL, pero en realidad, el PP está haciendo poner un REAL DB clave en una dirección URL!? (Este punto en disputa en los comentarios de abajo)
    • Más difícil manual de depuración, pero no es difícil.

    Personalmente, yo los uso para la mayoría de PK en cualquier sistema de un tamaño decente, pero tengo «entrenados» en un sistema que fue replicado por todo el lugar, así que TUVIMOS que contar con ellos. YMMV.

    Creo que los datos duplicados cosa es la basura – usted puede obtener un duplicado de los datos sin embargo lo hace. Las claves suplentes son generalmente mal visto, donde nunca he estado trabajando. HACEMOS uso de WordPress como sistema de aunque:

    • IDENTIFICADOR único de la fila (GUID/lo que sea). Nunca visible para el usuario.
    • pública ID se genera una VEZ que a partir de trabajo de campo (por ejemplo, el título que hacer el-titulo-de-la-artículo)

    ACTUALIZACIÓN:
    Para que este obtiene +1 ed mucho, y pensé que debía señalar un gran inconveniente de GUID PK es: los Índices Agrupados.

    Si usted tiene una gran cantidad de registros, y un índice agrupado en un GUID, su insertar el rendimiento va a CHUPAR, a medida que se inserta en lugares al azar en la lista de elementos (ese es el punto), no en el final (que es más rápido),

    Así que si usted necesita insertar el rendimiento, tal vez de usar un auto-inc INT, y generar un GUID si quieres compartir con otra persona (es decir, mostrar a un usuario en una dirección URL)

    • [WTF estás haciendo poner un REAL DB clave en una dirección URL!?] No sé por qué eso le molesta. ¿Qué más se puede utilizar? Mira Desbordamiento de Pila… tiene valores de IDENTIDAD en la URL por todo el lugar, y funciona muy bien. El uso de DB claves en la Url no impide aplicación de la seguridad.
    • No, no, pero las cosas como SEO son generalmente mejores, si no hay una clave, especialmente algo tan largo como un GUID. Por supuesto, puede ser solucionado fácilmente, así que pa que fue un poco de un más de un plumazo
    • Buena respuesta, sería bueno si usted añada también información sobre el desempeño de las desventajas del uso de Guid; por ejemplo, unirse, clasificación, indización y por ellos todo será más lento que usando números enteros. Guid son fantásticos, pero ellos vienen a un costo que puede ser un dolor de cabeza cuando el rendimiento es crítico.
    • Mantener una cosa en mente, la gente suele cambiar de página, una pregunta, en el foro de títulos. Para el SEO es BUENO tener algo así como un pequeño ID en la URL, de modo que si cambia el título todavía sabe a donde enviar a la gente que viene de una dirección URL anterior. example.com/35/old-and-busted sólo se convirtió en example.com/35/new-hotness y estás app sólo puede comprobar el título y en adelante el usuario con un 301.
    • La indización de un GUID es caro y lento, lo que los hace realmente buenos candidatos para las claves primarias.
    • «Las claves suplentes son generalmente mal visto dondequiera que he estado trabajando» – sin embargo, lo que usted describe sugiere usar Uuid precisamente como sustituto de las teclas. Además, si usted contraste claves suplentes sólo para claves naturales, sería justo decir que los Uuid están destinados a ser el más antinatural claves que se pueda tener. Así que para aclarar, sustituto vs natural es otro debate de totalidad, y no hay nada intrínsecamente malo con cualquiera de los dos enfoques.
    • Por supuesto, más de 6 años de tiempo podría cambiar eso.
    • estás haciendo poner un REAL DB clave en una dirección URL!?] Podría dar algunas alternativas a este problema? He estado explorando un mejor enfoque para un rato y buscando algunos buenos ejemplos.
    • El uso de este enfoque (bradleypeabody.github.io/uuidv6) resuelve el [no Puede ordenar por ID para conseguir la inserción de la orden] el problema. La divulgación completa: yo escribí esa página, pero me sale nada de ella, excepto que reducía ligeramente la presión arterial.
    • También una Ventaja, es decir, que la aplicación de la escala no es visible. Si utiliza entero con autoincrement todos los usuarios pueden ver cómo los usuarios se almacenan en la base de datos. O empezar con un alto valor entero como autoincrement, pero por lo que perdió este espacio.
    • si utiliza UUID1, se obtiene el incremento de teclas como la marca de tiempo que ocupa los bits más significativos. Usted puede comparar UUID1s como números para determinar la generación de la orden. También son índice de la base de amistosos como recién claves generadas son siempre al final. (Nota: UUID1 incluye el servidor de generación de la dirección MAC, así que si usted no desea revelar que, utilizar la multidifusión variante de UUID1.)
    • un hash índice es probablemente mejor se adapta a los Guid de un ordenado (btree o lo que sea) índice.

  2. 13

    @Matt Sheppard:

    Supongamos que tenemos una tabla de clientes. Seguro que no quieres un cliente de existir en la tabla de más de una vez, o un montón de confusión que va a suceder a lo largo de sus ventas y logística de los departamentos (especialmente si las múltiples hileras sobre el cliente contener información diferente).

    Así que usted tiene un identificador de cliente que identifica de forma única el cliente y asegúrese de que el identificador es conocido por el cliente (facturas), de manera que el cliente y el servicio de atención al cliente de las personas tienen una referencia común en caso de necesidad de comunicarse. Para garantizar que no se duplican los registros de los clientes, se debe agregar una singularidad-restricción a la mesa, ya sea a través de una clave principal en el identificador de cliente o a través de un NO NULO + ÚNICA restricción en la columna de identificador de cliente.

    Siguiente, por alguna razón (que no creo), se le pedirá que agregue una columna GUID a la tabla de clientes y hacer que la clave principal. Si el identificador de cliente de la columna queda ahora sin una singularidad de garantía, usted está pidiendo futuros problemas en toda la organización porque el Guid siempre será único.

    Algunos «arquitecto» se podría decir que el «oh, pero nosotros nos encargamos de la real cliente restricción de unicidad en nuestra aplicación de nivel!». A la derecha. La moda en cuanto que de propósito general y lenguajes de programación (especialmente) de nivel intermedio de marcos cambia todo el tiempo, y por lo general nunca se fuera a vivir a su base de datos. Y hay una muy buena posibilidad de que usted en algún momento necesitan para acceder a la base de datos sin tener que ir a través de la presente solicitud. == Problemas. (Pero, afortunadamente, usted y el «arquitecto» se ha ido hace tiempo, así que usted no estará allí para limpiar el desorden.) En otras palabras: ¿mantener la evidente limitación de la base de datos (y en otros niveles, así, si usted tiene el tiempo).

    En otras palabras: puede haber buenas razones para añadir GUID columnas a las tablas, pero por favor no caigas en la tentación de hacer que bajen sus ambiciones para mantener la coherencia dentro de la real (==no GUID) de la información.

    • Escuchar escuchar! El amor de tu SQL página de comparación por cierto. Extremadamente útil. La única cosa que echo de menos es un changelog.
    • Creo que esta respuesta necesita alguna aclaración: esto supone que los Uuid nunca se utilizan como claves primarias. No sé donde esta suposición viene, pero todavía tengo que ver un sistema que no permite utilizarlos como tales. sé que es un viejo respuesta, supongo que las ventajas de usar Uuid en los sistemas distribuidos no fueron tan ampliamente conocidos en aquel entonces (?).
  3. 11

    Las principales ventajas son que se puede crear identificador único sin necesidad de conectarse a la base de datos. Y id globalmente únicos por lo que facilmente puede combinar datos de diferentes bases de datos. Estos parecen como pequeñas ventajas, pero me ha salvado un montón de trabajo en el pasado.

    Las principales desventajas son un poco más espacio de almacenamiento necesario (no es un problema en los sistemas modernos) y el id de la realidad no son legibles para el ser humano. Esto puede ser un problema cuando la depuración.

    Hay algunos problemas de rendimiento, como el índice de fragmentación. Pero esos son facilmente solucionable (peine guid jimmy nillson: http://www.informit.com/articles/article.aspx?p=25862 )

    Editar fusionado mis dos respuestas a esta pregunta

    @Matt Sheppard creo que significa que usted puede filas duplicadas con diferentes Guid como claves primarias. Este es un problema con cualquier tipo de sustituto clave, no sólo Guid. Y como él dijo que es fácilmente resuelto mediante la adición significativo unique para columnas sin clave. La alternativa es utilizar una clave natural y aquellos que tienen problemas reales.

    • Yo sé acerca de peine guid y aquellos que ayudan a la resolución de indexación (INSERTAR rendimiento) problema. «principales desventajas son un poco más necesaria de almacenamiento» esta golpear el rendimiento debido a la gran base de datos el tamaño del archivo?
  4. 10

    Guid puede causar un montón de problemas en el futuro si son utilizados como «uniqifiers», dejando que duplicar los datos en las tablas. Si desea utilizar Guid, por favor, considere la posibilidad de que se mantiene todavía la ÚNICA restricción en la otra columna(s).

    • -1, cómo el infierno sería un GUID ser duplicado?
    • Este es el corazón del problema: la Introducción de un GUID hace cualquier fila única. Pero el no-artificial partes de las filas de repente puede contener duplicados (varias versiones de la verdad).
    • +1 para compensar. Veo lo que quieres decir, pero está mal expresado.
  5. 10

    ¿Por qué no mencionar a nadie rendimiento? Cuando usted tiene múltiples combinaciones, todas basadas en estos desagradable Guid la actuación va a ir a través de la planta, estado ahí 🙁

    • Usted puede elaborar sobre esto, ya estoy en la situación en la que necesito introducir UUID (o similar) , pero estoy preocupado por el uso de ellas como Clave Primaria.
    • Los uuid son sólo 4 veces el tamaño de los enteros… (si su base de datos tiene un UUID tipo)
  6. 7

    Una pequeña cuestión a tener en cuenta con el uso de los GUID como claves primarias si usted también está usando esa columna como un índice agrupado (una práctica relativamente común). Usted va a tener éxito en la inserción debido a la naturaleza de un guid no comenzar secuencial de todos modos, lo que se hará la división de la página, etc cuando usted introduzca. Sólo es algo a considerar si el sistema va a tener alta IO…

  7. 5

    primaria-claves-ids-versus-guid

    El Costo de Guid como Claves principales (SQL Server 2000)

    Mitos, GUID vs Autoincrement (MySQL 5)

    Esto es realmente lo que quieres.

    UID Pros

    • Único en cada mesa, cada base de datos, cada servidor
    • Permite un fácil fusión de registros de diferentes bases de datos
    • Permite una fácil distribución de bases de datos a través de múltiples servidores
    • Puede generar Identificadores en cualquier lugar, en lugar de ida y vuelta a la base de datos
    • La mayoría de los escenarios de replicación requiere GUID columnas de todos modos

    GUID Contras

    • Es una friolera de 4 veces más grande que el tradicional de 4 bytes, el valor del índice; esto puede tener graves rendimiento de almacenamiento y las implicaciones, si no tienes cuidado
    • Engorroso para depurar (donde userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}’)
    • El generado Guid debe ser parcialmente secuencial para obtener el mejor rendimiento (por ejemplo, newsequentialid() en SQL 2005) y para permitir el uso de los índices agrupados
  8. 0

    Hay una cosa que no es realmente dirigida, es decir, el uso de azar (UUIDv4) identificación de las claves principales dañará el rendimiento de la índice de clave principal. Va a suceder si o no la tabla está agrupado en torno a la clave.

    RDBMs generalmente garantizar la singularidad de las claves principales, y asegurar que las búsquedas por medio de una clave, en una estructura de Árbol, que es un árbol de búsqueda con un gran factor de ramificación (un árbol de búsqueda binario tiene ramificación factor de 2). Ahora, un entero secuencial ID causa de los insertos para aparecer justo uno lado del árbol, dejando a la mayoría de los nodos hoja intacta. La adición de azar Uuid hará que las inserciones para dividir la hoja de nodos de todo el índice.

    Asimismo, si los datos almacenados en su mayoría temporales, es a menudo el caso de que los datos más recientes de las necesidades de acceder a la información y se unieron en contra de la mayoría. Con random Uuid los patrones no podrán beneficiarse de este, y llegará a más filas de índice, por lo que necesitan más de las páginas de índice en la memoria. Secuencial de los Identificadores de si el más reciente de los datos es más necesario, el calor del índice de páginas requieren menos memoria RAM.

Dejar respuesta

Please enter your comment!
Please enter your name here