Letos, jako každý rok, jsem aktualizoval přednášky pro předmět Databázové systémy v praxi, který vyučujeme na vysokých školách. Po několika letech jsem přistoupil i k výrazné aktualizaci cvičení. Na různých databázových serverech mám pro jednotlivé studenty vytvořené stejné prostředí. Během cvičení studenti hledají chyby v návrhu relačního modelu, vytvářejí skripty pro úpravu schématu, mohou si vyzkoušet, které postupy softwarového inženýrství jsou více nebo méně vhodné pro vývoj datově orientovaných systémů, a nakonec si zkoušejí, jak se jednotlivé databázové systémy chovají při paralelním zpracování uživatelských požadavků.
Zadání je jednoduché. Na Linuxový server nainstalovat co nevíce rozdílných datových serverů a vytvořit na nich snadno obnovitelné a jednoduše administrovatelné prostředí. Přitom prostředí pro každého studenta musí být izolované tak, aby nemohl zasahovat do práce svých kolegů. Zároveň jsem hledal jednotný a jednoduchý vývojový nástroj pro všechny datové servery.
Při přípravě prostředí mě samotného překvapilo, kam se za posledních pár let posunuly jednotlivé databázové servery a jejich ekosystém. Mé překvapení bylo tak velké, že považuji za rozumné se o něj podělit.
Neměl jsem čas ani chuť patlat se v licenčních ujednáních, zda se produkt smí použít pro výuku, kdo je vlastníkem hardware, na kterém server běží, a dalších specialit jednotlivých dodavatelů. Proto jsem použil expres nebo komunitní edice, které umožňují se takovým tématům vyhnout. Konečný výběr je Oracle 18c XE, Postgresql 10, Microsoft SQL Server 2017 a MySQL 15.7.
Všechny servery mají jednoduše zvládnutelnou instalaci přes rpm balíčky. Největší překvapení pro mě byla instalace MS SQL serveru. Ze všech uvedených serverů bylo nejjednodušší. Klobouk dolů před vývojáři Microsoftu, kteří se zřejmě rozhodli, že když už Linux, tak pořádně a od základů. Všechny servery mimo Oracle mají napojení na sdílené rpm repository, které umožňuje jednoduše aplikovat patche. Pouze u Oracle je třeba si stáhnout instalační balíčky přímo z Oracle webu.
Hledal jsem univerzálního klienta pro práci se všemi servery. Potřeboval jsem aplikaci s dostatečně volnou licencí fungující jak ve Windows, tak v Linuxu nebo Mac OS. Uvažoval jsem o Oracle SQL developer. Je to nativní klient pro Oracle a podporuje jdbc drivery druhých stran. SQL developer podporuje správu datových objektů a SQL příkazy, ale má problém i s velmi jednoduchými skripty. Nakonec jako nejlepší se ukázal DBeaver Community Edition. Servery mají řádkového klienta (sqlplus, pgsql, isql nebo mysql), kterým se dají spouštět skripty. Pro efektivní vývoje to není dostatečné.
Všechny uvedené datové servery podporují obdobnou logiku správy diskových prostorů: fyzická definice místa pro uložení dat na disku a logické rozčlenění pro jednotlivé databáze nebo schémata. Konkrétní implementace této logiky je ale velmi rozdílná. Nad tímto členěním je již více méně ANSI kompatibilní struktura tabulek a dalších databázových objektů.
Rozdílné řešení vede k tomu, že vytváření databází, jejich zálohování a kopírování je u každého serveru jiné. Například PostgreSQL umožňuje vytvářet jednoduše databáze podle template. Použití model databáze umožňuje i MSSQL, ale model databáze je určena zejména pro vytváření tampdb databáze při startu serveru a její modifikace pro vytváření uživatelských databází není vhodná. Oracle umí vytvářet samostatné databáze až od verze 12. To nevadí, protože se s výhodou pro jednotlivá prostředí dá použít schéma v jedné databázi, což je pro Oracle přirozený způsob separace uživatelů.
Síťová konfigurace a propojení uživatelů na síťovou konfiguraci je velmi rozlišné. Jenom u MS SQL serveru nebylo potřeba zasahovat do konfiguračních souborů pro změnu portu, na kterém databáze poslouchá. U PostgreSQL a MySQL jsou podstatná pravidla pro uživatelská připojení uložena v souborech. U obou databází jsem při konfiguraci narazil na nesoulad s dokumentací. Na rozdíl od Oracle a MSSQL umožňují servery PostgreSQL a MySQL omezit přístup jednotlivých uživatelů na základě uživatelské IP adresy.
Databázový katalog – tabulky a view popisující strukturu databáze – je u každé databáze jiný. Spoléhat se na existenci normovaného INFORMATION_SCHEMA také úplně nejde. Oracle schéma nepodporuje a zejména nativní databázové katalogy obsahují podstatně více informací nutných pro efektivní vývoj než univerzální INFORMATION_SCHEMA. Každá databáze má své vlastní příkazy pro popis datových struktur, například: Oracle DESCRIBE, PostgreSQL \d, MySQL SHOW, MSSQL sp_help. S výjimkou MSSQL jsou tyto příkazy implementovány na úrovni klientů. Pokud se používá nestandardní klient, je nutné dotazovat se přímo do databázového katalogu.
Samotná kapitola je možnost programování v databázi. Databáze mají svůj základní programovací jazyk: Oracle má PL/SQL, MSSQL používá Transact SQL, PostgreSQL má PL/pgsql, MySQL používá SQL/PSM standard s některými výjimkami. Navíc databáze podporují další jazyky dané jejich architekturou. V Oracle se dají psát procedury v C, v MSSQL v .NET, v PostgreSQL v Perlu nebo v Pythonu. Z mé zkušenosti je svoboda v programovacích jazycích spíše komplikace než výhoda. Použití jiných než nativních jazyků vede k přílišné vazbě na operační systém, zvyšuje nároky na vývojový tým a svádí k řešení funkčních i nefunkčních požadavků pomocí uživatelského kódu, který je již v databázi obsažený. Tím se odvádí pozornost od základního bodu vývoje výkonné datové aplikace: od návrhu kvalitního databázového logického a zejména fyzického modelu.
Pro můj příklad, vyzkoušet databázový server pro cvičení a jednoduché studentské projekty, se ukázalo, že mezi jednotlivými servery není zásadní rozdíl. Už před několika lety konzultační firmy jako Gartner® nebo Forrester® konstatovaly, že všechny tyto databáze jsou vhodné pro produkční nasazení v podnikovém prostředí. To znamená, že při vývoji aplikací už není potřeba brát takový ohled na škálovatelnost, provozování a administraci aplikace v budoucnosti. Se všemi uvedenými typy databází se setkáváme na projektech u našich zákazníků. Vidíme jejich přínosy i úskalí v produkčním prostředí.
Sám jsem byl zvědavý, jak dopadnou jednotlivá cvičení. Zejména na to, podle jakých kritérií budou studenti, nezatížení podnikovým prostředím, hodnotit jednotlivé servery a kterým budou dávat přednost. Výsledky se dají shrnout do třech bodů:
- Studenti oceňují, že si mohou vyzkoušet rozdílné technologie. Překvapením pro ně bylo zejména to, jak jsou jednotlivé systémy rozlišné a jak veliké jsou rozdíly při psaní i jednoduchých SQL dotazů.
- Už i studenti magisterského studia dávají přednost datovým serverům, s kterými mají zkušenosti ze svých projektů nebo zaměstnání. Zřejmě pro to, že datový vývoj vyžaduje mnoho znalostí a zkušeností specifických pro daný typ datového server.
- Neexistuje něco jako univerzální vývoj, jakýkoliv trochu složitější vývoj vyžaduje pro každý server použít specializovaného klienta a specializované nástroje.
Autor: Ondřej Zýka