2. 3. 2019 9:44 (aktualizováno)
Pavel Stěhule
Roky píši o Postgresu, a o tom jak správně používat relační databáze. Relační databáze byly navržené tak aby se používaly jednoduše a efektivně, a aby je mohli použít jak programátoři, tak běžní uživatelé.
To, že s relační databází může pracovat neprogramátor (koncový uživatel) je v podstatě ten nejdůležitější benefit, který docení uživatel a v mnoha případech nepochopí programátor. Pro běžného uživatele napsat cyklus, případně zanořený
cyklus je problém. Pro programátora to samozřejmě problém není – a u SQL programátor musí překousnout fakt, že se úloha neřeší „programátorsky“.
Mám pocit, že o všem důležitém ohledně Postgresu jsem napsal, a je čas na souhrn, co považuji za důležité a za minimální znalosti, které by měl mít vývojář, který pracuje s databázemi. Upřesňuji, jedná se mi o vývojáře. Běžnému uživateli bohatě postačí znalost SQL, tak jak to bylo původně tvůrci SQL zamýšleno.
- Alespoň základní znalost SQL – umět pospojovat tabulky (JOIN), umět filtrovat a agregovat (WHERE, GROUP BY, HAVING), umět si seřadit data (ORDER BY), a oříznout (LIMIT)
Úlohy: Mějme tabulku obce, okresy. Dohledat 10 největších obcí, dohledat 10 největších okresů.
- Neuškodí pokročilejší znalost SQL – CTE, LATERAL JOIN, .. nicméně člověk nemusí mít všechno hned
Úlohy: Pro každý okres zobrazte 3 největší obce
- Znát základní principy pro správný návrh relačních databází – 1, 2, 3 normální forma. Použití číselníků.
- Neuškodí znalost antipatternů – např. EAV, snaha o implementaci dědičnosti, ..
- Přehled o základních strukturách používaných v relačních databázích (co a proč) – tabulka, index, sequence, partišna
- Mít přehled o realizaci SQL příkazů, výhody, nevýhody, omezení: Sekvenční čtení, Čtení s náhodným přístupem (index scan), způsoby joinu (nested loop, merge join, hash join) – kdy použít, kdy nepoužít index, atd
Úloha: umět číst prováděcí plán, a na základě prováděcího plánu identifikovat hrdla, a ty řešit (např. vytvořením indexu).
- Pochopit účel transakcí (ACID). Vědět, že co každý bod znamená (co přináší, co obnáší). Pochopit, že uživatel v databázi nevidí nejnovější data, ale vždy snapshot v určitém čase. Pochopit, že databáze jsou multiuživatelské, a databáze uživatele od sebe izoluje (co to znamená, a jaký to má efekt pro programátora, pro uživatele).
- Znát vzory pro řešení race conditions – jak předcházet race conditions a přitom pokud možno umožnit efektivní paralelní provoz.
Uloha: Prostudovat úrovně izolací, případně SELECT FOR UPDATE
Předchozí body jsou obecné, a měl by je zvládnout každý vývojář, který pracuje s relační databází. Mně osobně přijdou jako nezbytné minimum. Jedná se o jednoduché obecné znalosti na jejichž získání stačí minimum času – cca týden, 2 týdny.
Samozřejmě, že je dobré vědět o víc i o databázích, které používáme a to na úrovni dostatečné pro svou práci. Každá databáze má svoje specifické vlastnosti na které můžeme při návrhu větší aplikace narazit, případně které můžeme využít pro vývoj. Tyto specifické vlastnosti se mohou intenzivně měnit v čase. Mění se způsoby optimalizace, formáty uložení dat, limity.