Mam tabelę z czterema kolumnami, których wszystkie nie są wartościami zerowymi, a dane są takie, że wszystkie cztery są potrzebne do odróżnienia unikalnego rekordu. Oznacza to, że gdybym utworzył klucz podstawowy, musiałby on zawierać wszystkie kolumny. Zapytania do tabeli prawie zawsze będą polegały na wyciągnięciu jednego rekordu, tzn. Wszystkie kolumny zostaną przefiltrowane w zapytaniu.
Ponieważ każda kolumna będzie musiała zostać przeszukana, czy posiadanie klucza podstawowego w ogóle mi się przydaje (oprócz wymuszania unikalności rekordów)?
źródło
Zazwyczaj zaleca się posiadanie klucza zastępczego w takich sytuacjach, więc klucze obce w innych tabelach (i wszelkie odniesienia do rekordów, które mogą być przechowywane zewnętrznie, na przykład jeśli są one przenoszone na ciągi zapytań, w których żądanie http (s) odnosi się do jednego rekordów) mają coś do odniesienia, co nie zmieni się, jeśli zmienią się dane w wierszu. Jeśli to zrobisz, będzie to Twój klucz podstawowy.
Jeśli nie dodasz takiego klucza zastępczego, biorąc pod uwagę, jak opisujesz dostęp do danych, mając wszystkie cztery kolumny jako klucz podstawowy, nie będzie to niekorzystne. Jeśli uczynisz klucz indeksem klastrowym dla tabeli, pomoże to takim żądaniom, ponieważ będzie jeden poziom w b-drzewie na dysku, aby przejść w dół, aby znaleźć dane dla danego wiersza.
źródło
Klucze złożone jako klucze podstawowe również napotykają problemy z rozmiarem indeksu, które mogą wpływać na użycie dysku, prędkości io i kopie zapasowe. Możesz przejrzeć posty Kimberly Tripp na temat kluczy podstawowych i indeksów klastrowych tutaj: http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx
Ja również sugerowałbym klucz zastępczy w tym przypadku zamiast klucza naturalnego.
źródło
Jeśli masz tabelę reprezentującą relację wiele do wielu, która ma tylko 2 kolumny, wydaje się to rozsądne.
Por. to SO pytanie
Przyznaję jednak, że dodam klucze zastępcze nawet w tych przypadkach.
źródło