Zkušenosti a experimenty s databází PostgreSQL

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.

Domény - DOMAIN

Č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.

Vytvoření domény

Příklad

  1. CREATE DOMAIN enabled AS BOOLEAN DEFAULT TRUE NOT NULL;
  2. CREATE DOMAIN names AS VARCHAR(128) NOT NULL;
  3. CREATE TABLE wp.wpnodes_data (
  4. id INTEGER NOT NULL,
  5. parent INTEGER,
  6. owner INTEGER,
  7. name names,
  8. active enabled,
  9. PRIMARY KEY (id)
  10. );

Smazání domény

DROP DOMAIN enabled;

Pohledy - VIEW

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.

  1. CREATE OR REPLACE wp.wpnodes_canceled AS
  2. SELECT id, name, owner AS ownerid,
  3. companies.name AS owner, createdate, canceldate FROM wp.wpnodes_data
  4. INNER JOIN companies ON wp.wpnodes_data.owner = companies.id
  5. WHERE wp.wpnodes_data.active = FALSE;

Pravidla - RULE

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 - SCHEMA

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.

CREATE SCHEMA

Příkaz vytvoří nové schéma.

  1. CREATE SCHEMA nazev [ AUTHORIZATION uzivatel ] [ element [...] ]
  2. CREATE SCHEMA AUTHORIZATION uzivatel [ element [ ... ] ]

Parametry

nazev
Název schématu. Pokud je název vynechán, bude použito jako název použito jméno aktuálně přihlášeného uživatele. Název schématu nesmí začít na pg_, které je vyhrazeno pro systémový katalog.
uzivatel
element
Tabulky (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.

DROP SCHEMA

Příkaz pro smazání schématu.

Syntaxe

DROP SCHEMA [IF EXISTS] name [, ...] [CASCADE | RESTRICT]

Parametry

IF EXISTS
name
CASCADE
RESTRICT

ALTER SCHEMA

Syntaxe

ALTER SCHEMA name RENAME TO newname
ALTER SCHEMA name OWNER TO newowner

Parametry

name
Název existujícího schématu
newname
Nový název schématu. To nesmí začít pg_, které je vyhrazeno pro systémové schéma.
newowner
Nový vlastník schématu