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

Sammensat primær nøgle versus yderligere id-kolonne?

Sig det {Author, Title, Edition} identificerer en bog unikt, så gælder følgende:

  1. Det er en supernøgle -- identificerer entydigt en tupel (række).

  2. Det er irreducerbart -- fjernelse af nogen af ​​kolonnerne gør det ikke længere til en nøgle.

  3. Det er en kandidatnøgle -- en irreducerbar supernøgle er en kandidatnøgle.

Lad os nu overveje ID'et (heltal)

Jeg kan begrunde, at Book tabelnøgle vil dukke op i få andre tabeller som en fremmednøgle og også i få indekser. Så det vil tage en del plads -- f.eks tre kolonner x 40 tegn (eller hvad som helst...) -- i hver af disse tabeller plus i matchende indekser.

For at gøre disse "andre" tabeller og indekser mindre, kan jeg tilføje en unik-heltal-kolonne til Book tabel, der skal bruges som en nøgle, der vil blive refereret til som en fremmednøgle. Sig noget som:

alter table Book add BookID integer not null identity;

Med BookID er (skal også være) unik, Book tabellen har nu to kandidatnøgler.

Nu kan jeg vælge BookID som en primær nøgle.

alter table Book add constraint pk_Book primary key (BookID);

Men {Author,Title,Edition} skal forbliv en nøgle (unik) for at forhindre noget som dette:

BookID  Author      Title           Edition
-----------------------------------------------
  1      C.J.Date  Database Design     1
  2      C.J.Date  Database Design     1

For at opsummere det, tilføje BookID -- og at vælge det som det primære -- stoppede ikke {Author, Title, Edition} være en (kandidat)nøgle. Det skal stadig have sin egen unikke begrænsning og normalt det matchende indeks.

Bemærk også, at fra designpunktet blev denne beslutning taget på det "fysiske plan". Generelt, på det logiske designniveau, er dette ID eksisterer ikke -- det blev introduceret under overvejelsen af ​​kolonnestørrelser og indekser. Så det fysiske skema blev afledt af det logiske. Afhængigt af DB-størrelsen, RDBMS og den anvendte hardware, kan ingen af ​​disse størrelsesbegrundelser have målbar effekt -- så brug {Author, Title, Edition} som en PK kan være et perfekt design -- indtil det er bevist anderledes.



  1. En guide til MariaDB Columnstore for MySQL-administratorer

  2. Grundlæggende om sys.dm_exec_requests

  3. Sådan formateres tal i PostgreSQL

  4. Hvordan overfører man XML fra C# til en lagret procedure i SQL Server 2008?