To pytanie pojawia się po przeczytaniu komentarza do tego pytania:
Tworząc tabelę „wiele do wielu”, należy utworzyć złożony klucz podstawowy na dwóch kolumnach klucza obcego, czy też utworzyć zastępczy klucz podstawowy „ID” z automatyczną inkrementacją i po prostu umieścić indeksy w dwóch kolumnach FK (i być może unikalne ograniczenie)? Jakie są konsekwencje dla wydajności wstawiania nowych rekordów / ponownego indeksowania w każdym przypadku?
Zasadniczo to:
PartDevice
----------
PartID (PK/FK)
DeviceID (PK/FK)
w porównaniu z tym:
PartDevice
----------
ID (PK/auto-increment)
PartID (FK)
DeviceID (FK)
Komentator mówi:
uczynienie dwóch identyfikatorów PK oznacza, że tabela jest fizycznie sortowana na dysku w tej kolejności. Więc jeśli wstawimy (Part1 / Device1), (Part1 / Device2), (Part2 / Device3), to (Part 1 / Device3) baza danych będzie musiała rozdzielić tabelę i wstawić ostatnią pomiędzy wpisy 2 i 3. Dla wielu rekordów, staje się to bardzo problematyczne, ponieważ wiąże się z tasowaniem setek, tysięcy lub milionów rekordów za każdym razem, gdy jest dodawany. Z kolei autoinkrementacja PK pozwala na dopięcie nowych rekordów do końca.
Pytam o to, że zawsze skłaniałem się do tworzenia złożonego klucza podstawowego bez zastępczej kolumny autoinkrementacji, ale nie jestem pewien, czy klucz zastępczy jest rzeczywiście bardziej wydajny.