Hľadáte grafický nástroj na modelovanie relačnej databázy? Použite Dia
a vytvorte si z neho SQL pomocou parsediasql a myslím, že budete s
výsledkom veľmi spokojný.
Nástroj na tvorbu diagramov Diaje podľa mňa trochu kontroverzný. Jeho
ovládanie nepatrí k najintuitívnejším, poriadny panel nástrojov chýba
(efektívnosť práce), grafický dizajn výstupu dá prácu Naproti týmto
nelichotivým veciam však poskytuje možnosť navrhnúť diagram prakticky
čohokoľvek, počnúc schémami počítačových sietí, vývojových diagramov a
končiac UML (Unified Modeling Language).
Práve posledne menované, diagramy UML, je možné využiť aj na
modelovanie databáz. Ale nie len modelovanie. Pomocou externého
nástroja parsediasql možno zaistiť export modelu vo formáte SQL.
Tento nástroj na export modelu Diado SQL podporuje viacero formátov,
medzi inými podporuje databázy MySQL, PosgreSQL, SQLite3 a ďalšie.
Aby ste mohli svoj model entitno-relačnej databázu navrhnúť pomocou
grafického nástroja Diamôžete pokojne použiť aj tvary s názvom
Entitnorelačný model, ak však chcete využiť aj nástroj
parsediasql, budete musieť použiť UML. Pokiaľ nepoznáte UML,
netreba sa ho báť a niektorými tajomstvami, ktoré som už objavil vás
prevediem. Aby som menej zbehlým uľahčil orientáciu, sú na obrázku
vpravo zvýraznené všetky tvary, ktoré v článku spomínam.
Priznám sa bez mučenia, že nepopíšem všetky možnosti, ktoré spojenie
Dia+ parsediasqlponúka, pretože som našiel len dokumentáciu a jeden
článok, ktoré popisujú iný (zastaraný) nástroj na export UML z Dia do
SQL. Ak ma niekto doplní, budem len rád…
Trieda bude reprezentovať tabuľku (a pohľad) databázy a umožňuje
definovať meno, stĺpce a indexy tabuľky.
Komponent bude reprezentovať záznamy tabuľky, teda údaje, vložené
pomocou INSERTINTO:
Malý balík bude reprezentovať mapovanie typov, pomocou ktorého
možno v návrhu používať vlastné dátové typy. Analyzátor parsediasql
dokáže obsah tohoto tvaru spracovať aj inými spôsobmi.
Agregácia bude reprezentovať relácie medzi poľami databázy.
Poznámka slúži na písanie poznámok, ktoré sa vo výslednom
Každá databáza sa skladá z tabuliek. Na vytvorenie tabuľky poslúži
tvar Trieda. Do dokumentu teda pridajte tvar Trieda a dvojklikom
na neho otvorte jeho vlastnosti. Okno s vlastnosťami triedy má viacero
záložiek. V tomto momente je však dôležité len pole Meno triedy, ktoré
bude vo výslednom SQL reprezentovať meno tabuľky.
Na obrázku vidno tabuľku akvarium, ktorá zatiaľ nemá žiadne
stĺpce.
Každá tabuľka musí mať nejaké stĺpce. Definíciu stĺpcov tabuľky
urobíte pomocou záložky Atribúty vo vlastnostiach tabuľky.
Pridávanie, odstraňovanie a poradie stĺpcov môžete riadiť pomocou
tlačidiel vpravo. Pri vytváraní musíte vyplniť polia dialógu Názov a
Typ, ktoré budú použité ako názov a dátový typ poľa. Pri vyplňovaní
týchto hodnôt dodržte pravidlá, ktoré platia pre SQL (prípadne pre
cieľový typ databázy).
Môžete vyplniť aj predvolenú hodnotu poľa, ktorú treba zadať do poľa
dialógu Hodnota. Tu stojí za zmienku hodnota NOTNULL, ktorá bude
vo výslednom SQL reprezentovaná ako pole s povinnou nenulovou hodnotou
a nie ako predvolená hodnota. V neposlednom rade môžete poľu pridať aj
komentár, ktorý sa nezobrazí v Dia, ale bude súčasťou výsledného SQL.
Pokiaľ má stĺpec predstavovať primárny index, tak mu nastavte aj
viditeľnosť na hodnotu Chránený. Stĺpec primárneho indexu bude mať
automaticky nastavenú aj voľbu NOT NULL, takže ju netreba špeciálne
nastavovať. Primárny index (vďaka inej viditeľnosti) bude rozlíšený aj
priamo v Dia značkou pred menom poľa (atribútu).
Na obrázku sú zobrazené dve triedy, ktoré majú po tri stĺpce, z
ktorých jedno (id
) je primárny index. Niektoré stĺpce majú nastavenú
aj hodnotu NOT NULL. Príklad ukazuje aj nastavenie typu, ktoré používa
viac ako jedno kľúčové slovo.
Sú situácie, keď je vhodné priamo po vytvorení tabuľky, pridať do nej
aj nejaké dáta. Na tento účel poslúži tvar Komponent. Ako príklad mi
použijem predvolené akvárium, ktoré bude pridané po vytvorení tabuľky
akvarium. Parametre SQL na vloženie dát je treba vyplniť v jeho
vlastnostiach (dvojklik), v poli Stereotyp. Do tohoto poľa treba
vložiť časť definície SQL, ktorá udáva meno tabuľky a stĺpce. Ak by
som skutočné dáta pridával pomocou tohoto dotazu SQL:
INSERT INTO akvarium (id, meno, popis) VALUES (1, 'Predvolené', 'Predvolené akvárium');
Potom do poľa Stereotyp patrí časť „akvarium(id, meno, popis)” (bez
úvodzoviek). Samotné dáta potom môžete pridať zapísaním priamo do
tvaru v rozhraní Dia. Vyberte tvar, do ktorého chcete zapisovať (tvar
Komponent) a použite nástroj Úprava textu z panela nástrojov alebo
použite skratku F2. V tvare sa objaví kurzor, a tak môžete zadať
jednotlivé hodnoty, pričom každý záznam je potrebné pridať na nový
riadok. Vyššie spomenutý dotaz SQL by teda vyzeral takto:
V prípade, že chcete používať komplexnejšie nastavenie typov a nechce
sa vám v každom stĺpci celú túto komplexnosť vyplňovať, môžete si
takéto typy namapovať na vlastný názov. Vo výslednom SQL bude potom
každý takýto vlastný dátový typ nahradený definíciou z mapovania. Na
definíciu mapovania typov poslúži tvar Malý balík. Po jeho pridaní do
dokumentu treba nastaviť typ mapovania, teda presnejšie typ databázy,
pre ktoré bude mapovanie platné. Môžete si do dokumentu pridať
mapovanie pre každý podporovaný typ databázy (hoci som to neskúšal).
Typ mapovania potom nastavíte v poli Stereotyp vo vlastnostiach tvaru, vo
formáte typ_databázy:typemap, napríklad sqlite3:typemap.
Jednotlivé mapovania sa potom už pridávajú priamo do tvaru, pomocou
nástroja Úprava textu, vždy jedno mapovanie na riadok. Obrázok ukazuje
príklad, ako sa navrhovaná zmení, použitím mapovania. Všimnite si aj
použitie mapovania v definícii typov stĺpcov tabuliek.
Vo výslednom SQL bude potom každý typ AutoUID nahradený reťazcom
INTEGER UNIQUE AUTO INCREMENT
.
Pokiaľ chcete/potrebujete vytvoriť indexy svojich tabuliek, i tu
Diapomôže. nastavenie indexom môžete urobiť pomocou záložky Operácie
vo vlastnostiach tabuľky (triedy). Definícia indexu sa skladá z troch
častí:
- definícia mena indexu do poľa dialógu Názov,
- zadanie typu operácie INDEX,
- definícia volieb (ak sú) indexu do poľa Komentár a
- definícia stĺpcov indexu.
Stĺpce indexu pridávajte do zoznamu Parametre, kde po pridaní stačí
vyplniť pole Názov parametra. Na obrázku vidíte ako je definícia
indexu zobrazená v zobrazení tabuľky, kde je vidno index s menom
idx_id_nazov, ktorý obsahuje dva stĺpce id
a nazov
.
Relačné databázy by neboli relačnými, keby v nich neboli definované
relácie. nebudem sa tu zaoberať tým, čo to relácie sú, len ukážem ako
ich v modeli pridať. Na ich pridanie poslúži tvar Agregácia.
Jednoducho ho pridajte do modelu. Jeho konce pripojte k príslušným
tabuľkám (nezáleží kde) a vyplňte jeho dve povinné vlastnosti, ktorými
sú mená stĺpcov, ktoré prepájate. Tieto mená stĺpcov vyplňte do polí
dialógu Úloha. Pri definícii úlohy musí byť jeden koniec relácie meno
primárneho kľúča (alebo unikátneho indexu) a druhý koniec musí byť
meno vzdialeného kľúča.
Voliteľne môžete vyplniť aj názov relácie (tu akva_image), pričom táto
hodnota mám vplyv na pomenovanie vytvoreného obmedzenia (constraint).
Priznám sa, že som nepátral po správnom nastavení smeru relácie,
ani po nastavení početnosti, pretože vo výslednom SQL pre SQLite nebol
vygenerovaný vzdialený kľúč (FOREIGNKEY), ale boli vygenerované
spúšťače (trigger), ktoré sa postarajú o odstránenie nepotrebných
záznamov na základe relácií.
Príklad nastavenia relácie ukazuje obrázok. Všimnite si, že som do
tabuľky akvarium pridal ďalší stĺpec, ktorý slúži na prepojenie s
tabuľkou akva_images“:
Možno malá poznámka: rovnaký účel splní aj tvar Asociácia, len
potrebujete toho naklikaťviac.
Pohľad (view) je spôsob ako si do databázy pridať virtuálne
(logické) tabuľky, ktoré neobsahujú žiadne dáta, ale kombinujú (a
zobrazujú) dáta z iných tabuliek. Myslím, že zjednodušene možno
povedať, že taký pohľad je vlastne uložený dotaz SQL, aby ste ho
nemuseli stále vypisovať.
Na vytvorenie pohľadu poslúži rovnaký tvar ako na vytvorenie tabuľky,
teda tvar Trieda. Od tabuľky ho odlíšite tým, že zaškrtnete voľbu
Abstraktný. Každá položka definovaná v záložke Atribúty bude
predstavovať stĺpec pohľadu, pričom meno atribútu bude použité ako
samostatná časť pre príkaz SELECT, preto možno použiť v mene použiť
zápis SQL.
Podobne, každá položka definovaná v záložke Operácie bude predstavovať
časť definície from
, where
, orderby
, groupby
a
having
. Každé meno operácie bude použité ako časť príkazu SELECT
a
ktorá časť to bude udáva pole typ operácie. Dajte pozor, toto je asi
jediná časť, kde som si všimol, že záleží na veľkosti písmen, preto
typ FROM
bude, na rozdiel od typu from
, ignorovaný.
Na príklade si všimnite, že opernad and
je súčasťou mena druhej
operácie where
:
V prípade, že si potrebujte do svojho modelu pridať aj nejaké
poznámky, použite tvar Poznámka, no a nebojte sa používať farby,
celkovo sa tým model stane prehľadnejší:
V tomto okamžiku by ste mali byť schopný vytvoriť model svojej
databázy, to čo ostáva, je jeho export do SQL. Ako som už spomenul,
poslúži nástroj parsediasql. Môžete si ho stiahnuť z domovskej
stránky adresára CPAN, kde by mal byť odkaz na aktuálnu verziu (v
dobe písania článku 0.20). V Debiane je tento nástroj v úložisku,
schovaný v balíku s menom libparse-dia-sql-perl, ktorý prosto
nainštalujete pomocou APT(odporúčam aptitude).
Po nainštalovaní ho môžete spustiť, ale je mu treba zadať niekoľko
parametrov, pričom povinnú sú dva:
kde CESTA je cesta k súboru Dia, ktorý chcete exportovať do SQL a
TYP_DB udáva pre ktorý databázy má byť vygenerované SQL. Okrem týchto
dvoch je užitočnou ešte voľba –ignore_type_mismatch, ktorá sa
postará o ignorovanie chýb v identite typov prvkov stĺpcov prepojených
reláciou.
Výsledné SQL je vypísané na štandardný výstup, ak ho chcete dostať do
súboru, stačí presmerovať výstup, takže príklad:
parsediasql --ignore_type_mismatch --db sqlite3 --file databaza.dia > databaza.sql
Tip
Od verzie 0.22 je k dispozícii aj typ databázy sqlite3fk, ktorý na
rozdiel od sqlite3 pridáva priamu podporu vzdialených kľúčov (foreign
key).
Vyššie použitý príklad by bol vygenerovaný ako takéto SQL:
-- get_schema_create
create table akvarium (
id INTEGER UNIQUE AUTOINCREMENT not null,-- Identifikátor
meno TEXT NOT NULL,-- Neprázdne meno akvária
popis TEXT ,-- Popis akvária
id_obrazok INTEGER ,
constraint pk_akvarium primary key (id)
) ;
create table akva_images (
id INTEGER UNIQUE AUTOINCREMENT not null,
nazov TEXT NOT NULL,
obrazok BLOB NOT NULL,
constraint pk_akva_images primary key (id)
) ;
-- get_view_create
create view akva_view as select
a.meno AS meno,a.popis AS popis,i.obrazok AS obrazok
from akva_images i
where (akvarium.id_obrazok is not null)
and (akva_images is not null)
order by akvarium.id;
-- get_inserts
insert into akvarium (id, meno, popis) values(1, 'Predvolené', 'Predvolené akvárium') ;
Keď som objavil túto možnosť, veľmi som sa potešil. Moju radosť trochu
kalí neexistencia priamej podpory vzdialených kľúčov pre SQLite3, ale
v iných databázach podporované sú. V tomto návode som sa nepokúšal o
vytvorenie kompletného popisu možností. Jednak nie som na databázy
práve expert, jednak všetky možnosti parsediasql sám nepoznám, ale
snažil som sa predstaviť šikovný nástroj (teda kombináciu nástrojov)
na grafické modelovanie.
V prípade, že chcete pátrať po ďalších možnostiach, odporúčam
manuálovú stránku parsediasql(1), stránku s popisom starého nástroja
na export do SQL (Using Dia to Interact With tedia2sql), ako i množstvo
príkladov, ktoré sú súčasťou parsediasql (v Debiane stačí stiahnuť
zdrojový balík, súčasťou binárneho nie sú).