sql >> Databasteknik >  >> RDS >> Mysql

Under vilka förutsättningar måste vi använda sammansatta nycklar i databasen

Sammansatta nycklar bör aldrig övervägas i "nya" applikationer. De användes förr, av människor som brukade tro att "affärsnycklar" är bättre än "surrogatnycklar".

Edit:Som Chris frågade, utökar jag mitt svar.

Låt mig börja med att säga att jag förstår denna fråga som "sammansatta primärnycklar" kontra "surrogatnycklar".

Jag medger också att det finns en användningsfall där en sammansatt nyckel är vettig:i korsreferenstabeller, även kallade "länktabeller". Dessa används i många-till-många-tabeller och består endast av två fält, båda främmande nycklar som utgör en primärnyckel för xref-tabellen. Till exempel UserRole Tabell skulle innehålla user_id och role_id , inget annat. Det finns ingen klassrepresentation i Java, till exempel, för en tabell som denna. Detta är vanligtvis en @ManyToMany , med en Collection på båda sidor.

Jag delade mina åsikter om naturliga nycklar vs surrogatnycklar i ett annat svar ( Hibernate :Åsikter i Composite PK vs Surrogate PK ) , och jag tror att Composite keys delar några av nackdelarna med den naturliga nyckeln, utan att ge någon verklig fördel.

Problemet med sammansatta nycklar är att du behöver två värden för att unikt identifiera en post. Detta blir ett problem när du börjar ha tabeller som refererar till poster i den här första tabellen. Den andra tabellen behöver då två kolumner för att kunna referera till en spela in. Och om den här andra tabellen använder en sammansatt nyckel som består av ett enda värde + den främmande nyckeln, har du nu tre kolumner för att unikt identifiera en spela in. Och ett tredje bord skulle behöva dessa tre extra kolumner bara för att referera till en rekord i den andra tabellen. Verkligen, det här är en snöboll.

En annan nackdel är att krav gör förändra. Hela tiden. Så vad som verkar vara en bra sammansatt nyckel idag är inte en nyckel alls i morgon. Det är därför vi har surrogatnycklar:att vara framtidssäker.

Sammansatta nycklar används huvudsakligen så att poster i en tabell är unika baserat på en uppsättning kolumner. Till exempel, om du har en Customers tabell kan du ha ett NationalId +Country som ett unikt värde, vilket innebär att två användare inte kan dela samma SSN om deras land är USA. Men det är möjligt att ha samma nummer för två skivor, om de inte är i samma land. Om du gillar sammansatta nycklar skulle detta vara en bra kandidat för det. Men som jag antydde tidigare kan du använda en surrogatnyckel och använda en unique begränsning. Du kommer att ha fördelarna med en sammansatt nyckel plus säkerheten med en surrogatnyckel.



  1. Hur upprätthåller man en begränsning av främmande nyckel från orelaterade tabeller i Mysql?

  2. Hämta antalet siffror efter decimalkomma för ett flyt (med eller utan decimaldel)

  3. MySQL CHAR() vs T-SQL CHAR():Vad är skillnaden?

  4. Oracle pl-sql escape-tecken (för en ' )