Hlavní navigace

Nový pohľad na tradičný relačný model

Relačný model je dobre známym pojmom v oblasti softvérového inžinierstva. Tento dvojdielny článok vám predstaví projekt Bandicoot, ktorý implementuje relačný model netradičným spôsobom. Zároveň si ukážeme, ako vyvíjať softvér pomocou relačného modelu, a to bez použitia tradičných relačných databáz či jazyka SQL.

Tweetni to Odměnte autora  Jak to funguje?

Základné pojmy

Skôr než sa pustíme do praktických ukážok, zhrnieme si základné pojmy modelu a vlastnosti systému Bandicoot. Relačný model a algebra sú tu s nami už od roku 1969. Ide o komplexný matematický model, ale pre účely tohto článku predstavíme len nasledujúce pojmy: Relácia, Relačná premenná, Relačná algebra a operácia priradenia.

Základom modelu je dátový typ Relácia. Je to v podstate štruktúra, ktorá sa skladá z atribútov, kde každý atribút má svoje vlastné meno a dátový typ.

Príklad: relácia Kniha s atribútmi Autor (reťazec znakov) a Rok vydania (celočíselná hodnota).

Model teda definuje Reláciu ako dátový typ. Okrem toho definuje aj relačné premenné. Každá takáto premenná je typu konkrétnej Relácie. Obsah premennej je vždy množina záznamov s rovnakou štruktúrou.

Príklad: premenná Moje knihy je typu Kniha (táto premenná reprezentuje množinu všetkých mojich kníh)

Ďalším dôležitým pojmom je Relačná algebra. Tá definuje základnú množinu operácií pre manipuláciu s relačnými premennými. Tieto operácie sú definované tak, aby tvorili uzavretý systém. Pomocou nich je možné meniť existujúce relácie ľubovoľným spôsobom a tým vytvárať nové relácie. Pre ilustráciu odporúčam pozrieť si vizualizáciu týchto operácií.

Okrem definovania nových relácii, deklarácie relačných premenných a používania operátorov relačnej algebry, máme k dispozícii aj koncept priradenia novej hodnoty do relačnej premennej. V princípe je to to isté, ako príkaz priradenia v klasickom programovaní.

Bandicoot

Bandicoot, začínajúci open-source projekt kompletne napísaný v jazyku C, je programovací systém s novým jazykom založeným na relačnej algebre, zabudovanou persistenciou a vlastným “run-time” prostredím. Programovací jazyk je navrhnutý takým spôsobom, aby bol použiteľný nie len ako dotazovací jazyk, ale aj ako jazyk na programovanie aplikačnej logiky.

V tomot dieli si predstavíme iba jazyk systému Bandicoot. Na ostatné vlastnosti, ako funkcie, HTTP rozhranie, persistenciu a transakcie, sa detailne pozrieme v druhom dieli článku.

Nový programovací jazyk

Nový pohľad na relačný model začína novým programovacím jazykom. V súčasnosti je SQL všeobecne uznávaným jazykom „relačných“ databáz, aj keď porušuje základné princípy relačného modelu. Tejto tematike sa podrobnejšie venuje kniha „Database in Depth“, ktorej autorom je Chris Date. Nasledujúce odstavce popisujú syntax jazyka Bandicoot a porovnávajú ho s SQL.

Základnými prvkami sú: relácie, relačné premenné a funkcie.

Príklad: definícia relácie Kniha, jednej premennej a jednoduchej funkcie

    rel Kniha {
        titul: string,
        autor: string,
        rok: int,
        pocetStran: int,
        pocetSlov: int,
    }

    knihy: Kniha;

    fn Knihy(): Kniha
    {
        return knihy;
    } 

Tento príklad nie je možné prepísať do SQL, ktorý neposkytuje koncept oddeleného definovania relácie a premenných. Jediný spôsob ako niečo podobné zapísať je použitie príkazu na vytvorenie tabuľky.

    create table Kniha (
        titul character(30),
        autor character(30),
        rok  integer,
        pocetStran  integer,
        pocetSlov  integer
    ); 

Neprítomnosť relačných premenných v SQL má za následok niektoré zásadné nevýhody tohto jazyka a znemožňuje jeho použitie ako plnohodnotného progamovacieho jazyka pre implementáciu aplikačnej logiky. Tradičné relačné databázy to obchádzajú implementáciou procedurálnych jazykov (Oracle PL/SQL, Sybase Transact SQL, PostgreSQL PL/pgSQL, atď.), ktoré už ale neposkytujú vysokú abstrakciu relačnej algebry.

