2009-02-02 41 views

Respuesta

48

Eso depende de lo que está haciendo:

  • Si la velocidad es la principal preocupación entonces una llanura de edad int es probablemente lo suficientemente grande.
  • Si realmente va a tener más de 2 billones (con un B;)) registros, entonces use bigint o un guid secuencial.
  • Si necesita poder sincronizar fácilmente con registros creados de forma remota, entonces Guid es realmente genial.

actualización
Algunos adicional (menos evidente) señala el GUID:

  • Pueden ser difíciles de índices, y que lleva al centro de rendimiento de la base
  • Se puede utilizar guías secuenciales para recuperar parte del rendimiento de indexación, pero renunciar a algo de la aleatoriedad utilizada en el punto dos.
  • Las guías pueden ser difíciles de depurar a mano (where id='xxx-xxx-xxxxx'), pero también se recupera a través de guías secuenciales (where id='xxx-xxx' + '123').
  • Por la misma razón, los Guids pueden hacer que los ataques de seguridad basados ​​en ID sean más difíciles, pero no imposibles. (No puede simplemente escribir 'http://example.com?userid=xxxx' y esperar obtener un resultado para la cuenta de otra persona).
+1

¿No serían eso 2 mil millones de filas? INT está firmado. –

+1

;) Bueno ... Voy a tomar mi -1 –

+0

Incluso si el id es un entero, yo utilizo una columna GUID adicional para proporcionar una búsqueda para su uso con las direcciones URL ... O eso, o un parámetro adicional para correlacionar prevenir ese tipo de ataque. –

7

En general lo recomiendo un BIGINT durante un GUID (como guids son grandes y lento), pero la pregunta es, ¿Por lo menos necesita eso? (Es decir, ¿está haciendo la replicación?) Si está esperando menos de 2 mil millones de filas, la tradicional INT estará bien.

0

Realmente depende de si la información entrante es de alguna manera secuencial o no. Recomiendo encarecidamente a los usuarios que un GUID sea mejor. Sin embargo, para datos secuenciales, como pedidos u otras cosas que deben ser fácilmente clasificables, un bigint puede ser una mejor solución, ya que será indexado y proporcionará una clasificación rápida sin el costo de otro índice.

+1

Puede usar NEWSEQUENTIALID() para crear un campo GUID secuencial que optimice el índice y mejore el rendimiento. – Craig

1

Depende no lo que necesita. DB El rendimiento ganaría a partir del número entero mientras que los GUID son útiles para replicación y no es necesario escuchar de DB qué identidad se ha creado, es decir, el código podría crear una identidad GUID antes de insertar en la fila.

0

Realmente depende de si esperas tener una réplica en la imagen. La replicación requiere un UUID de fila, por lo que si planea hacer eso, puede hacerlo desde el principio.

1

Si planea utilizar la duplicación de mezcla, un ROWGUIDCOL es beneficioso para el rendimiento (see here for info). De lo contrario, necesitamos más información acerca de cuál es su definición de "mejor"; mejor para qué?

4

¿Está haciendo la replicación o tiene vendedores que ejecutan databses desconectados que deben combinarse, use un GUID? De lo contrario, iría por un int o bigint. Son mucho más fáciles de tratar a largo plazo.

0

A menos que tenga una necesidad real de un GUID, como poder generar claves en cualquier lugar y no solo en el servidor, entonces me quedaré con el uso de claves basadas en INTEGER. Los GUID son caros de crear y hacen que sea más difícil mirar los datos. Además, ¿alguna vez ha tratado de escribir un GUID en una consulta SQL? ¡Es doloroso!

+12

Nadie intenta escribir un GUID. Estoy seguro de que copiar/pegar se inventó el día después de que se inventaran GUID ;-) – Craig

0

estoy con Andrew Rollings.

Ahora se podría argumentar la eficiencia del espacio. Un int es lo que, 8 bytes max? Un guid va a ser mucho más largo.

Pero tengo dos razones principales de preferencia: legibilidad y tiempo de acceso. Los números son más fáciles para mí que los GUID (ya que siempre puedo encontrar el registro siguiente/anterior fácilmente).

En cuanto al tiempo de acceso, tenga en cuenta que algunos DB pueden comenzar a tener GRANDES problemas con los GUID. Sé que este es el caso con MySQL (MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance). Esto puede no ser un gran problema con SQL Server, pero es algo de lo que hay que tener cuidado.

diría palo con INT o BIGINT. La única vez que pensaría que querría el GUID es cuando va a darlos y no quiere que las personas puedan adivinar las ID de otros registros por razones de seguridad.

0

No puede haber unos cuantos aspectos o requisitos para utilizar GUID.

  • Si la clave principal es de cualquier tipo numérico (Int, Bigint o cualquier otro), entonces o bien que necesita para hacer que la columna de identidad, o es necesario comprobar el último valor guardado en la tabla.
  • Y en ese caso, si el registro de la tabla externa se guarda como transacción, entonces sería difícil obtener el último valor de identidad de la clave primaria. Al igual que si se utiliza IDENT_CURRENT, se volverá a ejecutar el efecto mientras se guarda el registro en clave externa.
  • Entonces, en caso de guardar los registros en cuanto a las transacciones, entonces sería conveniente generar primero Guid para la clave principal, y luego guardar la clave generada (Guid) en la (s) tabla (s) primaria (s) y extranjera (s).
Cuestiones relacionadas