Dì che {Author, Title, Edition}
identifica univocamente un libro, quindi vale quanto segue:
-
È una superchiave -- identifica in modo univoco una tupla (riga).
-
È irriducibile:la rimozione di una qualsiasi delle colonne non la rende più una chiave.
-
È una chiave candidata -- una superchiave irriducibile è una chiave candidata.
Consideriamo ora l'ID (intero)
Posso argomentare che il Book
la chiave della tabella apparirà in poche altre tabelle come chiave esterna e anche in alcuni indici. Quindi, ci vorrà un bel po' di spazio -- diciamo tre colonne x 40 caratteri (o qualsiasi altra cosa...) -- in ciascuna di queste tabelle più negli indici corrispondenti.
Per rimpicciolire queste "altre" tabelle e indici, posso aggiungere una colonna intera univoca al Book
tabella da utilizzare come chiave a cui verrà fatto riferimento come chiave esterna. Dì qualcosa come:
alter table Book add BookID integer not null identity;
Con BookID
essendo (deve essere) anche unico, il Book
la tabella ora ha due chiavi candidate.
Ora posso selezionare il BookID
come chiave primaria.
alter table Book add constraint pk_Book primary key (BookID);
Tuttavia, il {Author,Title,Edition}
deve rimanere una chiave (univoca) per prevenire qualcosa del genere:
BookID Author Title Edition
-----------------------------------------------
1 C.J.Date Database Design 1
2 C.J.Date Database Design 1
Per riassumere, aggiungendo il BookID
-- e scegliendolo come principale -- non ha interrotto {Author, Title, Edition}
essere una chiave (candidato). Deve comunque avere il proprio vincolo univoco e di solito l'indice corrispondente.
Si noti inoltre che dal punto di vista della progettazione, questa decisione è stata presa a "livello fisico". In generale, a livello logico di progettazione, questo ID
non esiste -- è stato introdotto durante la considerazione delle dimensioni e degli indici delle colonne. Quindi, lo schema fisico è stato derivato da quello logico. A seconda della dimensione del DB, dell'RDBMS e dell'hardware utilizzato, nessuno di questi ragionamenti sulle dimensioni potrebbe avere effetti misurabili, quindi utilizzando {Author, Title, Edition}
poiché un PK può essere un design perfettamente valido, fino a quando non viene dimostrato diversamente.