Samengestelde sleutels mogen nooit worden overwogen in "nieuwe" toepassingen. Ze werden in het verleden gebruikt door mensen die dachten dat 'zakelijke sleutels' beter waren dan 'surrogaatsleutels'.
Bewerken:zoals gevraagd door Chris, breid ik mijn antwoord uit.
Laat ik beginnen met te stellen dat ik deze vraag begrijp als "Samengestelde primaire sleutels" versus "surrogaatsleutels".
Ik geef ook toe dat er één . is use case waar een samengestelde sleutel zinvol is:in kruisverwijzingstabellen, ook wel "linktabellen" genoemd. Deze worden gebruikt in veel-op-veel tabellen en bestaan uit slechts twee velden, beide refererende sleutels die een primaire sleutel vormen voor de xref-tabel. Bijvoorbeeld UserRole
tabel zou user_id
. bevatten en role_id
, niks anders. Er is bijvoorbeeld geen klassenweergave in Java voor een tabel als deze. Dit is meestal een @ManyToMany
, met een Collection
aan beide kanten.
Ik deelde mijn mening over natuurlijke sleutels versus surrogaatsleutels in een ander antwoord ( Hibernate:meningen in samengestelde PK versus surrogaat PK ) , en ik geloof dat Composite-sleutels enkele van de nadelen van de natuurlijke sleutel delen, zonder enig echt voordeel te bieden.
Het probleem met samengestelde sleutels is dat je twee . nodig hebt waarden om een record uniek te identificeren. Dit wordt een probleem zodra u tabellen begint te gebruiken die verwijzen naar records in deze eerste tabel. De tweede tafel heeft dan twee . nodig kolommen om te kunnen verwijzen naar één dossier. En als deze tweede tabel een samengestelde sleutel gebruikt die bestaat uit een enkele waarde + de externe sleutel, heb je nu drie kolommen om één uniek te identificeren dossier. En een derde tafel zou deze drie nodig hebben extra kolommen om te verwijzen naar één noteren in de tweede tabel. Echt, dit is een sneeuwbal.
Een ander nadeel is dat vereisten doen Wijzigen. Altijd. Dus wat vandaag een goede samengestelde sleutel lijkt, is morgen helemaal geen sleutel. Daarom hebben we surrogaatsleutels:om toekomstbestendig te zijn.
Samengestelde sleutels worden voornamelijk gebruikt zodat records in een tabel uniek zijn op basis van een set kolommen. Als u bijvoorbeeld een Customers
. heeft tabel, heeft u mogelijk een NationalId
+Country
als een unieke waarde, wat betekent dat twee gebruikers niet hetzelfde SSN kunnen delen als hun land de VS is. Maar het is mogelijk om hetzelfde nummer te hebben voor twee records, als ze zich niet in hetzelfde land bevinden. Als je van samengestelde sleutels houdt, zou dit een goede kandidaat hiervoor zijn. Maar zoals ik eerder al liet doorschemeren, kun je een surrogaatsleutel gebruiken en een unique
. toepassen beperking. U profiteert van de voordelen van een samengestelde sleutel plus de veiligheid van een surrogaatsleutel.