6.7. Tartomány alapú relációkalkulus

Létezik egy másik fajta relációkalkulus, amit tartomány alapú relációkalkulusnak vagy röviden tartománykalkulusnak nevezünk. Míg az SQL-t a rekord alapú relációkalkulusra alapozva fejlesztette ki az IBM Research San Jose-ban, Kaliforniában, addig a QBE-nek (Query-By-Example) nevezett másik nyelvet, ami a tartománykalkulushoz kötődik, ezzel majdnem párhuzamosan fejlesztették az IBM T. J. Watson Research Centerben Yorktown Heights-ban, New York államban. A tartománykalkulus formális specifikációját a QBE rendszer fejlesztése után írták le.

A tartománykalkulus a formulákban használt változók típusában különbözik a rekordkalkulustól: a változók ahelyett, hogy a rekordok fölött futnának végig, az attribútumok tartományainak egyszerű értékeit járják be. Ahhoz, hogy kialakítsunk egy n-edfokú relációt egy lekérdezéshez, szükségünk van n ilyen tartományváltozóra — mindegyik attribútumhoz egyre. Egy tartománykalkulusbeli kifejezés

alakú, ahol x 1, x 2, …, xn , x n+1, x n+2, …, x n+m tartományváltozók, amelyek végigfutnak a tartományok (az attribútumok tartományai) fölött, míg a FELTÉTEL a tartomány alapú relációkalkulus egy feltétele vagy formulája .

Egy formula atomokból épül föl. Egy formula atomjai kicsit különböznek a rekordkalkulusban megadottaktól, a következők lehetnek:

Ahogyan a rekordkalkulusban is, az atomok IGAZ vagy HAMIS értéket vesznek fel egy adott értékhalmaz esetén, amit az atomok igazságértékének nevezünk. Az 1. esetben, ha a tartományváltozókhoz hozzárendelt értékek megfelelnek a megadott R reláció egy rekordjának, akkor az atom értéke IGAZ. A 2. és 3. esetben, ha a tartományváltozókhoz hozzárendelt értékek kielégítik a feltételt, akkor az atom IGAZ.

A rekord alapú relációkalkulushoz hasonlóan a formulák itt is atomokból, változókból és kvantorokból épülnek föl, így most nem fogjuk elismételni a formulákra vonatkozó előírásokat. Következzen inkább néhány, tartománykalkulusban megadott lekérdezés. A tartományváltozókat az ábécé kisbetűivel, az l, m, n, …, x, y, z betűkkel fogjuk jelölni.

0. lekérdezés.  Listázza ki azoknak a dolgozóknak a születési dátumát és lakcímét, akiknek a neve „Kovács János”!

Q0: {tu ❘ (∃q) (∃r) (∃s) (∃v) (∃w) (∃x) (∃y) (DOLGOZÓ(qrstuvwxy) AND q='Kovács' AND r='János')}

Kilenc változóra van szükségünk a DOLGOZÓ relációhoz, amelyek végigfutnak az egyes attribútumok tartományai fölött. A kilenc változóból (q, r, s, …, y) csak a t és az u szabadok. Először felsoroljuk a kért attribútumokat, a Szdátumot és a Lakcímet a szabad változókkal, t-vel a Szdátumra, u-val a Lakcímre hivatkozva. Azután a függőleges elválasztó vonalat (❘) követően megadjuk a feltételt egy rekord kiválasztására — nevezetesen, hogy a qrstuvwxy változókhoz rendelt értéksorozatnak a DOLGOZÓ reláció egy rekordjának kell lennie, valamint hogy a q (VNév) és az r (Knév) értéke rendre 'Kovács' és 'János' legyen. A kényelem kedvéért a további példáinkban csak azokat a változókat fogjuk kvantálni, amelyek ténylegesen megjelennek egy feltételben (ezek a q és az r lennének a Q0-ban).

