sql - primary - cuantas llaves primarias puede tener una tabla
¿Cuáles son los inconvenientes de usar una clave primaria compuesta/compuesta? (9)
¿Cuáles son los inconvenientes de usar una clave primaria compuesta / compuesta?
- Podría causar más problemas para la normalización ( 2NF , " Tenga en cuenta que cuando una tabla de 1NF no tiene claves candidatas compuestas (claves candidatas que constan de más de un atributo), la tabla está automáticamente en 2NF ")
- Más duplicación innecesaria de datos. Si su clave compuesta consta de 3 columnas, deberá crear las mismas 3 columnas en cada tabla, donde se utilizará como clave externa.
- Generalmente se puede evitar con la ayuda de claves sustitutivas ( lee sobre sus ventajas y desventajas )
- Puedo imaginar un buen escenario para la clave compuesta, en una tabla que representa una relación N: N, como Estudiantes - Clases, y la clave en la tabla intermedia será (ID de alumno, ID de clase). Pero si necesita almacenar más información sobre cada par (como el historial de todas las calificaciones de un alumno en una clase), probablemente le presente una clave sustituta.
- cuando lo ves en un diagrama son menos legibles
- cuando lo usa en una consulta, la unión es menos legible
- cuando lo usa en una llave maestra, tiene que agregar una restricción de verificación para que todo el atributo tenga que ser nulo o no nulo (si solo uno es nulo, la clave no está marcada)
- normalmente necesita más almacenamiento cuando lo usa como clave externa
- alguna herramienta no administra la clave compuesta
Creo que esta es una especialización del debate clave sintético (ya sea para usar claves significativas o una clave primaria sintética arbitraria). Desciendo casi por completo en el lado clave sintético de este debate por varias razones. Estos son algunos de los más pertinentes:
Debe mantener al día las tablas secundarias dependientes al final de la clave de acceso. Si cambia el valor de uno de los campos de clave principal (lo que puede suceder, ver más abajo), debe cambiar de alguna manera todas las tablas dependientes, donde su valor PK incluye estos campos. Esto es un poco complicado porque cambiar los valores clave invalidará las relaciones FK con las tablas secundarias, por lo que puede (dependiendo de las opciones de validación de restricciones disponibles en su plataforma) recurrir a trucos como copiar el registro a uno nuevo y borrar los registros anteriores.
En un esquema profundo, las teclas pueden ser bastante anchas. He visto 8 columnas una vez.
Los cambios en los valores de las claves primarias pueden ser difíciles de identificar en los procesos de ETL que se descargan del sistema. El ejemplo que tuve ocasión de ver fue una aplicación MIS extraída de un sistema de suscripción de seguros. En algunas ocasiones, el cliente volverá a utilizar una entrada de política, cambiando el identificador de política. Esto fue parte de la clave principal de la tabla. Cuando esto sucede, la carga del almacén no es consciente de cuál era el valor anterior, por lo que no puede coincidir con los datos nuevos. El desarrollador tuvo que buscar en los registros de auditoría para identificar el valor modificado.
La mayoría de los problemas con las claves primarias no sintéticas giran en torno a problemas cuando cambian los valores PK de los registros. Las aplicaciones más útiles de los valores no sintéticos son aquellas en las que se pretende utilizar un esquema de base de datos, como una aplicación MIS donde los redactores de informes están utilizando las tablas directamente. En este caso, los valores cortos con dominios fijos, como los códigos de moneda o las fechas, pueden colocarse razonablemente directamente en la tabla para su comodidad.
La desventaja principal de usar una clave primaria compuesta, es que confundirás a los generadores de código ORM típicos.
Necesita más especificidad
Llevado demasiado lejos, puede complicar demasiado las inserciones (cada tecla DEBE existir) y la documentación, y las lecturas combinadas podrían ser sospechosas si estuvieran incompletas.
A veces puede indicar un modelo de datos defectuoso (¿es una clave compuesta REALMENTE lo que describen los datos?)
No creo que haya un costo de rendimiento ... simplemente puede ir realmente mal con facilidad.
No tiene nada de malo tener una clave compuesta per se, pero una clave primaria idealmente debería ser lo más pequeña posible (en términos de cantidad de bytes requeridos). Si la clave principal es larga, esto provocará que los índices no agrupados se inflen.
Tenga en cuenta que el orden de las columnas en la clave primaria es importante. La primera columna debe ser tan selectiva como sea posible, es decir, tan "única" como sea posible. Las búsquedas en la primera columna podrán buscarse, pero las búsquedas solo en la segunda columna tendrán que escanear, a menos que también haya un índice no agrupado en la segunda columna.
Recomendaría una clave primaria generada en esos casos con una restricción única no nula en la clave compuesta natural.
Si usa la clave natural como primaria, lo más probable es que tenga que hacer referencia a ambos valores en las referencias de clave externa para asegurarse de que está identificando el registro correcto.
Para David B >> ese es un PLUS importante, ¡no un inconveniente! ORM es una pesadilla y debe evitarse como la peste.
Tomemos el ejemplo de una tabla con dos claves candidatas: una simple (columna única) y una compuesta (columna múltiple). Su pregunta en ese contexto parece ser, "¿Qué desventaja puedo sufrir si elijo promover una clave para que sea ''primaria'' y elijo la clave compuesta?"
En primer lugar, considere si realmente necesita promocionar una clave: "la existencia de la PRIMARY KEY
en SQL parece ser un accidente histórico de algún tipo. Según el autor Chris Date, las primeras encarnaciones de SQL no tenían ninguna clave restricciones y PRIMARY KEY
se agregaron más tarde a los estándares SQL. Los diseñadores del estándar obviamente tomaron el término de EFCodd que lo inventó, ¡aunque la noción original de Codd había sido abandonada en ese momento! (Codd propuso originalmente que las claves extranjeras solo deben hacer referencia una clave, la clave principal, pero esa idea fue olvidada e ignorada porque fue ampliamente reconocida como una limitación sin sentido). [fuente: Blog de David Portas: ¿Abajo con las llaves principales?
En segundo lugar, ¿qué criterio aplicaría para elegir qué tecla en una tabla debería ser ''primaria''? En SQL, la elección de la tecla PRIMARY KEY
es arbitraria y específica del producto. En ACE / Jet (también conocido como MS Access), los dos factores principales y que a menudo compiten son si desea utilizar PRIMARY KEY
para favorecer la agrupación en disco o si desea que las columnas que componen la tecla aparezcan en negrita en la imagen ''Relaciones'' en el Interfaz de usuario de MS Access; Soy una minoría al pensar que la estrategia de índice supera a la bonita imagen :) En SQL Server, puede especificar el índice agrupado independientemente de la PRIMARY KEY
y no parece haber ventaja específica del producto. La única ventaja restante parece ser el hecho de que puede omitir las columnas de PRIMARY KEY
al crear una clave foránea en SQL DDL, que es un comportamiento estándar de SQL-92 y de todos modos no me parece tan importante (tal vez otro de las cosas que agregaron al estándar porque era una característica ya muy extendida en los productos SQL?) Por lo tanto, no se trata de buscar inconvenientes, sino que debe buscar la ventaja , si la hay, de su producto SQL. PRIMARY KEY
. Dicho de otra manera, el único inconveniente de elegir la clave incorrecta es que puede estar perdiendo una ventaja dada.
En tercer lugar, ¿hace alusión al uso de una clave artificial / sintética / sustituta para implementar en su modelo físico una clave candidata de su modelo lógico porque le preocupa que haya penalizaciones de rendimiento si utiliza la clave natural en claves foráneas y combinaciones de tablas? Esa es una pregunta completamente diferente y depende en gran medida de su postura ''religiosa'' sobre el tema de las claves naturales en SQL.