Bandicoot implementuje operátory relačnej algebry pre manipuláciu s premennými. V nasledujúcich odstavcoch si ukážeme každý operátor samostatne a porovnáme si ho s implementáciou v SQL. Pre účely týchto príkladov si definujeme nasledovné premenné.

    archiv: Kniha; # nová premenná rovnakého typu ako "knihy"

    rel Predajca {
       meno: string,

       # titul a cena knihy
       titul: string,
       cena: real,
    }

    predajcovia: Predajca; 

Select

Operácia na filtrovanie záznamov z premennej pomocou podmienky.

Príklad: výber kníh s rokom vydania vyšším než 1990

    Bandicoot:  knihy select(rok > 1990);

    SQL:        select * from knihy where rok > 1990; 

Project

Operácia na zmenu relácie definovaním atribútov, ktoré sa majú zachovať vo výsledku.

Príklad: výber autorov v rámci kníh

    Bandicoot:  knihy project(autor);

    SQL:        select distinct autor from knihy; 

Extend

Operácia na pridávanie nových atribútov, ktorých hodnota je vypočítaná z hodnôt ostatných atribútov v relácií.

Príklad: výpočet počtu slov na stránku

    Banicoot:   knihy extend(slovNaStranku = real(pocetSlov) / real(pocetStran));

    SQL:        select k.*, pocetSlov / pocetStran as slovNaStranku from knihy k; 

Join

Operácia na spojenie dvoch relačných premenných. Výsledná relácia má atribúty obidvoch vstupných premenných a záznamy sa spájajú na atribútoch rovnakého názvu a typu.

Príklad: spojenie predajcov a kníh cez atribút „titul“

    Banicoot:   knihy * predajcovia;

    SQL:        select * from knihy natural join predajcovia; 

Union

Operácia na sčítanie dvoch premenných rovnakého typu. Vo výsledku sú všetky záznamy zo vstupných premenných.

Príklad: sčítanie kníh a archívu

    Banicoot:   knihy + archiv;

    SQL:        select * from knihy union select * from archiv; 

Minus

Operácia na odpočítanie obsahu jednej premennej od obsahu druhej premennej.

Príklad: vyňatie kníh, ktoré sú aspoň u jedného predajcu

    Banicoot:   knihy - predajcovia;

    SQL:        select * from knihy k
                 where not exists (select 1
                                     from predajcovia p
                                    where p.titul = k.titul); 

Summary

Operácia na sumárne výpočty jednej premennej nad druhou premennou.

Príklad: výpočet priemernej ceny knihy u predajcov

    Banicoot:   (predajcovia, knihy) summary(priemer = avg(cena, 0.0));

    SQL:        -- pre jednoduchosť použijeme funkciu nvl() z Oracle
                select k.titul, k.autor, k.rok, k.pocetStran,
                       nvl(avg(p.cena), 0.0) as priemer
                  from knihy k
                  left outer join predajcovia p on (a.titul = k.titul)
                 group by k.titul, k.autor, k.rok, k.pocetStran; 

Priradenie

Samostatnou kapitolou je priradenie novej hodnoty do relačnej premennej. Koncept priradenia v Bandicoote je identický s tradičným programovaním. SQL namiesto toho poskytuje príkazy na pridanie (insert), vymazanie (delete) a zmenu (update) záznamov priamo v tabuľke.

Príklad: priradenie obsahu jednej premennej do druhej premennej

    Bandicoot:  archiv = knihy;

    SQL:        delete from archiv;
                insert into archiv select * from archiv; 

Príklad: pridanie a vymazanie záznamov

    Banicoot:   archiv = archiv + knihy;
                archiv = archiv - knihy;

    SQL:        insert into archiv
                select * from knihy minus select * from archiv;

                delete from archiv a
                 where exists (select 1
                                 from knihy k
                                where a.titul = k.titul); 

Programovací jazyk Bandicoot umožňuje použiť viacero operátorov v jednom príkaze. Podobne je to aj v SQL. Zásadným rozdielom je však to, že v SQL nie je možné určiť poradie vykonávania týchto príkazov. V prípade Bandicootu sa príkazy vykonávajú podľa jednoznačne určených pravidiel. Výhodou je, že vývojár má plnú moc nad tým, ako vykonať výpočet. Preto optimalizátor, ako ho poznáme z tradičných relačných databáz, nie je potrebný.

Príklad: výpočet priemernej ceny stránky na knihu u rôznych predajcov

    Bandicoot:  (predajcovia * knihy)
                extend(cenaStranky = cena / real(pocetStran))
                project(titul, meno, cenaStranky);

    SQL:        select titul, meno, cenaStranky
                  from (select *, cena / pocetStran as cenaStranky
                          from predajcovia natural join knihy); 

Záver