Egy alternatív, QBE-ben használt rövidítési lehetőség ennek a lekérdezésnek a felírására a 'Kovács' és 'János' konstansok közvetlen hozzárendelése, ahogyan azt a Q0A-ban láthatjuk. Itt azok a változók, amelyek nem jelennek meg a függőleges vonal bal oldalán, implicit módon egzisztenciálisan kvantáltak:[25]

Q0A: {tu ❘ DOLGOZÓ('Kovács', 'János', s, t, u, v, w, x, y) }

1. lekérdezés.  Kérdezze le az összes olyan dolgozónak a nevét és a lakcímét, aki a „Kutatás” osztályon dolgozik!

Q1: {qru ❘ (∃y) (∃l) (∃m) (DOLGOZÓ(qrstuvwxy) AND OSZTÁLY(lmno) AND l='Kutatás' AND m=y)}

Az olyan feltétel, mint a m=y a Q1-ben, amely két olyan tartományváltozót kapcsol össze, amelyek két reláció attribútumai fölött futnak végig, összekapcsoló vagy join feltétel; míg az olyan feltétel, mint a l='Kutatás', amely egy tartományváltozót egy konstanssal kapcsol össze, szelekciós feltétel.

2. lekérdezés.  Minden kecskeméti projekt esetén listázza ki a projekt számát, a projektet irányító osztály számát, valamint az osztályvezető vezetéknevét, születési dátumát és lakcímét!

Q2: {ikrtu ❘ (∃j) (∃m) (∃n) (∃s) (PROJEKT(hijk) AND DOLGOZÓ(qrstuvwxy) AND OSZTÁLY(lmno) AND k=m AND n=s AND j='Kecskemét')}

6. lekérdezés.  Listázza ki azoknak a dolgozóknak a vezeték- és keresztnevét, akiknek nincs egyetlen hozzátartozójuk sem!

Q6: {qr ❘ (∃s)(DOLGOZÓ(qrstuvwxy) AND (NOT(∃l)(HOZZÁTARTOZÓ(lmnop) AND s=l)))}

Q6 átírható az egzisztenciális kvantor helyett az univerzális kvantort használva, ahogyan az a Q6A-ban látható:

Q6A: {qr ❘ (∃s)(DOLGOZÓ(qrstuvwxy) AND ((∀l)(NOT(HOZZÁTARTOZÓ(lmnop)) OR NOT(s=l))))}

7. lekérdezés.  Listázza ki azoknak az osztályvezetőknek a nevét, akiknek legalább egy hozzátartozójuk van!

Q7: {qr ❘ (∃s) (∃j) (∃l) (DOLGOZÓ(qrstuvwxy) AND OSZTÁLY(hijk) AND HOZZÁTARTOZÓ(lmnop) AND s=j AND l=s)}

Amint azt korábban már említettük, megmutatható, hogy bármely lekérdezés, amely felírható a relációalgebrában, felírható tartomány alapú vagy rekord alapú relációkalkulusban is. Bármely tartomány alapú vagy rekord alapú relációkalkulusbeli biztonságos kifejezés ugyancsak felírható a relációalgebrában.

A QBE nyelv a tartomány alapú relációkalkuluson alapul, bár ezt később valósították meg, a tartománykalkulus formalizálása után. A QBE volt az első, adatbázisrendszerekhez kifejlesztett grafikus lekérdező nyelvek egyike, minimális szintaktikával. Az IBM Research-nél fejlesztették, és hozzáférhető az IBM kereskedelmi termékeként mint a DB2-höz interfészt kínáló Query Management Facility (QMF) része. Sok másik kereskedelmi termék is merített ötleteket belőle, fontos helyet foglal el a relációs nyelvek palettáján.



[25] Megjegyzendő, hogy a csak a feltételekben aktuálisan használt tartományváltozók kvantálása, illetve egy olyan, a tartományváltozók elválasztására szolgáló vesszők nélküli predikátum használata, mint a DOLGOZÓ(qrstuvwxy), kizárólag csak kényelmi célból használt rövidítés; semmiképpen sem helyes formális jelölés.