sql >> Database teknologi >  >> RDS >> Mysql

Under hvilken betingelse skal vi bruge sammensatte nøgler i databasen

Sammensatte nøgler bør aldrig overvejes i "nye" applikationer. De blev brugt tidligere af folk, der plejede at tro, at "forretningsnøgler" er bedre end "surrogatnøgler".

Edit:Som spurgt af Chris, udvider jeg mit svar.

Lad mig starte med at sige, at jeg forstår dette spørgsmål som "sammensatte primærnøgler" vs. "surrogatnøgler".

Jeg indrømmer også, at der er en brugstilfælde, hvor en sammensat nøgle giver mening:i krydsreferencetabeller, også kaldet "linktabeller". Disse bruges i mange-til-mange tabeller og består kun af to felter, begge fremmednøgler, der danner en primær nøgle til xref-tabellen. For eksempel UserRole tabel ville indeholde user_id og role_id , intet andet. Der er ingen klasserepræsentation i Java, for eksempel for en tabel som denne. Dette er normalt en @ManyToMany , med en Collection i begge sider.

Jeg delte mine synspunkter om naturlige nøgler vs. surrogatnøgler i et andet svar ( Hibernate:Meninger i Composite PK vs Surrogate PK ), og jeg mener, at sammensatte nøgler deler nogle af ulemperne ved den naturlige nøgle uden at bringe nogen reel fordel.

Problemet med sammensatte nøgler er, at du skal bruge to værdier for entydigt at identificere en post. Dette bliver et problem, når du begynder at have tabeller, der refererer til poster i denne første tabel. Den anden tabel skal derefter bruge to kolonner for at kunne henvise til én optage. Og hvis denne anden tabel bruger en sammensat nøgle, der består af en enkelt værdi + fremmednøglen, har du nu tre kolonner for entydigt at identificere én optage. Og et tredje bord ville have brug for disse tre ekstra kolonner bare for at henvise til én rekord i den anden tabel. Virkelig, dette er en snebold.

En anden ulempe er, at kravene gør lave om. Hele tiden. Så hvad der ser ud til at være en god sammensat nøgle i dag, er slet ikke en nøgle i morgen. Det er derfor, vi har surrogatnøgler:at være fremtidssikret.

Sammensatte nøgler bruges hovedsageligt, så poster i en tabel er unikke baseret på et sæt kolonner. For eksempel, hvis du har en Customers tabel, kan du have et NationalId +Country som en unik værdi, hvilket betyder, at to brugere ikke kan dele det samme SSN, hvis deres land er USA. Men det er muligt at have samme nummer for to plader, hvis de ikke er i samme land. Hvis du kan lide sammensatte nøgler, ville dette være en god kandidat til det. Men som jeg antydede tidligere, kan du bruge en surrogatnøgle og anvende en unique begrænsning. Du får fordelene ved en sammensat nøgle plus sikkerheden ved en surrogatnøgle.



  1. Tilføj tabelnavn til hver kolonne i et resultatsæt i SQL? (Postgres specifikt)

  2. ASP.NET Web Forms og MySql Entity Framework:Indlejrede transaktioner understøttes ikke

  3. uploade flere billedfiler til php mysql galleri

  4. Sådan forespørges på hugeblob-data