Bandicoot umožňuje používanie relačného modelu netradičným a jednoduchým spôsobom. Snaží sa poskytnúť softvérovým inžinierom jeho potenciál v plne miere. Druhý diel článku popíše zvyšné vlastnosti systému ako funkcie, globálne a lokálne premenné, presistenciu, transakcie a HTTP rozhranie. Zároveň poskytne návod, ako vytvoriť jednoduchú webovú aplikáciu v Bandicoote, ktorej používateľské rozhranie je napísané v jazyku JavaScript.

Július Chrobák

Július Chrobák je spoluautorom projektu Bandicoot. Pracuje ako softvérový inžinier so zameraním na serverové komponenty a databázy.

Ohodnoťte jako ve škole:
Průměrná známka 2,20
Tweetni to Odměnte autora  Jak to funguje?

TCP/IP síť na Linuxu I - dvoudenní workshop

 V dvoudenním workshopu se seznámíte se síťováním v Linuxu na všech vrstvách. Ujasníte si možnosti použití Linuxu v roli klienta, serveru i routeru.

Další informace o školení TCP/IP síť na Linuxu I - dvoudenní workshop»

       

Přehled názorů

moudra
VM 9. 6. 2011 01:09
Nový
├ 
Re: moudra
Julius Chrobak 9. 6. 2011 07:38
Nový
│
└ 
Re: moudra
VM 9. 6. 2011 09:28
Nový
│
 
├ 
Re: moudra
Julius Chrobak 9. 6. 2011 09:59
Nový
│
 
└ 
Re: moudra
Tomáš Vondra 9. 6. 2011 11:43
Nový
└ 
Re: moudra
Tomáš Vondra 9. 6. 2011 12:05
Nový
 
├ 
Re: moudra
jos 9. 6. 2011 12:25
Nový
 
└ 
Re: moudra
Julius Chrobak 9. 6. 2011 14:25
Nový
 
 
└ 
Re: moudra
Tomáš Vondra 9. 6. 2011 15:40
Nový
 
 
 
└ 
Re: moudra
Julius Chrobak 9. 6. 2011 16:21
Nový
 
 
 
 
├ 
Re: moudra
Ivan 9. 6. 2011 17:56
Nový
 
 
 
 
│
└ 
Re: moudra
Julius Chrobak 9. 6. 2011 18:29
Nový
 
 
 
 
│
 
└ 
Re: moudra
Tomáš Vondra 9. 6. 2011 22:35
Nový
 
 
 
 
│
 
 
└ 
Re: moudra
Karel 12. 6. 2011 12:27
Nový
 
 
 
 
│
 
 
 
└ 
Re: moudra
Pavel 13. 6. 2011 07:18
Nový
 
 
 
 
├ 
Re: moudra
Inkvizitor 9. 6. 2011 20:26
Nový
 
 
 
 
│
└ 
Re: moudra
Julius Chrobak 9. 6. 2011 22:30
Nový
 
 
 
 
│
 
└ 
Re: moudra
Inkvizitor 9. 6. 2011 23:36
Nový
 
 
 
 
│
 
 
└ 
Re: moudra
Julius Chrobak 10. 6. 2011 07:49
Nový
 
 
 
 
│
 
 
 
└ 
Re: moudra
Inkvizitor 12. 6. 2011 17:44
Nový
 
 
 
 
├ 
Re: moudra
Tomáš Vondra 9. 6. 2011 23:30
Nový
 
 
 
 
│
└ 
Re: moudra
Julius Chrobak 10. 6. 2011 07:28
Nový
 
 
 
 
│
 
└ 
Re: moudra
VM 10. 6. 2011 08:50
Nový
 
 
 
 
│
 
 
└ 
Re: moudra
Julius Chrobak 10. 6. 2011 09:17
Nový
 
 
 
 
│
 
 
 
└ 
Re: moudra
Tomáš Vondra 10. 6. 2011 13:08
Nový
 
 
 
 
│
 
 
 
 
└ 
Re: moudra
Julius Chrobak 10. 6. 2011 14:34
Nový
 
 
 
 
└ 
Re: moudra
Karel 12. 6. 2011 12:17
Nový
 
 
 
 
 
└ 
Re: moudra
backup 12. 6. 2011 18:31
Nový
 
 
 
 
 
 
└ 
Re: moudra
Tomáš Vondra 13. 6. 2011 00:13
Nový
 
 
 
 
 
 
 
└ 
Re: moudra
Julius Chrobak 13. 6. 2011 08:19
Nový
 
 
 
 
 
 
 
 
└ 
Re: moudra
Tomáš Vondra 13. 6. 2011 11:27
Nový
 
 
 
 
 
 
 
 
 
