Me gustaría construir un sistema distribuido. Necesito almacenar datos en bases de datos y sería útil usar un UUID o un GUID como clave principal en algunas tablas. Supongo que es un inconveniente con este diseño ya que el UUID / GUID es bastante grande y son casi aleatorios. La alternativa es utilizar un INT o LONG de incremento automático.
¿Cuáles son los inconvenientes de usar UUID o GUID como clave principal para mis tablas?
Probablemente usaré Derby / JavaDB (en los clientes) y PostgreSQL (en el servidor) como DBMS.
Respuestas:
Depende de la función de generación y el tamaño de las tablas finales.
Los GUID están destinados a ser identificadores únicos a nivel mundial . Como se discutió en la documentación de Postgres 8.3, no existen metodologías que sean universalmente apropiadas para generar estos identificadores, pero postgreSQL se entrega con algunos candidatos más útiles.
Desde el alcance de su problema y la necesidad de escrituras fuera de línea , ha descartado claramente el uso de cualquier cosa que no sea un GUID, y por lo tanto no hay ventajas compensatorias de otros esquemas.
Desde un punto de vista funcional, la longitud de la clave generalmente no es un problema en ningún tipo de sistema moderno, dependiendo del número de lecturas y el tamaño de la tabla. Como metodología alternativa, los clientes fuera de línea podrían agrupar nuevos registros sin una clave primaria y simplemente insertarlos al volver a conectarlos. Como postgreSQL ofrece el tipo de datos "Serie", los clientes nunca necesitarán determinar la ID si pueden realizar una escritura simple en la base de datos.
fuente
{Node_ID, Item_ID}
donde cada nodo tiene unNode_ID
, y unItem_ID
que se incrementa automáticamente por nodo.Un consejo más: nunca use GUID como parte del índice agrupado. Los GUID no son secuenciales, por lo tanto, si forman parte del índice agrupado, cada vez que inserte un nuevo registro, la base de datos necesitará reorganizar todas sus páginas de memoria para encontrar el lugar correcto para la inserción, en caso de int (bigint) auto-increment, sería solo la última página.
Ahora, si observamos algunas realizaciones de db: 1.) MySQL: las claves principales están agrupadas, sin opción de cambiar el comportamiento; la recomendación es no usar GUID en absoluto aquí 2.) Postgres, MS-SQL: puede hacer GUID como clave primaria no agrupada y utilice otro campo como índice agrupado, por ejemplo, autoincrement int.
fuente
database would need to rearrange all its memory pages to find the right place for insertion
=> No creo que sea el caso con Postgres, ya que la agrupación es opcional y las nuevas filas se almacenan sin ordenar.Depende.
En serio, con todo lo que has dado hasta ahora, esto es lo más lejos que puedes llegar.
¿Por qué sería útil usar UUID? ¿Por qué no usarás INTs? ¿Por qué no puedes simplemente indexar UUIDs más tarde? ¿Entiende lo que significa tener una lista ordenada con la clave de un UUID e insertar un UUID aleatorio (no secuencial) después de unos pocos millones de filas?
¿En qué plataforma se ejecutará esto? Cuantos discos Cuantos usuarios Cuantos registros
fuente