- Wat zijn sleutels?
- Eenvoudige toetsen
- Aaneengeschakelde of samengestelde toetsen
- Primaire toetsen
- Nummering en automatisch ophogen
- Kan een tabel meerdere primaire sleutels bevatten?
Hoewel veel ontwikkelaars en databasebeheerders kunnen werken met primary keys
elke dag is het een fascinerend onderwerp om jezelf af te vragen:"Wat precies is een primary key
en kan (of moet) een databasetabel meerdere primary keys
bevatten tegelijkertijd?”
Hieronder zullen we deze vragen in meer detail onderzoeken en proberen te komen tot de redelijke en algemeen overeengekomen consensus binnen de ontwikkelingsgemeenschap.
Wat zijn sleutels?
Om te begrijpen wat een primary key
in een databasetabel staat, moeten we eerst een beetje begrijpen over non-primary keys
. Een key
in een tabel is gewoon een attribuut dat wordt gebruikt om die informatie te identificeren en te openen. Een tabel kan en zal vaak meerdere sleutels hebben, zoals in de tabel Users
beide email
en username
kunnen als sleutels worden beschouwd.
Afhankelijk van de ontwikkelaar of beheerder met wie je spreekt, hoor je misschien over verschillende sleuteltypen en hun definities, dus we zullen hieronder een paar verschillende voorbeelden bespreken en een basisdefinitie van elk.
Eenvoudige toetsen
Een simple key
is slechts een sleutel die slechts één enkel kenmerk in de tabel gebruikt. Tenzij we meer beperkingen opleggen aan de sleutel of de tabel, dan is de username
attribuut in het bovenstaande voorbeeld is een simple key
.
Aaneengeschakelde of samengestelde sleutels
Nog een stap verder dan simple keys
zijn concatenated
of compound
sleutels. Zoals de naam al aangeeft, een concatenated key
is een samenvoeging van meerdere single keys
. Het systeem kan bijvoorbeeld automatisch de last_name
. combineren en year_of_birth
single keys
in een concatenated key
, zoals zo:smith1980
.
Primaire sleutels
Een [primary key](https://en.wikipedia.org/wiki/Unique_key)
is een sleutel die is gekozen als de principal (of primary ) representatief attribuut voor die rij gegevens. De primary key
is uniek en dat attribuut wordt vervolgens door de hele database gebruikt en wordt geopend en doorgegeven aan andere tabellen als het representatieve attribuut voor de gegevens in kwestie.
In de praktijk zal de primary key
attribuut is ook gemarkeerd als NOT NULL
in de meeste databases, wat betekent dat het attribuut altijd een waarde moet bevatten om het record in de tabel in te voegen.
Als voorbeeld, ofwel de email
of username
simple keys
zou de aanduiding van de primary key
krijgen , maar meestal is het de beste gewoonte om de primary key
. in te stellen naar een attribuut dat niet (of niet) kan worden gewijzigd door de bedrijfslogica of zelfs door het individu. Stel je bijvoorbeeld een User
. voor krijgt een nieuw e-mailadres, waardoor alle eerdere primary key
associaties die zijn gemaakt met het oude e-mailadres worden ongeldig bij gebruik van het nieuwe e-mailadres.
Om deze reden (onder andere) zijn de meeste primary keys
gebruik een nummer of unieke tekenreeks, zoals een [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)
.
Nummering en automatisch verhogen
Het is ook kort vermeldenswaard dat veel databasesystemen zo zijn opgezet dat elke tabel een primary key
heeft. dat is zowel numeriek als automatisch verhoogd. Dit betekent simpelweg dat de database-engine zelf automatisch elk nieuw record in die tabel een unieke primary key
toewijst. waarde die stapsgewijs groter is dan alle voorgaande waarden. De meeste ontwikkelaars zijn het er echter over eens dat deze praktijk verouderd is en onnodige beveiligingsfouten blootlegt voor het systeem wanneer het voor sommige wordt gebruikt. tabellen die bepaalde gegevens vertegenwoordigen.
Stel je bijvoorbeeld alle Users
. voor records krijgen een automatisch oplopende primary key
waarde, bekend als de id
attribuut. Als een kwaadwillende ontdekt dat de id
attribuut van een bepaalde gebruiker (bijv. John Smith) is de waarde 1500
, dit onthult al een beetje informatie. Ten eerste geeft het aan dat er waarschijnlijk minimaal 1499 andere gebruikers in het systeem zijn, of ooit waren. Het betekent ook dat als de gebruikerspagina van John Smith toegankelijk is via een URL of API-aanroep die die id
bevat waarde van 1500
, dan is de kans groot dat je de waarde eenvoudig verandert in een ander getal, zoals 1499
of 1501
, zal de pagina van een andere gebruiker blootleggen die misschien niet wil dat zijn pagina door deze bezoeker wordt geopend. Op deze manier kunnen records worden opgevraagd door simpelweg te gissen de id
waarden op massaschaal.
Dit zijn uiteraard zeer eenvoudige voorbeelden, maar om deze redenen zullen de meeste moderne databases een gerandomiseerde en unieke primary key
gebruiken. attribuutwaarde zoals een UUID
bij het werken met gevoelige gegevens.
Kan een tabel meerdere primaire sleutels bevatten?
Het korte antwoord is nee , een tabel mag niet meerdere primary keys
bevatten , omdat dat indruist tegen de fundamentele principes van relationeel databaseontwerp (zie:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation)
en [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form)
).
Het is mogelijk voor een tabel om meerdere candidate keys
te hebben , die zich effectief gedragen als een primary key
in dat een candidate key
is uniek, NOT NULL
, en is een enkelvoudige weergave van dat tabelrecord.
Als het echter gaat om het selecteren van welke een attribuut wordt toegewezen als de primary key
voor de tabel komt de keuze uit de lijst met alle potentiële candidate keys
(vandaar de naam, ze zijn kandidaten om een primary key
te worden ). Uiteindelijk slechts één candidate key
is geselecteerd als het beste representatieve attribuut voor dat record, om in deze tabel te worden gebruikt als de primary key
en waarnaar elders in de database wordt verwezen door andere tabellen via hun respectievelijke foreign keys
.