- Co jsou klíče?
- Jednoduché klávesy
- Zřetězené nebo složené klíče
- Primární klíče
- Číslení a automatické zvyšování
- Může tabulka obsahovat více primárních klíčů?
Zatímco mnoho vývojářů a správců databází může pracovat s primary keys
každý den je fascinujícím tématem ptát se sám sebe:„Co přesně je primary key
a může (nebo by měla) databázová tabulka obsahovat více primary keys
současně?“
Níže tyto otázky prozkoumáme podrobněji a pokusíme se dospět k rozumnému a obecně schválenému konsenzu v rámci vývojářské komunity.
Co jsou klíče?
Abychom pochopili, co je primary key
je v databázové tabulce, musíme nejprve trochu porozumět non-primary keys
. key
v tabulce je prostě atribut, který se používá k identifikaci a přístupu k těmto informacím. Tabulka může a často bude mít více klíčů, jako například v tabulce Users
oba email
a username
lze považovat za klíče.
V závislosti na vývojáři nebo správci, se kterým mluvíte, můžete slyšet o různých typech klíčů a jejich definicích, takže níže pokryjeme několik různých příkladů a základní definici každého z nich.
Jednoduché klávesy
simple key
je pouze klíč používající pouze jeden jediný atribut v tabulce. Pokud nezavedeme více omezení na klíč nebo tabulku, pak na username
atribut ve výše uvedeném příkladu je simple key
.
Zřetězené nebo složené klíče
O krok dále od simple keys
jsou concatenated
nebo compound
klíče. Jak název napovídá, concatenated key
je spojení více single keys
. Systém může například automaticky kombinovat last_name
a year_of_birth
single keys
do concatenated key
, třeba takto:smith1980
.
Primární klíče
A [primary key](https://en.wikipedia.org/wiki/Unique_key)
je klíč, který byl vybrán jako hlavní (nebo primární ) reprezentativní atribut pro daný řádek dat. primary key
je jedinečný a tento atribut je pak použit v celé databázi a je přístupný a předáván dalším tabulkám jako reprezentativní atribut pro daná data.
V praxi je to primary key
atribut je také označen jako NOT NULL
ve většině databází, což znamená, že atribut musí vždy obsahovat hodnotu pro záznam, který má být vložen do tabulky.
Například email
nebo username
simple keys
mohl být přiřazeno označení primary key
, ale obvykle je nejlepším postupem nastavit primary key
na atribut, který není (nebo nemohl) změnit ani obchodní logika, ani jednotlivec. Představte si například User
získá novou e-mailovou adresu, která pak způsobí všechny minulé primary key
přidružení vytvořená pomocí staré e-mailové adresy se při použití nové e-mailové adresy stanou neplatnými.
Z tohoto důvodu (mimo jiné) většina primary keys
použijte číslo nebo jedinečný řetězec, například [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)
.
Číslení a automatické zvyšování
Stručně také stojí za zmínku, že mnoho databázových systémů je nastaveno tak, že každá tabulka má primary key
který je jak číselný, tak se také automaticky zvyšuje. To jednoduše znamená, že databázový stroj sám automaticky přiřadí každému novému záznamu v této tabulce jedinečný primary key
hodnota, která je přírůstkově větší než všechny předchozí hodnoty. Většina vývojářů se však shoduje na tom, že tento postup je zastaralý a odhaluje zbytečné bezpečnostní chyby systému, když je použit pro některé tabulky, které představují určitá data.
Představte si například všechny User
záznamům je přiřazen automaticky inkrementovaný primary key
hodnota, známá jako id
atribut. Pokud osoba se zlými úmysly zjistí, že id
atribut daného uživatele (např. John Smith) je hodnota 1500
, to již odhaluje trochu informací. Za prvé, znamená to, že v systému je pravděpodobně minimálně 1499 dalších uživatelů nebo v určitém okamžiku byli. Znamená to také, že pokud lze na uživatelskou stránku Johna Smitha přistupovat prostřednictvím adresy URL nebo volání API, které obsahuje toto id
hodnotu 1500
, pak je velká šance jednoduše změnit hodnotu na jiné číslo, například 1499
nebo 1501
, zobrazí stránku jiného uživatele, který možná nebude chtít, aby jeho stránka přistupovala tímto návštěvníkem. Tímto způsobem lze záznamy vyhledávat pouhým hádáním id
hodnoty v masovém měřítku.
Toto jsou samozřejmě velmi jednoduché příklady, ale z těchto důvodů bude většina moderních databází používat náhodný a jedinečný primary key
hodnota atributu, jako je UUID
při práci s citlivými daty.
Může tabulka obsahovat více primárních klíčů?
Krátká odpověď je ne , tabulka nesmí obsahovat více primary keys
, protože to odporuje základním principům návrhu relační databáze (viz:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation)
a [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form)
).
Je tabulka může mít více candidate keys
, které se efektivně chovají podobně jako primary key
v tom candidate key
je jedinečný, NOT NULL
, a je singulární reprezentací tohoto záznamu tabulky.
Když však přijde na výběr, který jeden atribut bude přiřazen jako primary key
pro tabulku výběr pochází ze seznamu všech potenciálních candidate keys
(odtud název, jsou kandidáty na to, aby se staly primary key
). Nakonec pouze jeden candidate key
je vybrán jako nejlepší reprezentativní atribut pro daný záznam, který má být v této tabulce použit jako primary key
a odkazované jinde v databázi jinými tabulkami prostřednictvím jejich příslušných foreign keys
.