primary database guid uuid

database - primary - Ventajas y desventajas de las claves de base de datos GUID/UUID



uuid npm (8)

He trabajado en una serie de sistemas de bases de datos en el pasado, donde el movimiento de entradas entre bases de datos se habría facilitado mucho si todas las claves de la base de datos hubieran sido valores GUID / UUID . He considerado seguir este camino un par de veces, pero siempre hay un poco de incertidumbre, especialmente en relación con el rendimiento y las direcciones URL que no se pueden leer por teléfono.

¿Alguien ha trabajado extensivamente con GUID en una base de datos? ¿Qué ventajas obtendría si fuera así, y cuáles son los escollos más probables?


¿Por qué nadie menciona el rendimiento? Cuando tenga varias combinaciones, todas basadas en estos GUIDs desagradables, el rendimiento irá por el piso, estado allí :(


@Matt Sheppard:

Digamos que tienes una mesa de clientes. Seguramente no querrá que exista un cliente en la tabla más de una vez, o se producirán muchas confusiones en los departamentos de ventas y logística (especialmente si las múltiples filas del cliente contienen información diferente).

Por lo tanto, tiene un identificador de cliente que identifica de manera única al cliente y se asegura de que el cliente conozca el identificador (en facturas), de modo que el cliente y las personas de servicio al cliente tengan una referencia común en caso de que necesiten comunicarse. Para garantizar que no haya registros de clientes duplicados, agregue una restricción de unicidad a la tabla, ya sea a través de una clave principal en el identificador del cliente o mediante una restricción NO NULA + ÚNICA en la columna de identificador del cliente.

Luego, por alguna razón (que no puedo imaginar), se le pide que agregue una columna GUID a la tabla de clientes y que esa sea la clave principal. Si la columna de identificador de cliente ahora queda sin una garantía de exclusividad, está solicitando problemas futuros en toda la organización porque los GUID siempre serán únicos.

Algunos "arquitectos" pueden decirle que "oh, pero nosotros manejamos la restricción de singularidad del cliente real en nuestro nivel de aplicación". Derecha. La moda con respecto a los lenguajes de programación de propósito general y (especialmente) los marcos de nivel medio cambia todo el tiempo y, por lo general, nunca superará su base de datos. Y existe una gran posibilidad de que en algún momento necesite acceder a la base de datos sin pasar por la aplicación actual. == Problemas. (Pero, afortunadamente, usted y el "arquitecto" han desaparecido hace mucho tiempo, por lo que no estará allí para limpiar el desorden). En otras palabras: mantenga restricciones obvias en la base de datos (y en otros niveles, también, si tiene) el tiempo).

En otras palabras: puede haber buenas razones para agregar columnas GUID a las tablas, pero no caiga en la tentación de reducir sus ambiciones de coherencia dentro de la información real (== sin GUID).


Hay una cosa que no se aborda realmente, a saber, el uso de identificadores aleatorios (UUIDv4) como claves primarias dañará el rendimiento del índice de la clave primaria . Ocurrirá si su tabla está agrupada o no alrededor de la clave.

Las RDBM generalmente aseguran la unicidad de las claves primarias y aseguran las búsquedas por una clave, en una estructura llamada BTree, que es un árbol de búsqueda con un gran factor de ramificación (un árbol de búsqueda binario tiene un factor de ramificación de 2). Ahora, un ID entero secuencial causaría que las inserciones se produjeran solo en un lado del árbol, dejando la mayoría de los nodos de la hoja sin tocar. Agregar UUID aleatorios hará que las inserciones dividan los nodos de hoja en todo el índice.

Del mismo modo, si los datos almacenados son en su mayoría temporales, a menudo es necesario acceder a los datos más recientes y unirlos en su mayor parte. Con los UUID aleatorios, los patrones no se beneficiarán de esto y afectarán a más filas de índice, por lo que necesitarán más páginas de índice en la memoria. Con los ID secuenciales, si los datos más recientes son los que más se necesitan, las páginas de índice activo requerirían menos RAM.


Las principales ventajas son que puede crear identificadores únicos sin conectarse a la base de datos. Y los ID son únicos a nivel mundial, por lo que puede combinar fácilmente datos de diferentes bases de datos. Estas parecen pequeñas ventajas, pero me han ahorrado mucho trabajo en el pasado.