└ 
Re: moudra
Julius Chrobak 13. 6. 2011 12:09
Nový
SQL je základ
Dušan Jícha 9. 6. 2011 06:43
Nový
└ 
Re: SQL je základ
Julius Chrobak 9. 6. 2011 07:50
Nový
 
└ 
Re: SQL je základ
MD 9. 6. 2011 08:58
Nový
 
 
└ 
Re: SQL je základ
Julius Chrobak 9. 6. 2011 09:51
Nový
 
 
 
└ 
Re: SQL je základ
Pavel Prokop 9. 6. 2011 11:09
Nový
 
 
 
 
└ 
Re: SQL je základ
Julius Chrobak 9. 6. 2011 11:42
Nový
Tranzitivní uzávěr
Michal Kára 9. 6. 2011 15:05
Nový
├ 
Re: Tranzitivní uzávěr
Julius Chrobak 9. 6. 2011 16:36
Nový
│
└ 
Re: Tranzitivní uzávěr
Michal Kára 9. 6. 2011 17:19
Nový
│
 
├ 
Re: Tranzitivní uzávěr
Julius Chrobak 9. 6. 2011 18:00
Nový
│
 
└ 
Zas taký problém to nie je
CHe 9. 6. 2011 18:05
Nový
│
 
 
├ 
Re: Zas taký problém to nie je
Michal Kára 9. 6. 2011 18:16
Nový
│
 
 
│
└ 
Re: Zas taký problém to nie je
CHe 9. 6. 2011 18:39
Nový
│
 
 
│
 
└ 
Re: Zas taký problém to nie je
Michal Kára 9. 6. 2011 20:28
Nový
│
 
 
├ 
Re: Zas taký problém to nie je
Julius Chrobak 9. 6. 2011 18:46
Nový
│
 
 
└ 
Re: Zas taký problém to nie je
Tomáš Vondra 9. 6. 2011 22:56
Nový
│
 
 
 
└ 
Re: Zas taký problém to nie je
CHe 9. 6. 2011 23:58
Nový
├ 
Re: Tranzitivní uzávěr
Tomáš Vondra 9. 6. 2011 23:03
Nový
└ 
Re: Tranzitivní uzávěr
Julius Chrobak 10. 6. 2011 09:38
Nový
Drzim velmi palce!
gbl 9. 6. 2011 23:02
Nový
Re: Nový pohľad na tradičný relačný model
vks 9. 6. 2011 23:11
Nový
└ 
Re: Nový pohľad na tradičný relačný model
Julius Chrobak 10. 6. 2011 07:12
Nový
 
└ 
Re: Nový pohľad na tradičný relačný model
Logik . 11. 6. 2011 14:37
Nový
 
 
└ 
Re: Nový pohľad na tradičný relačný model
Julius Chrobak 11. 6. 2011 18:10
Nový
 
 
 
└ 
Re: Nový pohľad na tradičný relačný model
Logik . 13. 6. 2011 15:33
Nový
 
 
 
 
├ 
Re: Nový pohľad na tradičný relačný model
Pavel Stěhule 14. 6. 2011 06:40
Nový
 
 
 
 
└ 
Re: Nový pohľad na tradičný relačný model
Julius Chrobak 14. 6. 2011 08:38
Nový
 
 
 
 
 
├ 
Re: Nový pohľad na tradičný relačný model
Pavel 14. 6. 2011 08:43
Nový
 
 
 
 
 
│
└ 
Re: Nový pohľad na tradičný relačný model
Julius Chrobak 14. 6. 2011 08:53
Nový
 
 
 
 
 
│
 
└ 
Re: Nový pohľad na tradičný relačný model
Vít Šesták (v6ak) 14. 6. 2011 10:34
Nový
 
 
 
 
 
└ 
Re: Nový pohľad na tradičný relačný model
Pavel Stěhule 14. 6. 2011 12:15
Nový
 
 
 
 
 
 
├ 
Re: Nový pohľad na tradičný relačný model
Vít Šesták (v6ak) 14. 6. 2011 12:26
Nový
 
 
 
 
 
 
│
└ 
Re: Nový pohľad na tradičný relačný model
Pavel Stěhule 14. 6. 2011 13:28
Nový
 
 
 
 
 
 
│
 
└ 
Re: Nový pohľad na tradičný relačný model
Vít Šesták (v6ak) 14. 6. 2011 13:45
Nový
 
 
 
 
 
 
└ 
Re: Nový pohľad na tradičný relačný model
jkb 14. 6. 2011 13:24
Nový
 
 
 
 
 
 
 
└ 
Re: Nový pohľad na tradičný relačný model
Pavel Stěhule 14. 6. 2011 14:11
Nový
Bandicoot + Java
Andrej Petras 17. 6. 2011 23:08
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem