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?
+1 Me interesa ver lo que dice la gente acerca de esto –
Esta pregunta, en varias formas, es algo perenne ... ver http://stackoverflow.com/questions/532363/native-primary-key-or -auto-generated-one por ejemplo. – mjv
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. –