Questa domanda viene fuori dopo aver letto un commento in questa domanda:
Quando crei una tabella molti-a-molti, dovresti creare una chiave primaria composita sulle due colonne della chiave esterna, o creare una chiave primaria "ID" surrogata con incremento automatico e inserire semplicemente gli indici nelle due colonne FK (e forse un vincolo unico)? Quali sono le implicazioni sulle prestazioni per l'inserimento di nuovi record / la reindicizzazione in ogni caso?
Fondamentalmente, questo:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
contro questo:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Il commentatore dice:
rendere i due ID PK significa che la tabella è fisicamente ordinata sul disco in quell'ordine. Quindi, se inseriamo (Part1 / Device1), (Part1 / Device2), (Part2 / Device3), allora (Part 1 / Device3) il database dovrà separare la tabella e inserire l'ultima tra le voci 2 e 3. Per molti record, questo diventa molto problematico in quanto comporta lo spostamento di centinaia, migliaia o milioni di record ogni volta che ne viene aggiunto uno. Al contrario, un PK autoincrementante consente di attaccare i nuovi record alla fine.
Il motivo per cui lo chiedo è perché sono sempre stato propenso a fare la chiave primaria composita senza colonna di incremento automatico surrogato, ma non sono sicuro che la chiave surrogata sia effettivamente più performante.