v SQL je koncept cizích klíčů důležitý, který lze nalézt ve všech profesionálních databázích používaných v průmyslu. Hlavní myšlenkou je zabránit databázi PostgreSQL v ukládání nekonzistentních dat vynucením omezení zajišťujících správnost vašich tabulek (alespoň pokud jde o vztahy mezi objekty). Referenční integrita je proto jedním z nejdůležitějších konceptů, které kdy byly vynalezeny.

cizí klíče však představí některé problémy, o které se musíte při psaní aplikací postarat. Pokud neexistují žádné cizí klíče, můžete vložit data do libovolné tabulky v libovolném pořadí. PostgreSQL je jedno. Pokud je však zaveden cizí klíč, začne na pořadí záležet (alespoň v typickém scénáři, ale o tom později).

cizí klíče a objednávka

abychom ukázali důležitost objednávky, musíme nejprve vytvořit datový model:

chceme ukládat měny, produkty a popisy produktů. V podstatě se jedná o velmi jednoduchý datový model. Uvidíme, jestli náhodou vložíme do tabulky produktů:

logicky první vložka selže, protože měna číslo 1 ještě neexistuje. Pokud chceme vložit, musíme použít hodnotu NULL (=neznámá měna). V pořadí slova: musíme nejprve vyplnit tabulku měn, pak vložit umístění, a tak dále. Pořadí záleží ve výchozím případě.

určení správného pořadí vložení cizích klíčů

pokud musíte začít používat existující datový model, může být trochu těžké zabalit hlavu kolem této věci. Vyplnění prázdného datového modelu může být trochu složité. Tak proč nenapsat dotaz, který nám říká pořadí, ve kterém máme vkládat data?

No, tady je ten magický dotaz …

dotaz není triviální ke čtení, ale udělal jsem maximum, abych to trochu zdokumentoval. V zásadě mají tabulky systému PostgreSQL všechny informace, které potřebujeme k určení správného pořadí. Zde je výstup:

 table_name | level-----------------+------- t_currency | 1 t_location | 1 t_product | 2 t_product_desc | 3 t_product_stock | 3(5 rows)

jak vidíte, dotaz nám správně dal tabulky v požadovaném pořadí. Nejprve musíme vložit do všech tabulek na úrovni jedna a tak dále. Pokud se budeme držet tohoto pořadí, bude vždy zajištěna referenční integrita (za předpokladu, že jsou data správná).

použití“ původně odložených “ omezení

v některých případech může být pořadí vložení nepříjemnou věcí. Co kdybychom měli prostředky říct PostgreSQL ignorovat pořadí a zkontrolovat integritu na commit místo? To je přesně to, co „původně odloženo“ dělá. Zde je návod, jak to funguje:

v tomto případě můžeme upravit data v libovolném pořadí, které chceme. Pokud je zaručeno, že integrita bude na konci transakce neporušená, PostgreSQL je naprosto v pořádku. PostgreSQL odloží kontrolu omezení a zbaví vývojáře určité zátěže.

konečně …

pokud se chcete dozvědět více o pokročilém SQL, možná se budete chtít podívat na můj blog o některých pokročilejších funkcích okna (s vazbami). Takže si oblékněte kravatu a přečtěte si, abyste se dozvěděli více.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.