2010-12-29 13 views
10

¿Hay alguna razón por la que no deba usar un entero como clave principal para mis tablas?clave principal SQL, INT o GUID o ...?

La base de datos es SQL-CE, dos tablas principales de aproximadamente 50,000 entradas por año, y algunas tablas menores. Solo dos conexiones existirán abiertas constantemente a la base de datos. Pero las actualizaciones se desencadenarán a través de múltiples conexiones de socket TCP, por lo que serán muchos subprocesos cruzados que acceden y usan la misma conexión de base de datos. Aunque la actividad es muy baja, las actualizaciones simultáneas son bastante improbables, pero pueden ocurrir un par de veces al día como máximo.

Probablemente usará LINQ2SQL para DAL o conjuntos de datos tipeados.

No estoy seguro si esta información es relevante, pero es por eso que estoy pidiendo, ya que no sé :)

+0

También puede encontrar algunos comentarios útiles de estas preguntas populares aquí: [¿Cómo le gustan sus claves principales?] (Http://stackoverflow.com/questions/404040/how-do-you-like-your-primary -keys) [¿Es una mala idea usar GUIDs como claves principales en MS SQL?] (http://stackoverflow.com/questions/537145/is-it-a-bad-idea-to-use-guids-as -primary-keys-in-ms-sql) – DOK

Respuesta

9

La ventaja de usar GUID primkey es que debe ser único en el mundo, como por ejemplo si mover datos de una base de datos a otra. Entonces sabes que la fila es única.

Pero si estamos hablando de un pequeño db, entonces prefiero entero.

Editar:

Si el uso de SQL Server 2005 ++, puede también utilizar NEWSEQUENTIALID(), esto genera un GUID basado en la fila de arriba.Permite que el problema del índice con newid() ya no esté allí.

+0

No resuelve por completo el problema de indexación solo una parte de usar un índice agrupado. Todavía creará un índice que tendrá problemas de rendimiento (y un tamaño de almacenamiento más grande para todos los índices a medida que usan el PK) en comparación con un int, ya que es mucho más amplio, lo mejor es usar solo un GUID si sabe que lo hará. necesidad de mover datos a otra base de datos en el futuro o si usa la replicación. – HLGEM

+0

hay 16 bytes frente a 4 bytes, entonces ... 1 millón de registros será un poco más de 11 MB – sv88erik

+0

¡Gracias! no estaba al tanto del propósito de que el GUID sea "único", pero eso tiene sentido, y por lo tanto obviamente no tengo nada de qué preocuparme. No se moverá de mi computadora :) – bretddog

10

Usted debería utilizar un entero - es más pequeño, es decir, menos memoria, menos IO (disco y red), menos trabajo para unirse.

La base de datos debe manejar los problemas de simultaneidad, independientemente del tipo de PK.

+0

"Menos trabajo dos join", ¿qué pones en él? Para ti o SQL Server? Cuando los códigos duros Mon unir enlace? – sv88erik

+3

@ sv88erik: menos trabajo para el servidor. – Oded

5

¿Hay alguna razón por la que no debería utilizar un entero como clave principal para mis tablas?

No, siempre que cada uno sea único, los números enteros están bien. Las guías suenan como una buena idea al principio, pero en realidad son demasiado grandes. La mayoría de las veces, se usa un mazo para matar una mosca, y el tamaño del Guid lo hace mucho más lento que usar un número entero.

+2

¿Puede proporcionar pruebas de la afirmación de que la base de datos de GUID es mucho más lenta? –

3

Definitivamente use un número entero, no desea usar un GUID en un índice agrupado (PK) ya que hará que la tabla se fragmente innecesariamente.

+2

PK no tiene que agruparse índices – HLGEM

5

No veo ninguna razón para no utilizar un número entero de incremento automático en este escenario. Si alguna vez llega al punto en que un entero no puede manejar el volumen de datos, entonces está hablando de una aplicación escalada hasta el punto de que de todos modos hay mucho más trabajo involucrado.

Tenga en cuenta algunas cosas:

  1. Un entero es el tamaño de la palabra nativa para el hardware. Es lo más rápido, sencillo y fácil en la computadora a medida que se obtiene un tipo de datos.
  2. Al considerar posiblemente el uso de un GUID, sepa que hacen que las claves primarias sean terribles. Las bases de datos relacionales en general (no puedo hablar para nada, pero MS SQL es un buen ejemplo) no indexan bien los GUID. Hay intrusiones para tratar de crear GUID más amigables con los índices, tómalas o déjalas. Pero, en general, se debe evitar un GUID como PK por motivos de rendimiento.
+2

Es curioso, porque veo que Microsoft usa GUID para las claves principales todo el tiempo. Por ejemplo, Microsoft CRM usa GUID para sus claves principales. Una ventaja de los GUID es que no tiene que preocuparse por la secuencia, y es imposible obtener una violación clave (a menos que esté reutilizando una clave anterior de alguna manera). –

+1

@Mystere Man: Bueno, es improbable que alguna vez obtenga una violación clave :) Pero su punto permanece, y es algo que nunca he entendido acerca de algunas de las herramientas de Microsoft. Sus elementos de membresía/proveedor de roles para ASP .NET es un ejemplo común. Algo así puede funcionar bien para proyectos pequeños donde no es una preocupación, pero no se escalará. – David

Cuestiones relacionadas