Las claves compuestas nunca deben considerarse en aplicaciones "nuevas". Fueron utilizados en el pasado por personas que solían pensar que las "claves comerciales" son mejores que las "claves sustitutas".
Editar:según lo solicitado por Chris, estoy ampliando mi respuesta.
Permítanme comenzar diciendo que entiendo esta pregunta como "Claves primarias compuestas" frente a "Claves sustitutas".
Además, reconozco que hay uno caso de uso donde una clave compuesta tiene sentido:en tablas de referencias cruzadas, también llamadas "tablas de enlace". Estos se usan en tablas de muchos a muchos y consisten en solo dos campos, ambas claves externas que forman una clave principal para la tabla de referencia externa. Por ejemplo, UserRole
la tabla contendría user_id
y role_id
, nada más. No hay representación de clase en Java, por ejemplo, para una tabla como esta. Este suele ser un @ManyToMany
, con una Collection
en ambos lados.
Compartí mis puntos de vista sobre las claves naturales frente a las claves sustitutas en otra respuesta ( Hibernate:Opiniones en Composite PK vs Surrogate PK ), y creo que las claves compuestas comparten algunas de las desventajas de la clave natural, sin aportar ningún beneficio real.
El problema con las claves compuestas es que necesitará dos valores para identificar de forma única un registro. Esto se convierte en un problema una vez que comienza a tener tablas que hacen referencia a registros en esta primera tabla. La segunda tabla necesita entonces dos columnas para poder hacer referencia a one registro. Y si esta segunda tabla usa una clave compuesta formada por un solo valor + la clave externa, ahora tiene tres columnas para identificar uno de forma única registro. Y una tercera mesa necesitaría estos tres columnas adicionales solo para hacer referencia a uno registro en la segunda tabla. Realmente, esto es una bola de nieve.
Otra desventaja es que los requisitos do cambio. Todo el tiempo. Entonces, lo que parece ser una buena clave compuesta hoy no es una clave en absoluto mañana. Es por eso que tenemos claves sustitutas:para estar preparados para el futuro.
Las claves compuestas se utilizan principalmente para que los registros de una tabla sean únicos en función de un conjunto de columnas. Por ejemplo, si tiene un Customers
tabla, es posible que tenga un NationalId
+Country
como un valor único, lo que significa que dos usuarios no pueden compartir el mismo SSN si su país es EE. UU. Pero es posible tener el mismo número para dos registros, si no están en el mismo país. Si te gustan las claves compuestas, este sería un buen candidato para ello. Pero como insinué anteriormente, puede usar una clave sustituta y aplicar un unique
restricción. Tendrá los beneficios de una clave compuesta más la seguridad de una clave sustituta.