modificar - insertar registro auto_increment sql
SQL: ¿Necesita una clave primaria autoincremental para tablas Many-Many? (7)
Supongamos que tiene una tabla Muchos-Muchos entre Artistas y Fans. Cuando se trata de diseñar la tabla, ¿se diseña la tabla como tal?
ArtistFans
ArtistFanID (PK)
ArtistID (FK)
UserID (FK)
(ArtistID and UserID will then be contrained with a Unique Constraint
to prevent duplicate data)
¿O construyes un PK compuesto para los dos campos relevantes?
ArtistFans
ArtistID (PK)
UserID (PK)
(The need for the separate unique constraint is removed because of the
compound PK)
¿Hay alguna ventaja (tal vez la indexación?) Para usar el esquema anterior?
Es curioso cómo todas las respuestas favorecen a la variante 2, así que tengo que disentir y defender la variante 1;)
Para responder la pregunta en el título: no, no lo necesitas. Pero...
Tener una columna autoincremental o de identidad en cada tabla simplifica su modelo de datos para que sepa que cada una de sus tablas siempre tiene una sola columna PK.
Como consecuencia, cada relación (clave externa) de una tabla a otra siempre consiste en una sola columna para cada tabla.
Además, si escribe algún marco de aplicación para formularios, listas, informes, registro, etc., solo tiene que tratar con tablas con una única columna PK, lo que simplifica la complejidad de su marco.
Además, una columna PK id adicional no le cuesta mucho en términos de espacio en disco (excepto para las tablas bill-record-plus).
Por supuesto, debo mencionar una desventaja: en una relación abuelo-padre-hijo, el niño perderá la información de su abuelo y requerirá un ENTREGARSE para recuperarlo.
Incluso si crea una columna de identidad, no tiene que ser la clave principal.
ArtistFans
ArtistFanId
ArtistId (PK)
UserId (PK)
Las columnas de identidad pueden ser útiles para relacionar esta relación con otras relaciones. Por ejemplo, si había una tabla de creadores que especificaba la persona que creó la relación artista-usuario, podría tener una clave externa en ArtistFanId, en lugar de la clave primaria ArtistId + UserId compuesta.
Además, se requieren columnas de identidad (o mejorar en gran medida la operación de) ciertos paquetes ORM.
La forma estándar es usar la clave primaria compuesta. Agregar una clave de autoincrement separada es simplemente crear un sustituto que ya está allí utilizando lo que tiene. Los patrones correctos de normalización de la base de datos serían despreciables al usar el autoincrement.
No puedo pensar en ninguna razón para usar el primer formulario que lista. La clave primaria compuesta está bien, y tener una clave primaria artificial separada (junto con el contraint único que necesita en las claves externas) simplemente tomará más tiempo para calcular y espacio para almacenar.
ArtistFans
ArtistID (PK)
UserID (PK)
El uso de un PK incremental automático no tiene ventajas aquí, incluso si las tablas padre los tienen.
También crearía automáticamente un índice de "PK inverso" (UserID, ArtistID)
: lo necesitará porque consultará la tabla por ambas columnas.
Las columnas de Autonumérico / ID tienen su lugar. Los elegirías para mejorar ciertas cosas después del proceso de normalización basado en la plataforma física. Pero no para las tablas de enlaces: si insiste en que su cerebro ORM insiste, entonces cambie los ORM ...
Editar, Oct 2012
Es importante tener en cuenta que aún necesitaría índices únicos (UserID, ArtistID)
y (ArtistID, UserID)
. Agregar incrementos automáticos solo usa más espacio (en la memoria, no solo en el disco) que no se debe usar
En mi opinión, en la columna de SQL puro id no es necesario y no debe utilizarse. Pero para frameworks ORM como Hibernate, administrar relaciones many-to-many no es simple con claves compuestas, etc., especialmente si join table tiene columnas adicionales.
Entonces, si voy a usar un marco ORM en el archivo db, prefiero colocar una columna de ID de incremento automático en esa tabla y una restricción única para las columnas de referencia. Y, por supuesto, una restricción no nula si es necesaria.
Luego trato la mesa como cualquier otra mesa en mi proyecto.
Asumiendo que ya eres un devoto de la clave sustituta (estás en buena compañía), hay un caso para hacer todo el camino.
Un punto clave que a veces se olvida es que las relaciones mismas pueden tener propiedades. A menudo no es suficiente decir que dos cosas están relacionadas; es posible que deba describir la naturaleza de esa relación. En otras palabras, no hay nada especial en una tabla de relaciones que dice que solo puede tener dos columnas.
Si estas tablas no tienen nada de especial, ¿por qué no tratarlo como en cualquier otra mesa y usar una clave sustituta? Si terminas teniendo que agregar propiedades a la tabla, agradecerás a tus afortunadas capas de presentación que no tienes que pasar una tecla compuesta para modificar esas propiedades.
Ni siquiera llamaría a esto una regla general, más como algo para considerar. En mi experiencia, una estrecha mayoría de las relaciones terminan llevando datos adicionales, esencialmente convirtiéndose en entidades en sí mismas, dignas de una clave sustituta.
El problema es que agregar estas claves después del hecho puede ser un problema. Si el costo de la columna y el índice adicionales vale el valor de adelantarse a este dolor de cabeza, eso realmente depende del proyecto.
En cuanto a mí, una vez mordido, dos veces tímido, busco la llave sustituta fuera de la puerta.