válida una tipos tabla restricciones referencial referencia primaria integridad hace función foreign foranea externa datos cuál clave sql database database-design string primary-key

una - Cadenas como claves principales en la base de datos SQL



restricciones sql (14)

No estoy muy familiarizado con las bases de datos y las teorías detrás de cómo funcionan. ¿Es más lento desde el punto de vista del rendimiento (insertar / actualizar / consultar) utilizar cadenas para claves primarias que enteros?


¿Cuál es tu razón para tener una cadena como clave principal?

Simplemente establecería la clave primaria en un campo entero de incremento automático y pondría un índice en el campo de cadena.

De esta forma, si haces búsquedas en la mesa, deberían ser relativamente rápidas, y todas tus uniones y búsquedas normales no se verán afectadas en su velocidad.

También puede controlar la cantidad del campo de cadena que se indexa. En otras palabras, puede decir "solo indexe los primeros 5 caracteres" si cree que será suficiente. O si sus datos pueden ser relativamente similares, puede indexar todo el campo.


Demasiadas variables Depende del tamaño de la tabla, los índices, la naturaleza del dominio de la clave de cadena ...

En general , los enteros serán más rápidos. ¿Pero la diferencia será lo suficientemente grande como para importarle? Es difícil de decir.

Además, ¿cuál es su motivación para elegir cadenas? Las teclas numéricas de autoincremento son a menudo mucho más fáciles también. ¿Es semántica? ¿Conveniencia? ¿Replicación / inquietudes desconectadas? Su respuesta aquí podría limitar sus opciones. Esto también trae a la mente una tercera opción "híbrida" que te olvidas: Guías.


Desde el punto de vista del rendimiento: la cadena Sí (PK) ralentizará el rendimiento en comparación con el rendimiento logrado con un entero (PK), donde PK ---> Clave principal.

Desde el punto de vista de los requisitos: aunque esto no forma parte de su pregunta, me gustaría mencionarlo. Cuando manejamos datos enormes en diferentes tablas, generalmente buscamos el conjunto probable de claves que se pueden establecer para una tabla en particular. Esto se debe principalmente a que hay muchas tablas y, en su mayoría, cada una o alguna tabla se relacionaría con la otra a través de alguna relación (un concepto de clave externa). Por lo tanto, realmente no siempre podemos elegir un número entero como clave principal, sino que buscamos una combinación de 3, 4 o 5 atributos como la clave principal para esas tablas. Y esas claves se pueden utilizar como una clave externa cuando relacionaríamos los registros con alguna otra tabla. Esto hace que sea útil relacionar los registros en diferentes tablas cuando sea necesario.

Por lo tanto, para un uso óptimo: siempre hacemos una combinación de 1 o 2 enteros con 1 o 2 atributos de cadena, pero nuevamente solo si es necesario.


Dos razones para usar enteros para columnas PK:

  1. Podemos establecer la identidad para el campo entero que se incrementó automáticamente.

  2. Cuando creamos PK, el db crea un índice (Cluster or Non Cluster) que ordena los datos antes de que se almacenen en la tabla. Al usar una identidad en un PK, el optimizador no necesita verificar el orden de clasificación antes de guardar un registro. Esto mejora el rendimiento en tablas grandes.


Inserta en una tabla que tiene un índice agrupado donde la inserción ocurre en el medio de la secuencia NO hace que el índice sea reescrito. No causa la reescritura de las páginas que componen los datos. Si hay espacio en la página donde irá la fila, entonces se coloca en esa página. La página individual se reformateará para colocar la fila en el lugar correcto de la página. Cuando la página está llena, se producirá una división de página, con la mitad de las filas en la página yendo a una página y la mitad yendo en la otra. Las páginas se vuelven a vincular en la lista de páginas vinculadas que comprende una tabla de datos que tiene el índice agrupado. Como máximo, terminará escribiendo 2 páginas de base de datos.


Las cadenas son más lentas en las uniones y en la vida real rara vez son realmente únicas (incluso cuando se supone que lo son). La única ventaja es que pueden reducir el número de combinaciones si se está uniendo a la tabla principal solo para obtener el nombre. Sin embargo, las cadenas también suelen estar sujetas a cambios, lo que crea el problema de tener que corregir todos los registros relacionados cuando el nombre de la empresa cambia o la persona se casa. Esto puede ser un gran golpe de rendimiento y si todas las tablas que deberían estar relacionadas de alguna manera no están relacionadas (esto sucede más a menudo de lo que piensas), entonces también podrías tener desajustes de datos. Un número entero que nunca cambiará a lo largo de la vida del registro es una opción mucho más segura desde el punto de vista de la integridad de los datos y desde el punto de vista del rendimiento. Las claves naturales generalmente no son tan buenas para el mantenimiento de los datos.

También quiero señalar que lo mejor de ambos mundos suele ser utilizar una clave de autoincrementing (o en algunos casos especializados, un GUID) como PK y luego poner un índice único en la clave natural. Obtiene las uniones más rápidas, no obtiene registros duplicados y no tiene que actualizar un millón de registros secundarios porque cambió el nombre de una empresa.


