He estado leyendo sobre razones para usar o no Guid
y int
.
int
Es más pequeño, más rápido, fácil de recordar, mantiene una secuencia cronológica. Y en cuanto a Guid
, la única ventaja que encontré es que es única. ¿En qué caso a Guid
sería mejor que int
y por qué?
Por lo que he visto, int
no tiene fallas excepto por el límite de número, que en muchos casos son irrelevantes.
¿Por qué exactamente fue Guid
creado? De hecho, creo que tiene un propósito que no sea servir como clave principal de una tabla simple. (¿Algún ejemplo de una aplicación real que use Guid
para algo?)
(Guid = UniqueIdentifier) tipo en SQL Server
int
no tiene fallas excepto por el límite de número, que en muchos casos son irrelevantes": en realidad, en este contexto de INT vs GUID, el límite superior de un signo de 32 bitsINT
es completamente irrelevante dado que el límite superior de un signo , 64 bitsBIGINT
está más allá de casi todos los usos (aún más si comienza a numerar en el límite inferior; y lo mismo ocurreINT
) y sigue siendo la mitad del tamaño de un GUID (8 bytes en lugar de 16) y secuencial.Respuestas:
Esto se ha pedido en Stack Overflow aquí y aquí .
La publicación de Jeff explica mucho sobre los pros y los contras del uso de GUID.
Si está seguro del rendimiento y no planea replicar o fusionar registros, utilice
int
y configure el incremento automático ( semilla de identidad en SQL Server ).fuente
UNIQUEIDENTIFIER
másINT
porqueINT
tiene un límite superior es un razonamiento bastante pobre ya que ser ilimitado, aunque es cierto, no es un beneficio práctico . Puede doblar fácilmente la capacidad efectiva de unINT
comenzándolo en el límite inferior (-2.14 mil millones) en lugar de en 1. O, si los 4.3 mil millones no son suficientes, comience con un valor deBIGINT
8 bytes. en comparación con 16 para el GUID, y es secuencial.Si está sincronizando sus datos con una fuente externa, un GUID persistente puede ser mucho mejor. Un ejemplo rápido de dónde estamos usando un GUID es una herramienta que se envía al cliente para rastrear su red y hacer ciertas clases de autodescubrimiento, almacenar los registros encontrados y luego todos los registros del cliente se integran en una base de datos central De vuelta a nuestro lado. Si usáramos un número entero, tendríamos 7,398 "1" s, y sería mucho más difícil hacer un seguimiento de qué "1" era cuál.
fuente
He utilizado un enfoque híbrido con éxito. Las tablas contienen AMBAS
id
columnas de enteros de clave primaria de incremento automático Y unaguid
columna. Seguid
puede usar según sea necesario para identificar globalmente de manera única la fila yid
se puede usar para consultas, clasificación e identificación humana de la fila.fuente
id
ya es suficiente para que los humanos identifiquen una fila?INT
PK. Me parece extraño que este enfoque no sea mucho más común dado que es lo mejor de ambos mundos. Parece que la mayoría de las personas simplemente prefieren resolver problemas en términos muy absolutistas, sin darse cuenta de que el PK no necesita ser un GUID para que la aplicación todavía use GUID para la unicidad y / o portabilidad global.Algunas de las mejores prácticas aún mencionan que debe usar un tipo de datos que se adapte con la menor memoria posible a todo el conjunto de valores que va a usar. Por ejemplo, si lo está utilizando para almacenar el número de empleadores en una pequeña empresa y es poco probable que llegue a 100, entonces nadie sugeriría usar un valor bigint mientras int (incluso smallint) lo haría.
Por supuesto, el inconveniente de esto es como "¡Di no a la escalabilidad!"
Además, sé que esto no está totalmente relacionado, pero hay otro factor con respecto a esto. Cuando no es excesivo, generalmente trato de recomendar el uso de una clave primaria no autogenerada, si tiene sentido. Por ejemplo, si está guardando la información del conductor, no se moleste en crear una nueva columna autogenerada para "ID", solo use el número de licencia.Sé que esto suena muy obvio, pero veo que se olvida con bastante frecuencia.Para el contexto: esta parte de la respuesta se abordó desde un enfoque teórico de datos, donde desea que su PK sea el único identificador de datos para un registro. La mayoría de las veces los creamos cuando ya existen, de ahí la respuesta anterior.
Sin embargo, es muy raro que pueda tener un control estricto sobre estos puntos de datos y, como tal, es posible que deba hacer correcciones o ajustes. No puedes hacer eso con las claves principales (bueno, puedes, pero puede ser un dolor).
Gracias @VahiD por las aclaraciones.
fuente
El uso de ID de incremento automático puede filtrar información sobre su actividad comercial. Si tiene una tienda y la utiliza
order_id
para identificar públicamente una compra, cualquiera puede averiguar su número de ventas mensuales por simple aritmética.fuente
Otra cosa con cómo se generan los GUID. mrdenny señaló correctamente que incluso si se usa newsequentialid (), reiniciar las instancias hace que los nuevos valores comiencen con los "agujeros" que quedaron en el procesamiento anterior. Otra cosa que afecta a los GUID "secuenciales" es la tarjeta de red. Si no recuerdo mal, el UID de la NIC se usa como parte del algoritmo GUID. Si se reemplaza una NIC, no hay garantía de que el UID sea un valor más alto para mantener el aspecto secuencial de las cosas. Tampoco estoy seguro de cómo las NIC múltiples pueden afectar la asignación de valores usando el algoritmo.
Solo un pensamiento y espero estar recordando correctamente. ¡Que tengas un gran día!
fuente
Usa ambos
Use int / Bigint para la clave principal, ya que es fácil de mantener y usar como relaciones de clave externa.
Pero vincule una columna al GUID para que cada fila también tenga una columna única
fuente
int
yguid
, como sugiere en su respuesta. Y además, no estaba hablando de explicarme tu sugerencia solo a mí, mi punto era que tal vez quieras actualizar tu respuesta . Por cierto, ¿eres consciente de que otro respondedor ya ha sugerido lo mismo (más o menos) que tú ?