Esta pregunta surge después de leer un comentario en esta pregunta:
Cuando crea una tabla de muchos a muchos, debe crear una clave primaria compuesta en las dos columnas de clave externa, o crear una clave primaria "ID" sustituta de incremento automático, y simplemente colocar índices en sus dos columnas FK (y tal vez una restricción única)? ¿Cuáles son las implicaciones en el rendimiento para insertar nuevos registros / reindexar en cada caso?
Básicamente, esto:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
vs. esto:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
El comentarista dice:
hacer que las dos ID sean PK significa que la tabla está físicamente ordenada en el disco en ese orden. Entonces, si insertamos (Parte1 / Dispositivo1), (Parte1 / Dispositivo2), (Parte2 / Dispositivo3), entonces (Parte 1 / Dispositivo3) la base de datos tendrá que separar la tabla e insertar la última entre las entradas 2 y 3. Para muchos registros, esto se vuelve muy problemático ya que implica mezclar cientos, miles o millones de registros cada vez que se agrega uno. Por el contrario, una PK de autoincremento permite que los nuevos registros se agreguen hasta el final.
La razón por la que pregunto es porque siempre me he inclinado a hacer la clave primaria compuesta sin una columna de incremento automático sustituto, pero no estoy seguro de si la clave sustituta es realmente más eficaz.
fuente
Respuestas:
Con un mapeo simple de dos columnas de muchos a muchos, no veo ninguna ventaja real de tener una clave sustituta. Tener una clave primaria activada
(col1,col2)
es única (suponiendo que sus valorescol1
ycol2
en las tablas referenciadas sean únicos) y un índice separado(col2,col1)
detectará aquellos casos en los que el orden opuesto se ejecutaría más rápido. El sustituto es una pérdida de espacio.No necesitará índices en las columnas individuales ya que la tabla solo debe usarse para unir las dos tablas referenciadas.
El comentario al que hace referencia en la pregunta no vale los electrones que usa, en mi opinión. Parece que el autor piensa que la tabla está almacenada en una matriz en lugar de una estructura de árbol de múltiples vías equilibrada de rendimiento extremadamente alto.
Para empezar, nunca es necesario almacenar u ordenar la tabla , solo el índice. Y el índice no se almacenará secuencialmente, se almacenará de manera eficiente para poder recuperarlo rápidamente.
Además, la gran mayoría de las tablas de la base de datos se leen con mucha más frecuencia que las escritas. Eso hace que todo lo que haga en el lado de selección sea mucho más relevante que cualquier cosa en el lado de inserción.
fuente
insert
que importará si se hace miles de veces por hora. No puede simplemente ignorarlo solo porque la relación deinsert
aselect
es <1. En este caso, un cliente se preocupa por cuánto tiempo lleva hacer un pedido.No se necesita una clave sustituta para las tablas de enlaces.
Una PK activada (col1, col2) y otro índice único activado (col2, col1) es todo lo que necesita
A menos que utilice un ORM que no puede hacer frente y dicta el diseño de su base de datos para usted ...
Editar: Respondí lo mismo aquí: SQL: ¿Necesita una clave primaria incremental automática para las tablas Muchos-Muchos?
fuente
(col2, col1)
no es(col1, col2)
. El PK de(col1, col2)
puede no ser adecuado para todas las consultas y generar escaneos, por lo que tener el reverso de eso mejora el rendimiento porque permite búsquedas donde col2 es mejor. Por ejemplo, validación FK cuando la tabla con col2 tiene una eliminación. Se verificará la tabla secundaria de niñosPodría ser necesaria una clave primaria incremental si se hace referencia a la tabla. Puede haber detalles en la tabla de muchos a muchos que debían extraerse de otra tabla utilizando la clave primaria incremental.
por ejemplo
Es fácil extraer los 'Otros detalles' usando PartDevice.ID como FK. Por lo tanto, se necesita el uso de la clave primaria incremental.
fuente
La forma más corta y directa en que puedo responder a su pregunta es decir que habrá un impacto en el rendimiento si las dos tablas que está vinculando no tienen claves primarias secuenciales. Como indicó / citó, el índice de la tabla de enlaces se fragmentará o el DBMS trabajará más duro para insertar registros si la tabla de enlaces no tiene su propia clave primaria secuencial. Esta es la razón por la cual la mayoría de las personas colocan una clave primaria de incremento secuencial en las tablas de enlaces.
fuente
Entonces parece que si el ÚNICO trabajo es vincular las dos tablas, la mejor PK sería la PK de doble columna.
Pero si sirve para otros fines, agregue otro NDX como PK con claves foráneas y un segundo índice único.
Index o PK es la mejor manera de asegurarse de que no haya duplicados. PK permite que herramientas como Microsoft Management Studio hagan parte del trabajo (crear vistas) por usted
fuente