Los índices implican muchas comparaciones.

Normalmente, las cadenas son más largas que los enteros y las reglas de intercalación se pueden aplicar para la comparación, por lo que la comparación de cadenas suele ser una tarea más intensiva desde el punto de vista informático que la comparación de enteros.

A veces, sin embargo, es más rápido usar una cadena como clave principal que hacer una combinación extra con una string to numerical id tabla de string to numerical id .


No importa lo que uses como clave principal, siempre que sea ÚNICO. Si le importa la velocidad o el buen diseño de la base de datos, use int a menos que planee replicar datos, luego use un GUID.

Si esta es una base de datos de acceso o una aplicación pequeña, ¿a quién le importa realmente? Creo que la razón por la cual la mayoría de los desarrolladores de nosotros damos una palmada a la vieja int o guid en el frente es porque los proyectos tienen una forma de crecer sobre nosotros, y queremos dejarnos la opción de crecer.


No se preocupe por el rendimiento hasta que obtenga un diseño simple y sólido que concuerde con el tema que describen los datos y que encaje bien con el uso previsto de los datos. Luego, si surgen problemas de rendimiento, puede solucionarlos ajustando el sistema.

En este caso, casi siempre es mejor usar una cadena como clave primaria natural, siempre que pueda confiar en ella. No se preocupe si se trata de una cadena, siempre que la cadena sea razonablemente corta, digamos unos 25 caracteres como máximo. No pagará un gran precio en términos de rendimiento.

¿Las personas que ingresan datos o las fuentes de datos automáticas siempre proporcionan un valor para la supuesta clave natural, o a veces se omite? ¿Es ocasionalmente incorrecto en los datos de entrada? Si es así, ¿cómo se detectan y se corrigen los errores?

¿Los programadores y usuarios interactivos que especifican consultas pueden usar la clave natural para obtener lo que quieren?

Si no puede confiar en la clave natural, invente un sustituto. Si inventa un sustituto, también podría inventar un número entero. Entonces debe preocuparse por ocultar el sustituto de la comunidad de usuarios. Algunos desarrolladores que no ocultaron la clave sustituta llegaron a arrepentirse.


Otro problema con el uso de cadenas como clave principal es que debido a que el índice se coloca constantemente en orden secuencial, cuando se crea una nueva clave que estaría en el medio del orden, el índice debe resecuenciarse ... si usa un auto número entero, la nueva clave se acaba de agregar al final del índice.


Podría haber un malentendido muy grande relacionado con la cadena en la base de datos. Casi todos han pensado que la representación de números en las bases de datos es más compacta que en cadenas. Ellos piensan que en db-s los números se representan como en la memoria. Pero no es cierto. En la mayoría de los casos, la representación numérica está más cerca de una cadena como la representación que de otra.

La velocidad de uso de número o cadena depende más de la indexación que del tipo en sí.


Por defecto, ASPNetUserIds tiene 128 cadenas de caracteres y el rendimiento es excelente.

Si la clave TIENE que ser única en la tabla, debería ser la clave. Este es el por qué;

clave de cadena primaria = Corregir relaciones de DB, 1 clave de cadena (El primario) y 1 cadena Índice (El Primario).

La otra opción es una clave int típica, pero si la cadena TIENE que ser única, es probable que necesite agregar un índice debido a las consultas continuas para validar o verificar que sea única.

Entonces, usar una clave de identidad int = relaciones incorrectas de base de datos, 1 clave int (primaria), 1 índice int (principal), probablemente un único índice de cadena, y tener que validar manualmente la misma cadena no existe (algo así como una verificación SQL quizás )

Para obtener un mejor rendimiento usando un int sobre una cadena para la clave primaria, cuando la cadena TIENE que ser única, tendría que ser una situación muy extraña. Siempre he preferido usar claves de cadena. Y como una buena regla general, no desnormalice una base de datos hasta que NECESITE .


Sí, pero a menos que espere tener millones de filas, no usar una clave basada en cadenas porque es más lento generalmente es una "optimización prematura". Después de todo, las cadenas se almacenan como números grandes, mientras que las claves numéricas generalmente se almacenan como números más pequeños.

Sin embargo, una cosa a tener en cuenta es si tiene índices agrupados en una clave cualquiera y está haciendo un gran número de insertos que no son secuenciales en el índice. Cada línea escrita causará que el índice vuelva a escribir. si está haciendo inserciones por lotes, esto realmente puede ralentizar el proceso.


Técnicamente sí, pero si una cadena tiene sentido para ser la clave principal, entonces probablemente deberías usarla. Todo esto depende del tamaño de la tabla para la que está haciendo y de la longitud de la cadena que va a ser la clave principal (cadenas más largas == más difíciles de comparar). No usaría necesariamente una cadena para una tabla que tiene millones de filas, pero la cantidad de desaceleración de rendimiento que obtendrá al usar una cadena en tablas más pequeñas será minúsculo para los dolores de cabeza que puede tener al tener un número entero que no lo hace no significa nada en relación con los datos.