bugie.cz

Sniperův blog o věcech webových i newebových

19 dubna

Neznalost zákonů neomlouvá aneb mám rád postgreSQL

Navzdory nadpisu nebudu dneska řešit právo ani licence, ale jednu ze strašně užitečných věcí v SQL - cizí klíče.

Nejdřív trocha osvěty. Cizí klíče jednoduše říkají, že záznam v tabulce A nějak souvisí se záznamem v tabulce B a ta závislost je vyjádřená (obvykle) rovností hodnoty sloupce A.COL1 a B.COL2. Lidsky řečeno: Mám tabulku lidé s nějakým ID člověka (at už automaticky generovaným, nebo třeba rodným číslem) a tabulku psů s nějakým ID psa a pak hlavně ID majitele. Cizím klíčem nastavím, že techto X psů patří tomuto člověku.

Velkou výhodou cizích klíčů je možnost ovlivnit, jak se podřízená tabulka bude chovat při změně nadřízené. Dá se např. nastavit, že pokud smažu člověka, mají se smazat i všichni psi k němu přiřazení. Tohle je docela podstatná vlastnost, protože jednak pomocí jediného deletu smažete všechno podřízené (samozřejmě, že klíče můžeme řadit do víc urovní, pes může mít například svoje veterinární záznamy), ale zároven můžete nastavit, aby nešel smazat člověk, který má minimálně jednoho psa. Jelikož se jedná o funkci na urovni databáze, nemusíte je nijak řešit v aplikaci.

A to je ten problém - mysql, narozdíl od PostgreSQL a imho i ostatních databází, umožnuje sice použít verzi, která podporuje cizí klíče, ale vypnout jejich podporu. Čili klíče půjdou vytvořit (resp. při inportu se vytvoří) ale nebudou se aplikovat. Pokud programátor na cizí klíče spoléhá a navrhl databázi tak, aby se při smazání stránky automaticky smazali i veškerý její obsah ve všech jazykových mutacích, a ono se tak nestane, může dojít docela k problémům.

A přitom by stačilo, aby zadavatel budto s výběrem hostingu počkal na programátora a nebo mu aspon řekl, že již koupil hosting u té a té společnosti. Ušetřilo by se tím spousta problémů a hlavně spousta času a hlavně i peněz, protože celá situace se nakonec vyřešila zakoupením hostingu u jiné společnosti, která cizí klíče v mysql podporuje bez problémů.