Rozhodl jsem se, že sepíšu některé své poznatky a zkušenosti s databázovým serverem PostgreSQL. Jedná se o velmi výkonnou a propracovanou databázovou platformu, které se např. často používaná databáze MySQL ještě nemůže rovnat, ačkoliv se snaží své konkurenty dohnat.
PostgreSQL byla první databází, kterou jsem na svém prvním nainstalovaném Linuxu v roce 2000 začal používat. Ano, počátky bez Internetu a potřebné dokumentace byly krušné, ovšem tolik opěvovaná databáze MySQL mi poté přišla trochu neohrabaná, zbytečně složitá co se přístupových práv týče a neuměla zdaleka tolik věcí, jako PostgreSQL.
Časem přijdeme na to, že se nám v databázovém schématu některé datové typy a jejich kontroly a omezení velmi často opakují. Například je-li daný záznam aktivní se může objevit nejen u uživatele, ale i u výrobku položky v číselníku apod. Dalším ještě vhodnějším příkladem je e-mailová adresa, která musí být zkontrolována na správnost tvaru a tento datový typ a kontrolu bychom měli definovat pokaždé. Sáhneme proto raději k doménám, definujeme datový typ a omezení pouze jednou a více se o problém nestaráme.
CREATE DOMAIN enabled AS BOOLEAN DEFAULT TRUE NOT NULL; CREATE DOMAIN names AS VARCHAR(128) NOT NULL; CREATE TABLE wp.wpnodes_data ( id INTEGER NOT NULL, parent INTEGER, owner INTEGER, name names, active enabled, PRIMARY KEY (id) );
DROP DOMAIN enabled;
Pohledy jsou velmi užitečná věc. Ve své podstatě bych je přirovnal k pojmenovaným dotazům.
CREATE VIEW nazev_pohledu AS dotaz
Následující říklad vytvoří velmi jednoduchý pohled, který bude přesně odpovídat obsahu tabulky wpnodes_data
CREATE VIEW wp.wpnodes AS SELECT * FROM wp.wpnodes_data
Tvorba tohoto pohledu se může zdát diskutabilní, ovšem ve spojení s pravidly a řízením přístupu k datům dává smysl.
Užitečnějsí pohled nám například zobrazí místo číselných údajů data pospojovaná dohromady. Dejme tomu, že se velmi často ptáme na WP uzly, které jsou již z nějakého důvodu zrušené. V tomto pohledu chceme dále znát majitele uzlu, ovšem nikoliv jako číslo (i když to se nám může taky hodit), ale jeho plným názvem, a datumy, kdy byl uzel vytvořen a kdy zrušen.
CREATE OR REPLACE wp.wpnodes_canceled AS SELECT id, name, owner AS ownerid, companies.name AS owner, createdate, canceldate FROM wp.wpnodes_data INNER JOIN companies ON wp.wpnodes_data.owner = companies.id WHERE wp.wpnodes_data.active = FALSE;
Při analýze našeho stávajícího informačního systému jsem narazil na nutnost použití funkcí a spouští. Spouště jsou buď typu BEFORE, nebo AFTER. Co ale dělat v případě, že potřebuju nějakou operaci vykonat INSTEAD, tedy místo požadované operace? Např. MS SQL server nabízí spouště typu INSTEAD OF, ale u PostgreSQL jsem je nenašel. Zato jsem objevil něco, co se nazývá RULE a je spouším velmi podobné.
Pravidla se dělí na dva druhy. Pravidla pro zobrazování a pravidla pro aktualizace. Pravidla pro zobrazování jsou shodná s pohledy
Schémata jsou další skvělou věcí, kterou jsem v PostgreSQL objevil čirou náhodou. Umožní zpřehlednění struktury tabulek a pohledů a jejich rozdělení do logických skupin. Ve své podstatě bych je přirovnal ke jmenným prostorům, používaným např. v C++. Pokud máme od poskytovatele k dispozici jednu databázi a chceme si v tabulkách udržet přehled, která tabulka patří do jakého projektu, jsou schemata dobrým řešením.
Příkaz vytvoří nové schéma.
CREATE SCHEMA nazev [ AUTHORIZATION uzivatel ] [ element [...] ] CREATE SCHEMA AUTHORIZATION uzivatel [ element [ ... ] ]
pg_
, které je vyhrazeno pro systémový katalog.CREATE TABLE
), pohledy (CREATE VIEW
), indexy (CREATE INDEX
), sekvence (CREATE SEQUENCE
), spouště (CREATE TRIGGER
) a oprávnění (GRANT
), která jsou akceptována příkazem CREATE SCHEMA
.Příkaz pro smazání schématu.
DROP SCHEMA [IF EXISTS] name [, ...] [CASCADE | RESTRICT]
ALTER SCHEMA name RENAME TO newname
ALTER SCHEMA name OWNER TO newowner
pg_
, které je vyhrazeno pro systémové schéma.