Powiedz, że {Author, Title, Edition}
jednoznacznie identyfikuje książkę, wówczas obowiązuje następujący zapis:
-
Jest to superklucz — jednoznacznie identyfikuje krotkę (wiersz).
-
Jest nieredukowalny — usunięcie którejkolwiek z kolumn nie czyni z niej już klucza.
-
Jest to klucz kandydujący — nieredukowalny superklucz jest kluczem kandydującym.
Rozważmy teraz identyfikator (liczba całkowita)
Mogę stwierdzić, że Book
klucz tabeli pojawi się w kilku innych tabelach jako klucz obcy, a także w kilku indeksach. Tak więc zajmie to sporo miejsca – powiedzmy trzy kolumny x 40 znaków (lub cokolwiek…) – w każdej z tych tabel plus pasujące indeksy.
Aby zmniejszyć te „inne” tabele i indeksy, mogę dodać unikatową kolumnę całkowitą do Book
tabela, która ma być używana jako klucz, do którego odwołuje się klucz obcy. Powiedz coś takiego:
alter table Book add BookID integer not null identity;
Z BookID
będąc (musi być) również unikalnym, Book
tabela ma teraz dwa klucze kandydujące.
Teraz mogę wybrać BookID
jako klucz podstawowy.
alter table Book add constraint pk_Book primary key (BookID);
Jednak {Author,Title,Edition}
musi pozostań kluczem (unikalny), aby zapobiegać coś takiego:
BookID Author Title Edition
-----------------------------------------------
1 C.J.Date Database Design 1
2 C.J.Date Database Design 1
Podsumowując, dodając BookID
-- i wybranie go jako podstawowego -- nie powstrzymało {Author, Title, Edition}
bycie kluczem (kandydata). Wciąż musi mieć swoje własne unikalne ograniczenie i zwykle pasujący indeks.
Należy również zauważyć, że z punktu projektowego decyzja ta została podjęta na „poziomie fizycznym”. Ogólnie rzecz biorąc, na logicznym poziomie projektu ten ID
nie istnieje — został wprowadzony podczas rozpatrywania rozmiarów kolumn i indeksów. Tak więc schemat fizyczny został wyprowadzony z logicznego. W zależności od rozmiaru bazy danych, RDBMS i używanego sprzętu, żadne z tych uzasadniających rozmiar nie może mieć wymiernego efektu - więc użyj {Author, Title, Edition}
jako PK może być doskonale dobrym projektem - dopóki nie zostanie udowodnione inaczej.