2010-02-02 20 views
48

Estoy tratando de descubrir las "mejores prácticas" para decidir si agregar o no un entero de incremento automático como la clave principal de una tabla.Cuándo utilizar una clave principal autoincrementada y cuándo no?

Digamos que tengo una tabla que contiene datos sobre los elementos químicos. El número atómico de cada elemento es único y nunca cambiará. Entonces, en lugar de usar un entero autoincrementado para cada columna, probablemente tendría más sentido usar el número atómico, ¿correcto?

¿Sería lo mismo si tuviera una tabla de libros? ¿Debo usar el ISBN o un entero de incremento automático para la clave principal? ¿O una tabla de empleados que contiene el SSN de cada persona?

+1

+1 Me interesa ver lo que dice la gente acerca de esto –

+1

Esta pregunta, en varias formas, es algo perenne ... ver http://stackoverflow.com/questions/532363/native-primary-key-or -auto-generated-one por ejemplo. – mjv

+0

Esto realmente no vale una respuesta, pero esta es mi opinión: si estás absolutamente seguro de que nunca tendrás dos libros con el mismo ISBN o dos personas con el mismo número de seguro social, no dudaría en utilizar esos valores como claves principales . Pero eso es solo un hábito, supongo. Algunos sistemas ORM, como los modelos de Django, hacen que sea difícil hacer eso e insisten en tener siempre una identificación numérica incremental. Por otro lado, si está en PostgreSQL, incluso puede hacer cosas como * llaves duales *. Me gusta usarlos siempre que puedo. –

Respuesta

13

Hay muchas preguntas ya abordadas en Stack Overflow que pueden ayudarlo con sus preguntas. Ver here, here, here y here.

El término que debe buscar: surrogated keys.

Espero que ayude.

+0

Ah. Gracias. Busco un poco, pero no pude encontrar la forma de frasear correctamente las palabras clave. – jamieb

+0

Impresionante. Encantado de ayudar. –

4

Tienes la idea allí mismo.

El incremento automático se debe utilizar como una clave única cuando ya no exista una clave única sobre los elementos que está modelando. Por lo tanto, para Elementos, puede usar el Número atómico o Libros, el número ISBN.

Pero si las personas están publicando mensajes en un tablón de mensajes, entonces estos necesitan una identificación única, pero no contienen uno de forma natural, por lo que asignamos el siguiente número de una lista.

tiene sentido utilizar las teclas naturales siempre que sea posible, sólo recuerde que el campo como clave principal y asegurarse de que está indexado para un rendimiento

+1

"El incremento automático debe usarse como una clave única cuando ya no existe una clave única" - No podría estar más en desacuerdo. – onedaywhen

2

que estoy tratando de averiguar las "mejores prácticas" para decidir si agregar o no un entero autoincrementado como la clave primaria de una tabla.

Úselo como un identificador único con un conjunto de datos donde PKey no es parte de los datos administrados por el usuario.

Digamos que tengo una tabla que contiene datos sobre los elementos químicos. El número atómico de cada elemento es único y nunca cambiará. Entonces, en lugar de usar un entero autoincrementado para cada columna, probablemente tendría más sentido usar el número atómico, ¿correcto?

Sí.

¿Sería lo mismo si tuviera una tabla de libros? ¿Debo usar el ISBN o un entero de incremento automático para la clave principal? ¿O una tabla de empleados que contiene el SSN de cada persona?

ISBNs/SS # s son asignados por terceros y debido a su gran tamaño de almacenamiento sería una forma muy ineficiente de identificar de manera única una fila. Recuerde, las PKeys son útiles cuando une tablas. ¿Por qué utilizar un formato de datos grande como un ISBN que incluiría numerosos caracteres de texto como el identificador único cuando hay disponible un formato pequeño y compacto como Integer?

+0

"Digamos que tengo una tabla que contiene datos sobre los elementos químicos ... probablemente tendría más sentido usar el número atómico" - nótese que hay tres claves candidatas: peso atómico, símbolo y número. ¿Deberían todos tener restricciones únicas en la tabla de la base de datos? ¿Vale la pena elegir uno para ser la clave principal? Si es así, ¿según qué criterio? PD. no hay una respuesta "correcta" a estas preguntas :) – onedaywhen

