Rady odborníka

### Pokrytí cizích klíčů indexem

Cizí klíč se používá k logickému propojení páru tabulek a omezení změn, které lze na nich provádět.

Vše začíná hlavní tabulkou, která bude odkazovanou tabulkou. Musí mít primární klíč (přesněji odkazovaný sloupec nesmí obsahovat prázdné hodnoty a musí být pokrytý jedinečným indexem, ale je skutečně dobrým pravidlem, abyste v ní měli primární index). Podřízená tabulka závisí na hlavní tabulce, což dává tušit, že sloupce, na kterých je cizí klíč vytvořený, musí odpovídat hlavní tabulce pro každý vkládaný nebo aktualizovaný klíč. Podřízená tabulka je odkazující tabulkou cizího klíče.

Cizí klíče omezují nejen odkazující tabulku, ale i odkazovanou tabulku. Druhy omezení mohou být RESTRICT, CASCADE nebo SET NULL. Znamená to, že když se změní řádek v hlavní/odkazované tabulce (aktualizací nebo smazáním), všechny odkazující tabulky jsou zkontrolované, jestli je operace platná a pokud ano, provedou se určité dodatečné akce. Podrobnosti najdete v dokumentaci k PostgreSQL.

Důsledkem je, že pokud se k nějakému řádku v odkazované tabulce přistupuje kvůli změně, provádí se následně čtení odpovídajících řádků ve všech odkazujících tabulkách, přičemž se použije sloupec s cizím klíčem pro určení toho správného řádku. Proto by se pro tyto sloupce měla brát v úvahu pravidla návrhu ovlivňující výkon. Ve většině případů je doporučeno použít index. PostgreSQL to vyloženě nevyžaduje, proto zůstává na návrháři tabulky, aby se o to postaral.

Pro větší pohodlí poskytuje pgAdmin III při vytváření cizího klíče jednoduchý přepínač, který automaticky zkontroluje přítomnost použitelných indexů a pokud žádný nenajde, tak jeden vytvoří. Tak jako u všech indexů, jsou výjimečné případy, kdy takový index může trochu degradovat celkový výkon, ale obecně mít o index méně má horší vliv na výkon než mít o jeden index více.