sql >> Databasteknik >  >> RDS >> Sqlserver

Sammansatt primär nyckel kontra ytterligare ID-kolumn?

Säg att {Author, Title, Edition} identifierar en bok unikt, då gäller följande:

  1. Det är en supernyckel -- identifierar unikt en tuppel (rad).

  2. Det går inte att reducera – att ta bort någon av kolumnerna gör det inte längre till en nyckel.

  3. Det är en kandidatnyckel -- en irreducerbar supernyckel är en kandidatnyckel.

Låt oss nu överväga ID (heltal)

Jag kan resonera att Book tabellnyckel kommer att dyka upp i några andra tabeller som en främmande nyckel och även i några få index. Så det kommer att ta ganska lite utrymme -- säg tre kolumner x 40 tecken (eller vad som helst...) -- i var och en av dessa tabeller plus i matchande index.

För att göra dessa "andra" tabeller och index mindre kan jag lägga till en unik heltalskolumn i Book tabell som ska användas som en nyckel som kommer att refereras till som en främmande nyckel. Säg något i stil med:

alter table Book add BookID integer not null identity;

Med BookID är (måste vara) unik också, Book Tabellen har nu två kandidatnycklar.

Nu kan jag välja BookID som en primärnyckel.

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

Men {Author,Title,Edition} måste förbli en nyckel (unik) för att förebygga något sånt här:

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

För att sammanfatta det, lägg till BookID -- och att välja det som primärt -- stoppade inte {Author, Title, Edition} vara en (kandidat)nyckel. Det måste fortfarande ha sin egen unika begränsning och vanligtvis det matchande indexet.

Observera också att från designpunkten gjordes detta beslut på den "fysiska nivån". I allmänhet, på den logiska nivån av design, detta ID existerar inte -- det introducerades under övervägande av kolumnstorlekar och index. Så det fysiska schemat härleddes från det logiska. Beroende på DB-storlek, RDBMS och hårdvara som används, kan inget av dessa storleksresonemang ha mätbar effekt -- så använd {Author, Title, Edition} som en PK kan vara helt bra design -- tills det bevisats annorlunda.



  1. Motsvarar LIMIT och OFFSET för SQL Server?

  2. SQL Server - definierar en XML-typkolumn med UTF-8-kodning

  3. Varför är logiska läsningar för aggregerade fönsterfunktioner så höga?

  4. Operatör