+0

¿Es cierto que un valor 'CHAR (13)' es "grande" y "altamente ineficiente"? – onedaywhen

2

El principal problema que he visto con el aumento automático de un enfoque entero es cuando exporta sus datos para llevarlos a otra instancia de db, o incluso una operación de archivo y restauración.Debido a que el número entero no tiene relación con los datos a los que hace referencia, no hay forma de determinar si tiene duplicados al restaurar o agregar datos a una base de datos existente. Si no quiere ninguna relación entre los datos contenidos en la fila y el PK, solo usaría un guid. No es muy fácil de usar, pero resuelve el problema anterior.

3

Con respecto al uso de ISBN y SSN, realmente tiene que pensar en cuántas filas en otras tablas van a hacer referencia a estas a través de claves externas porque esos identificadores ocuparán mucho más espacio que un entero y por lo tanto pueden conducir a un desperdicio de espacio en disco y posiblemente empeore el rendimiento.

+0

"ocupará mucho más espacio que un número entero y, por lo tanto, puede generar un desperdicio de espacio en disco" - saludos del año 2012 (bueno, casi!): Estoy aquí para decirle que el espacio en disco ahora es tan barato como chips :) – onedaywhen

+1

@onedaywhen join performance aún es algo a considerar en el año 2012 :-P –

9

Esta es una pregunta muy debatida, con mucha emoción en ambos lados.

En mi humilde opinión, si hay una buena clave natural utilizable, como un ISBN, la uso. Voy a almacenarlo en la base de datos de todos modos. Sí, una clave natural suele ser más grande que una clave de autoincrecimiento entero, pero creo que este problema es exagerado. El espacio en disco es barato hoy. Me preocuparía más que tardara más en procesarse. Si estuvieras hablando de un campo de texto de 80 bytes como clave principal, diría que no. Pero si estás pensando en usar un ISBN de 10 bytes en lugar de un entero grande de 8 bytes, no me puedo imaginar que eso represente una gran penalización en el rendimiento.

A veces hay una ventaja de rendimiento para las teclas naturales. Supongamos, por ejemplo, que quiero encontrar cuántas copias de un libro dado se han vendido. No me importan los datos del registro maestro del Libro. Si la clave principal es ISBN, simplemente podría escribir "select count (*) from sale where isbn = '143573338X'". Si utilizo una clave de autoincrement, tendría que hacer una combinación para buscar el isbn, y la consulta se vuelve más compleja y más lenta, como "select count (*) de book join sale using (bookid) where isbn = '143573338X' ". (Y puedo asegurarle que como este ISBN particular es para mi libro, el número de registros de venta es muy pequeño, por lo que hacer la unión y leer un registro adicional es una gran diferencia porcentual!)

Otra ventaja de la natural claves es que cuando tiene que trabajar en la base de datos y mira los registros que se refieren a esta tabla por clave, es fácil ver a qué registro se refieren.

Por otro lado, si no hay una buena clave natural obvia, no intente improvisar una loca. He visto a personas intentar hacer una llave natural concatenando juntas las primeras 6 letras del nombre del cliente, su año de nacimiento y su código postal, y luego rezar para que eso sea único. Ese tipo de tontería solo te está causando problemas. A menudo las personas terminan tomando un número de secuencia para asegurar que sea único de todos modos, y en ese punto, ¿para qué molestarse? ¿Por qué no usar solo el número de secuencia como la clave?

0

Tema anterior Lo sé, pero otra cosa a tener en cuenta es que, dado que la mayoría de los RDBMS establecen bloques en el disco utilizando el PK, usar un PK de incremento automático simplemente aumentará enormemente su contención. Esto puede no ser un problema para la base de datos de su bebé con la que está jugando, pero créanme que puede causar problemas de rendimiento masivo en el extremo más grande de la ciudad.

Si debe utilizar un ID de incremento automático, tal vez considere el uso como parte de un PK. Tachuelo en el extremo para mantener la singularidad .....

Además, es mejor agotar todas las posibilidades de PK naturales antes de saltar a un sustituto. La gente generalmente es floja con esto.