Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Chiave primaria composita vs colonna ID aggiuntiva?

Dì che {Author, Title, Edition} identifica univocamente un libro, quindi vale quanto segue:

  1. È una superchiave -- identifica in modo univoco una tupla (riga).

  2. È irriducibile:la rimozione di una qualsiasi delle colonne non la rende più una chiave.

  3. È 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.