Las principales desventajas son un poco más de almacenamiento necesario (no es un problema en los sistemas modernos) y los ID no son realmente legibles por humanos. Esto puede ser un problema al depurar.

Hay algunos problemas de rendimiento como la fragmentación del índice. Pero esos son fácilmente solubles (peine guids por jimmy nillson: http://www.informit.com/articles/article.aspx?p=25862 )

Editar fusionó mis dos respuestas a esta pregunta.

@Matt Sheppard Creo que quiere decir que puede duplicar filas con diferentes GUID como claves principales. Este es un problema con cualquier tipo de clave sustituta, no solo con los GUID. Y como él dijo, se resuelve fácilmente agregando restricciones únicas significativas a las columnas que no son claves. La alternativa es usar una clave natural y los que tienen problemas reales.


Los GUID pueden causarle muchos problemas en el futuro si se usan como "uniqifiers", lo que permite que los datos duplicados entren en sus tablas. Si desea usar GUIDs, considere seguir manteniendo las restricciones ÚNICAS en otras columnas.


Otro problema pequeño a considerar con el uso de GUIDS como claves primarias si también está utilizando esa columna como un índice agrupado (una práctica relativamente común). Va a recibir un impacto en el inserto debido a que la naturaleza de un guid no comienza de forma secuencial, por lo que será una división de páginas, etc. cuando se inserta. Solo algo a considerar si el sistema va a tener un alto IO ...


Ventajas:

  • Se pueden generar offline.
  • Hace que la replicación sea trivial (en oposición a la de int, lo que lo hace REALMENTE difícil)
  • ORM''s usualmente como ellos
  • Único en todas las aplicaciones. Por lo tanto, podemos usar los PK de nuestro CMS (guid) en nuestra aplicación (también guid) y sabemos que NUNCA vamos a tener un choque.

Desventajas:

  • Mayor uso del espacio, pero el espacio es barato (er)
  • No se puede ordenar por ID para obtener el pedido de inserción.
  • ¿Puede verse feo en una URL, pero en realidad, WTF estás haciendo poner una clave REAL DB en una URL?
  • Más difícil de hacer depuración manual, pero no tan difícil.

Personalmente, los uso para la mayoría de los PK en cualquier sistema de un tamaño decente, pero me "entrené" en un sistema que se replicó en todas partes, por lo que TENÍAS que tenerlos. YMMV.

Creo que la información de los datos duplicados es basura: puedes obtener datos duplicados como lo hagas. Las llaves sustitutas suelen estar mal vistas donde he estado trabajando. Usamos el sistema similar a WordPress aunque:

  • ID única para la fila (GUID / lo que sea). Nunca visible para el usuario.
  • La ID pública se genera UNA VEZ desde algún campo (p. ej., el título - hazlo como el título del artículo)

ACTUALIZACIÓN: Así que este recibe +1 ''mucho, y pensé que debería señalar un gran inconveniente de los GUID PK: los índices agrupados.

Si tiene muchos registros y un índice agrupado en un GUID, su desempeño de inserción será MALO, ya que obtiene inserciones en lugares aleatorios en la lista de elementos (ese es el punto), no al final (que es rápido)

Por lo tanto, si necesita un rendimiento de inserción, tal vez utilice un INT auto-inc, y genere un GUID si desea compartirlo con otra persona (es decir, mostrarlo a un usuario en una URL)


primary-keys-ids-versus-guids

El costo de los GUID como claves principales (SQL Server 2000)

Mitos, GUID vs. Autoincremento (MySQL 5)

Esto es realmente lo que quieres.

UID Pros

  • Único en cada tabla, en cada base de datos, en cada servidor.
  • Permite una fácil fusión de registros de diferentes bases de datos
  • Permite una fácil distribución de las bases de datos en múltiples servidores
  • Puede generar ID en cualquier lugar, en lugar de tener que ir de ida y vuelta a la base de datos
  • La mayoría de los escenarios de replicación requieren columnas GUID de todos modos

Contras GUID

  • Es una friolera 4 veces mayor que el valor de índice tradicional de 4 bytes; Esto puede tener serias implicaciones de rendimiento y almacenamiento si no tienes cuidado.
  • Incómodo de depurar (donde userid = ''{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}'')
  • Los GUID generados deben ser parcialmente secuenciales para un mejor rendimiento (por ejemplo, newsequentialid () en SQL 2005) y para permitir el uso de índices agrupados