Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Temporální databáze a TSQL

Podobné prezentace


Prezentace na téma: "Temporální databáze a TSQL"— Transkript prezentace:

1 Temporální databáze a TSQL
Jan Ulrych, Vít Urbánek, Petr Uher (v pořadí přednášení)

2 Obsah Motivace Studie konkrétních případů Vztah událostí a času
Ukázky vybraných datových modelů Shrnutí teorie TSQL Proč se vůbec snažíme do databázových systémů zavést čas Specifika databázových systémů pracujících s časem Ukázky implementace Dotazovací jazyk odvozený od SQL pro práci s temporálními databázemi

3 Motivace Potřebujeme v databázích čas? Studijní informační systém
Skladová evidence Účetní a bankovní systémy Docházkové systémy ... a mnoho dalších Od databázových aplikací často požadujeme, aby zachycovaly v čase se měnící problém který modelují. Většina aplikací využívající databáze pracuje s daty, která se mění v čase. Naopak je obtížné najít aplikace, které žádným způsobem nepotřebují pracovat s časem. SIS studenti se zajímají o předměty vypsané pro aktuální semestr, u aktuálně vypsané termíny zkoušek, přednášejícího zajímá kolik studentů je zapsáno na jeho předměty, zkoušky, vypisuje nové termíny zkoušek Skladová evidence zboží které je aktuálně na skladě, jeho množství zajímavá je rovněž historie pro konkrétní druhy zboží (kolik se ho za jakou domu prodalo) Docházkové systémy kdo kdy přišel zda byl v danou hodinu v budově

4 Klasické vs. temporální databáze
Klasický databázový systém Zachycen stav systému v aktuálním časovém okamžiku Problém: co dělat se starými daty Temporální databázový systém Databáze určitým způsobem podporující čas Jednodušší dotazy Jednodušší udržování aplikací Klasické databáze Neobsahují informaci o čase V databázi zachycen pouze aktuální stav systému. V případě, že se v čase systém vyvíjí, změny se v databázi projeví přidáváním nových informací a mazáním starých. V případě, že požadujeme uchovávání historie změn, či alespoň předchozího stavu, je nutné do databáze doplnit informaci o čase. Aktualizaci a operace s časem musí zajistit uživatel. Což (jak ilustrujeme dále) není triviální. Jako příklad poslouží SIS, kde chceme uchovávat informace o předcházejících semestrech. Řešením je přidání sloupce, který identifikuje konkrétní semestr. Nevýhodou tohoto řešení je, že s touto informací musí manipulovat uživatel sám. Temporální databáze Konkrétní podporu času uvidíme později Vhodný dotazovací jazyk zahrnující práci s časem Výhodou jsou jednodušší dotazy v nichž se vyskytuje čas, což přináší méně chyb v aplikačním kódu

5 Studie konkrétního případu
Příklad v SQL: Zaměstnanec( Jméno, Plat, Funkce) Jaký plat má Pepa? SELECT Plat FROM Zaměstnanec WHERE Jméno = ‘Pepa’ Provedeme návrh jednoduché relace, vymyslíme co by mohli uživatelé vyžadovat a ukážeme jaké problémy způsobí použití klasického databázového systému. Evidence zaměstnanců. Databáze zachycuje aktuální stav. Nepotřebujeme zde žádnou práci s časem.

6 Studie konkrétního případu
Příklad v SQL: Zaměstnanec(Jméno, Plat, Funkce, Datum_narození DATE) Kdy se Pepa narodil? SELECT Datum_narození FROM Zaměstnanec WHERE Jméno = ‘Pepa’ Přidali jsme datum narození. Databáze stále zachycuje jen aktuální stav. Ukázka omezené podpory práce s časem v SQL-92.

7 Studie konkrétního případu
Příklad v SQL: Zaměstnanec(Jméno, Plat, Funkce, Datum_narození, Platí_od DATE, Platí_do DATE) Jaký je Pepův aktuální plat? SELECT Plat FROM Zaměstnanec WHERE Jméno = ‘Pepa’ AND Platí_od <= CURRENT_DATE AND CURRENT_DATE <= Platí_do Co když ale potřebujeme evidovat i historii změn? V klasických relačních databázích bychom zřejmě zvolili následující reprezentaci: přidání dvou sloupců s datumy platností n-tice.

8 Temporální projekce Jako projekce v klasických databázích
Navíc bere v úvahu čas Srůstání Nedostatečná podpora v klasických databázových systémech V klasických databázových systémech projekce funguje tak, že z celé relace jsou vybrány hodnoty zadaných atributů. Obdobnou funkčnost požadujeme od projekce v temporálních databázových systémech (od temporální projekce). Navíc ale každá n-tice obsahuje čas. V případě, že se dvě n-tice výsledku mají stejné hodnoty všech svých atributů a překrývají se nebo dotýkají se časem, srostou tyto dvě n-tice do jedné n-tice s časem odpovídajícím sjednocení časů obou n-tic Realizace temporální projekce v klasických databázích představuje netriviální problém a zesložiťuje údržbu aplikace,

9 Temporální projekce – příklad
Jméno Plat Funkce Datum narození Platí_od Platí_do Pepa 60000 Vrátný 70000 Vrchní vrátný Ředitel bezpečnosti Příklad: Jaká Pepova platová historie? Pro každý plat chceme období, po které ho Pepa nepřetržitě pobíral Ukážeme, že podpora času v klasických databázových systémech je nedostatečná pro jednoduché dotazování. Jméno Plat Platí_od Platí_do Pepa 60000 70000

10 Temporální projekce – příklad
CREATE TABLE Temp(Plat, Od, Do) AS SELECT Plat, Platí_od AS Od, Platí_do AS Do FROM Zaměstnanci WHERE Jméno = ‘Pepa’ SELECT DISTINCT F.Plat, F.Od, L.Do FROM Temp AS F, Temp AS L WHERE F.Od < L.Do AND F.Plat = L.Plat AND NOT EXISTS (SELECT * FROM Temp AS M WHERE M.Plat = F.Plat AND F.Od < M.Od AND M.Od < L.Do AND NOT EXISTS (SELECT * FROM Temp AS T1 WHERE T1.Plat = F.Plat AND T1.Od < M.Od AND M.Od <= T1.Do AND NOT EXISTS (SELECT * FROM Temp AS T2 WHERE T2.Plat = F.Plat AND ((T2.Od < F.Od AND F.Od <= T2.Do) OR (T2.Od < L.Do AND L.Do < T2.Do))) Historie platů – pro každý plat, který kdy zaměstnanec pobíral spočtěte období, po které jej trvale pobíral.

11 Temporální spojení Stejné jako spojení (join) v klasických databázích
Navíc bere v úvahu čas události Příklad v SQL: Zaměstnanec1(Jméno, Plat, Platí_od, Platí_do) Zaměstnanec2(Jméno, Funkce, Platí_od, Platí_do) Pro každého zaměstnance najděte historii platů a funkcí Myšlenka: Pro každou dvojici (Plat, Funkce) najít průnik intervalů (Platí_od, Platí_do) z obou relací. Realizace: Rozbor případů Čas události bude vysvětlen později Klasické spojení funguje tak, že zadáme sloupce a podmínku, která říká, kdy jsou dva řádky tabulky spojeny. Obdobnou funkčnost požadujeme od temporálního join. V temporálních databázích ale nemusíme zadávat sloupce uchovávající čas, pouze podmínku na spojení pro čas.

12 Studie konkrétního případu
Historie platů a funkcí v TSQL SELECT Zaměstnanec1.Plat, Zaměstnanec2.Funkce FROM Zaměstnanec1, Zaměstnanec2 WHERE Zaměstnanec1.Jméno = Zaměstnanec2.Jméno Tabulky jsou spojeny nejen na explicitně zadané podmínce Zaměstnanec1.Jméno = Zaměstnanec2.Jméno ale také na podmínce průniku časů událostí v obou tabulkách Tímto skončím s motivací a příklady a dostaneme se k základům temporálních databází.

13 Modely času Temporální logika: čas je libovolná množina okamžiků s daným uspořádáním Modely času podle uspořádání Lineární Větvený (čas možných budoucností) Cyklický Modely času podle hustoty Diskrétní Hustý Spojitý Omezenost času Absolutní / relativní čas Lineární Čas roste od minulosti k budoucnosti lineárně Větvený (čas možných budoucností) Lineární minulost až do teď, pak se větví do několika časových linií reprezentujících možný sled událostí Každá linie se může dále větvit Cyklický Opakující se procesy Příklad: týden, každý den se opakuje po sedmi dnech Diskrétní Spolu s lineárním uspořádáním Každý okamžik má právě jednoho následníka Každé přirozené číslo odpovídá nerozložitelné jednotce času (chronon). Chronon je nejmenší časová jednotka reprezentovatelná v diskrétním modelu. Není to okamžik, ale doba. Hustý Isomorfní s racionálními nebo reálnými čísly Mezi každými dvěma okamžiky existuje nějaký další Spojitý Isomorfní s reálnými čísly Na rozdíl od racionálních čísel, neobsahuje „mezery“ Každé reálné číslo odpovídá bodu v čase (okamžiku) Omezenost času Omezený – nutnost zejména kvůli reprezentaci v počítači Neomezený Absolutní čas – vyjádří se hodnotou. Také ale potřebuje počátek. Relativní čas – vyžaduje nějaký počátek, čas se pak vyjádří jako vzdálenost a směr od počátku.

14 Datové typy pro čas Časový okamžik (instant) (SQL-92)
DATE TIME TIMESTAMP Časový úsek (time period) Doba mezi dvěma časovými okamžiky 15:30 – 15:50 Časový interval (interval) Doba o specifikované délce, ale bez konkrétních krajních bodů 30 minut Množina časových okamžiků (instant set) Množina časových úseků (temporal elements) DATE Nejmenší jednotka je den v roce TIME Nejmenší jednotka je sekunda v rámci 24 hodin TIMESTAMP Nejmenší jednotka je zlomek sekundy, standardně mikrosekunda v rámci 24 hodin INTERVAL Temporal elements Konečná množina time periods Datové typy reprezentující čas musí být reprezentovatelné v počítači. Nejjednodušším způsobem omezená diskrétní reprezentace celočíselným počte časových okamžiků od pevného počátku. Hustá reprezentace je také poměrně jednoduchá na implementaci, protože racionální čísla jsou hustá a každé racionální číslo lze vyjádřit jako podíl dvou celočíselných. Spojitá reprezentace je nejsložitější.s

15 Vztah událostí a času Čas platnosti (valid time)
Čas, kdy byla událost pravdivá v reálném světě Může být v minulosti, přítomnosti i budoucnosti Transakční čas (transaction time) Čas, kdy byl fakt reprezentován v databázi Nabývá pouze aktuální hodnoty Monotónně roste Čas platnosti a transakční čas jsou ortogonální Čas události Nezávislý na zaznamenávání události do databáze Může být v minulosti, přítomnosti i budoucnosti Čas transakce Identifikuje transakci, která vložila data do databáze a transakci, která informaci z databáze odstranila Čas události a čas transakce jsou ortogonální. V některých případech mohou být oba časy korelované.

16 Vztah událostí a času snapshot valid-time transaction-time
Datový model nepodporující čas platnosti ani transakční čas valid-time Datový model podporující pouze čas platnosti transaction-time Datový model podporující pouze transakční čas bitemporální Datový model podporující čas platnosti i transakční čas temporální Datový model podporující čas platnosti nebo transakční čas Obvykle založeno na relačním datovém modelu nebo objektově orientovaném datovém modelu.

17 snapshot relace Datový model nepodporující čas platnosti ani transakční čas Klasický relační model Každá n-tice je fakt platný v reálném světě Při změně reálného světa jsou do relace prvky přidávány nebo z ní odebírány

18 transaction-time relace
Datový model podporující pouze transakční čas Posloupnost snapshot-ů indexované transakčním časem Umožňuje získat informaci ze stavu databáze v nějakém okamžiku minulosti Je možné uvažovat i větvení Na začátku byla relace prázdná První instrukce do relace vložila tři fakty (n-tice) => což znamená přidání nového snapshotu s časem commitu do posloupnosti Další transakce vložila do relace jednu n-tici => další stav byl přidán do posloupnosti Poslední transakce odstranila z relace první n-tici a jinou vložila => další stav vložen do posloupnosti Poznámky Na rozdíl od snapshot relací, transakce nemodifikují existující data v transaction-time relacích. Změna je provedena ve snapshotu aktuálního stavu a nově vzniklý stav je přidán do relace. Transaction-time relace jsou read-only.

19 valid-time relace Datový model podporující pouze čas platnosti
Cokoliv v relaci může být upraveno Hodnoty n-tic Čas události (začátek i konec) Umožňuje klást dotazy o faktech platných v minulosti i budoucnosti Nelze zjistit stav databáze v konkrétním časovém okamžiku (transaction time)

20 bitemporální relace Datový model podporující čas platnosti a transakční čas append-only Na začátku byla relace prázdná První instrukce do relace vložila tři fakty (n-tice) Další transakce vložila do relace jednu n-tici Poslední transakce ukončila jednu událost (logicky odstranila) z relace první n-tici a jinou vložila Byl změněn čas platnosti (počátek na pozdější čas) události, která byla vložena v první transakci Poznámky Na rozdíl od snapshot relací, transakce nemodifikují existující data v transaction-time relacích. Změna je provedena ve snapshotu aktuálního stavu a vyniklý nový stav je přidán do relace. Transaction-time relace jsou read-only.

21 Reprezentace „času platnosti“
časový okamžik doba časový úsek množina okamžiků Čas platnosti může být přidružen k atributu množině atributů celé n-tici nebo objektu Rozšíření operací relační algebry

22 Reprezentace „transakčního času“
časový okamžik nová n-tice se stejným klíčem => logické odstranění původní časový úsek (teď, dokud nezměněno) tři časové okamžiky čas zaznamenání začátku události v reálném světě čas zaznamenání konce události v reálném světě čas logického odstranění události z databáze Množina časových úseků Někdy podporován i versioning

23 Příklady datových modelů (1)
Segevův datový model Podporuje pouze čas platnosti Razítko označuje, kdy fakt začal platit Jméno Oddělení Čas Erik Obuv 1 Knihy 6 11 Null 13 Razítkují se řádky relace. Razítko je jeden chronon. Erik začal pracovat v Obuvi 1.6., pak se přesunul do Knih 6.6. a vrátil se zpátky do Obuvi 13.6. Skončil 13.6., což vyžaduje zvláštní řádek s hodnotami Null pro všechny neklíčové atributy.

24 Příklady datových modelů (2)
Sardův datový model Podporuje jen čas platnosti Razítko má podobu intervalu Jméno Oddělení Čas Erik Obuv [1-5] Knihy [6-10] [11-12] Razítkují se řádky relace. Razítko je dvojice chrononů. Narozdíl od předchozího případu(Segev) nepotřebujeme zvláštní řádek na vyjádření toho, že Erik v práci skončil.

25 Příklady datových modelů (3)
Datový model HRDM Podporuje jen čas platnosti Razítkují se hodnoty atributů Jméno Oddělení 1 ® Erik 12 ® Erik 1 ® Obuv 5 ® Obuv 6 ® Knihy 10 ® Knihy 11 ® Obuv 12 ® Obuv Hodnoty atributů jsou funkce z časové do hodnotové domény. Celá Erikova „zaměstnanecká“ historie je v jediném řádku relace.

26 Příklady datových modelů (4)
Extensionální datový model Jméno Odd VT TT Erik Obuv 1 2 8 5 Knihy 6 11 Jméno Odd VT TT Erik Knihy 6 11 10 Obuv 1 13 5 12 Razítkuje se každý řádek jedním chrononem času platnosti a jedním chrononem transakčního času.

27 Příklady datových modelů (5)
Bhargavův datový model Jméno Oddělení [1, 12] x [1, ] Erik [13, ] x [1, 12] Erik [1, 7] x [1, ] Obuv [8, 10] x [1, 5] Obuv [8, 10] x [6, ] Knihy [11, 12] x [1, 5] Obuv [11, 12] x [6, 10] Knihy [11, 12] x [11, ] Obuv [13, ] x [1, 5] Obuv [13, ] x [6, 10] Knihy [13, ] x [11, 12] Obuv

28 Temporální dotazovací jazyky
Temporální datový model Objekty se přesně danou strukturou Omezení pro dané objekty Operace na daných objektech Temporální dotazovací jazyky

29 Temporální dotazovací jazyky
Velké množství Nejčastěji založeny na SQL Typy Relační př.: HQL, HSQL, TDM, TQuel, TSQL, TSQL2 Objektově orientované př.: MATISSE, OSQL, OQL, TMQL

30 Shrnutí Ideální temporální datový model
Minimální rozšíření existujícího DM Souvislá prezentace chování měnícího se v čase Snadná implementace Vysoký výkon Dosažení ideálu je prakticky nemožné

31 Shrnutí Hlavní cíl temporálního DM by měl být zachytit sémantiku dat měnící se v čase Ale často se dostává do pozadí Mnoho nekompatibilních datových modelů s mnoha dotazovacími jazyky

32 TSQL2

33 Obsah Čas v TSQL2 Datový model Vytvoření relace Příkaz SELECT
Modifikační příkazy Shrnutí

34 TSQL2 Temporal Structrured Query Language 2
Měl sjednotit přístupy k temporálním datovým modelům Nadmnožina SQL-92 TSQL2 byl navržen skupinou asi 18 badatelů, kteří už dříve samostatně navrhli mnoho různých temporálních dotazovacích jazyků. Cílem TSQL2 bylo sjednotit přístupy k temporálním datovým modelům a dotazovacím jazykům založeným na kalkulu a získat sjednocené rozšíření SQL-92 a datový model, nad kterým by mohl být založen další výzkum. TSQL2 bylo začleněno do vyvíjejícího se standardu SQL3.

35 Pojetí času Časová osa TSQL2 je na obou koncích omezena, ale dostatečně daleko (18 miliard let) U časových údajů jsou možné různé granularity Časové typy DATE, TIME, TIMESTAMP, INTERVAL, PERIOD 18 miliard let je zvoleno podle doby, před jakou mělo dojít k Velkému třesku. Po sobě jdoucí chronony mohou být seskupovány do granulí, různým seskupováním dosáhneme různých granularit. Všechny uvedené časové typy kromě PERIOD byly už v SQL-92.

36 Datový model Je použit BCDM (Bitemporal Conceptual Data Model)
Řádek relace je orazítkován množinou bitemporálních chrononů Bitemporální chronon je dvojice (chronon transakčního času, chronon času platnosti) Množina bitemporálních chrononů se také nazývá bitemporální element. Každý bitemporální chronon odpovídá malému obdelníčku ve dvourozměrném prostoru (transakční čas x čas platnosti ). Protože nejsou povoleny duplicitní řádky, tak celá historie jednoho faktu je na jednom řádku. Říkáme, že BCDM je slévaný datový model.

37 Příklad bitemporální relace (1)
Relace Zaměstananec – umístění lidí v odděleních určitého podniku Schéma (Jméno, Oddělení) + časové razítko Předpokládejme granularitu 1 den u času platnosti i u transakčního času

38 Příklad bitemporální relace (2)
VT TT 5 10 15 20 25 30 (Kuba, doprava) Časový úsek našeho zájmu je daný měsíc v daném roce, tedy 15 znamená např Zaměstnanec Kuba byl najmut jako dočasná výpomoc v oddělení dopravy na dobu od 10. do 15. a tento fakt se objevil v databázi 5. Šipky směřující doprava značí, že řádek nebyl logicky smazán; jeho platnost pokračuje až do času until changed (U.C.).

39 Příklad bitemporální relace (3)
5 10 15 20 25 30 VT TT (Kuba, doprava) Personální oddělení zjistilo, že Kuba byl ve skutečnosti najmut na dobu od 5. do 20. a databáze je opravena 10.

40 Příklad bitemporální relace (4)
5 10 15 20 25 30 VT TT (Kuba, doprava) Později bylo personální oddělení informováno, že samotná oprava byla nesprávná a že Kuba skutečně byl skutečně najmut na dobu od 10. do 15. a tato oprava se objeví v databázi 15.

41 Příklad bitemporální relace (5)
(Kuba, nakládání) 5 10 15 20 25 30 VT TT (Kuba, dop.) (Katka, doprava) Personální oddělení zjistí, že Kuba sice pracoval od 5. do 10., ale ne v oddělení dopravy, nýbrž v oddělení nakládání. Navíc je najmuta Katka pro práci v oddělení dopravy na dobu od 25. do 30. Všechny zmíněné změny se objeví v databázi 25.

42 Příklad bitemporální relace (6)
Jméno Oddělení Časové razítko Kuba Doprava {(5, 10),…,(5,15),…(9, 10),…,(9, 15), (10,5),...,(10,20),...,(14,5),...,(14,20), (15,10),...,(15,15),...,(24,10),...,(24,15)} Nakládání {(U.C., 10), …, (U.C., 15)} Katka {(U.C., 25), …, (U.C., 30)} „Negrafická“ reprezentace posledního obrázku U.C.(until changed) znamená, že řádek nebyl z databáze logicky smazán (neboli stále si myslíme, že platí)

43 Definice schématu Příklad Čas platnosti má granularitu 1 den
CREATE TABLE Předpis (Jméno CHAR(30), Lékař CHAR (30), Lék CHAR (30), Dávka CHAR (30), Frekvence INTERVAL MINUTE) AS VALID STATE DAY AND TRANSACTION Čas platnosti má granularitu 1 den Transakční čas má granularitu 1 ms nebo menší Čas platnosti specifikuje úsek, kdy měl pacient lék předepsaný. Transakční čas určuje, kdy se tato informace nalézala v databázi. Řádky, které nebyly updatovány nebo smazány, budou mít transakční čas obsahující nynější okamžik.

44 Příkaz SELECT Komu byl předepsán nějaký lék?
SELECT SNAPSHOT Jméno FROM Předpis Kdo bral (bere) lék Proventil? SELECT SNAPSHOT Jméno FROM Předpis WHERE Lék = ‘Proventil’ První dotaz vrátí jména všech pacientů, kterým byl předepsán nějaký lék. Druhý dotaz vrátí jména všech pacientů, kterým byl předepsán Proventil.

45 Příkaz SELECT Komu byl předepsán nějaký lék a kdy? SELECT Jméno
FROM Předpis TSQL2 provede automaticky slévání, a tak výsledkem je množina řádků, každý asociovaný s jednou nebo více maximálních period, během kterých pacient bral aspoň jeden lék.

46 Příkaz SELECT Které léky byly užívány současně s lékem Proventil?
SELECT P1.Jméno, P2.Lék FROM Předpis AS P1, Předpis AS P2 WHERE P1.Lék = ‘Proventil’ AND P2.Lék <> Proventil AND P1.Jméno = P2.Jméno Provede se spojení dvou tabulek Předpis přes jméno a potom se vybírají řádky takové, že obsahují dvojice léků, z nichž ten první je Proventil a ten druhý je nějaký jiný lék. TSQL2 navíc zajišťuje, že se při spojení spojují jen řádky, u nichž je průnik jejich časových razítek neprázdný a tento průnik je pak novým časovým razítkem. Tím máme zajištěno, že pacient oba léky pobíral alespoň nějakou dobu současně. Na konci se opět provede slévání a tedy výsledkem je množina řádků, kde každý z nich určuje nějakého pacienta a nějaký lék spolu s maximálními periodami, během nichž daný pacient daný lék bral současně s Proventilem.

47 Restrukturalizace Na úrovni klauzule FROM se provede projekce a slévání Kdo měl (má) brát nějaký lék déle než 6 měsíců (v souhrnu)? SELECT Jméno, Lék FROM Předpis(Jméno, Lék) AS P WHERE CAST(VALID(P) AS INTERVAL MONTH) > INTERVAL ‘6’ MONTH V klauzuli FROM se vyberou atributy Jméno a Lék(provede se projekce) a provede se slévání, tedy pro každou dvojici Jméno-Lék budeme mít jen jeden řádek s časovým razítkem odpovídajícím množině maximálních časových úseků, kdy pacient lék užíval, nezávisle na předepisujícím lékaři, dávce či frekvenci užívání. Konstrukce VALID(P) vrací element času platnosti(množinu max. period) spojený s P. Potom ho operátor CAST konvertuje na typ INTERVAL MONTH sečtením délek(v měsících) maximálních period. Tím dostáváme údaj, jak dlouho v souhrnu pacient daný lék užíval, a porovnáme ho s intervalovou konstantou 6 měsíců. Výsledkem je množina řádků, kde každý obsahuje jméno pacienta, lék a časové razítko určující, kdy pacient lék bral(bude brát).

48 Restrukturalizace Kdo po celou dobu léčby bere Proventil?
SELECT SNAPSHOT P1.Jméno FROM Předpis(Jméno) AS P1, P1(Lék) AS P2 WHERE P2.Lék = ‘Proventil’ AND VALID(P2) = VALID(P1) V první části klauzule FROM se provede projekce, slévání a dostaneme relaci se jménem a časovým razítkem odpovídajícím době, kdy pacient bral nějaký lék. V druhé části klauzule FROM se vyberou atributy Jméno (z P1) a Lék a opět se provede slévání a časové razítko bude odpovídat době, kdy pacient bral daný lék. Navíc protože P2 je definováno jako P1(Lék), tak TSQL2 zajistí, že atribut Jméno bude mít stejnou hodnotu pro P1 i P2(tedy došlo ke spojení na rovnost P1.Jméno=P2.Jméno). V klauzuli WHERE se vyberou řádky splňující VALID(P1)=VALID(P2), tedy takoví pacienti, kteří kdykoliv brali nějaký lék, tak současně brali i Proventil.(Vždycky samozřejmě platí VALID(P1) CONTAINS VALID(P2).) A protože je použito SNAPSHOT, tak se jen vyberou jména takových pacientů(už se tedy nedělá.

49 Partitioning Kdo měl předepsaný jeden lék déle než 6 měsíců nepřerušovaně? SELECT SNAPSHOT Jméno, Lék, VALID(P) FROM Předpis(Jméno, Lék)(PERIOD) AS P WHERE CAST(VALID(P) AS INTERVAL MONTH) > INTERVAL ‘6’ MONTH; Parcializace. Někdy potřebujeme potřebujeme zjistit maximalní souvislé období. Použijeme restrukturalizaci v klauzuli FROM a navíc přidáme klíčové slovo PERIOD. To zajistí, že ke každé dvojici Jméno, Lék není množina intervalů, ale jednotlivé maximální souvislé časové intervaly. Tedy P může obsahovat několik řádků se stejným jménem a lékem, ale jiným maximálním souvislým časovým intervalem. Takové rozdělení do přihrádek, kde každá přihrádka je reprezentována jednou hodnotou. Ve WHERE se potom pouze tyto maximální intervaly (VALID(P)) převedou pomocí fce. CAST na typ INTERVAL MONTH a porovnají. Ve výsledku je potom Jméno, Lék a hodnota typu PERIOD (maximální souvislý interval). Tedy mohou být řádky se stejným Jménem a Lékem, ale s rozdílnými hodnotami VALID(P).

50 Jde to i jinak VALID(P) lze užít v SELECT pouze při použití PERIOD
SELECT Jméno, Lék FROM Předpis(Jméno, Lék)(PERIOD) AS P WHERE CAST(VALID(P) AS INTERVAL MONTH) > INTERVAL ‘6’ MONTH; VALID(P) lze užít v SELECT pouze při použití PERIOD Dostaneme pro každou dvojici Jméno, Lék pouze jeden řádek. Pokud nemáme tabulku rozdělenou pomocí PERIOD do tříd ekvivalence, pak VALID(P) representuje množinu intervalů, což nelze nějak rozumně presentovat

51 Klauzule VALID Jaké léky měla Marie předepsané v roce 1996? SELECT Lék
VALID INTERSECT (VALID(Předpis), PERIOD ‘[1996]’ DAY) FROM Předpis WHERE Jméno=‘Marie’ Někdy potřebujeme omezit čas platnosti pouze na určité období. Použijeme k tomu klauzuli VALID a operátor průniku INTERSECT Výsledkem je seznam léků a ke každému léku je přiřazena množina intervalů z roku 1996 během nichž Marie užívala tento lék.

52 Modifikace údajů v tabulce
INSERT DELETE UPDATE

53 INSERT Vlož nový předpis. Defaultní hodnota INSERT INTO Předpis
VALUES ( ‘Marie’, ‘Dr. Beran’, ‘Proventil’, ‘100mg’, INTERVAL ‘8:00’ MINUTE) Defaultní hodnota VALID PERIOD(CURRENT_TIMESTAMP, NOBIND(CURRENT_TIMESTAMP)) V tomto příkladě nespecifikujeme hodnotu transakčního času a času platnosti. Defaultně se nastaví na. CURRENT_TIMESTAMP vrátí hodnotu systémového času, převede do typu uvedeného v definici tabulky, tedy na dny. Klauzule NOBIND zajistí, že čas platnosti není omezen. Tedy když se na tuto hodnotu nějakým selectem zeptáme, tak vrátí jako horní mez hodnotu systémového času v době dotazu. Transakční čas podobně na hodnotu CURRENT_TIMESTAMP do U.C. ( until change )

54 INSERT Vlož nový předpis s omezenou dobou platnosti
INSERT INTO Předpis VALUES ( ‘Marie’, ‘Dr. Beran’, ‘Proventil’, ‘100mg’, INTERVAL ‘8:00’ MINUTE) VALID PERIOD ‘[ – ]’ Insert ne vždy musí vložit nový řádek. Může se stát, že dojde pouze ke slití časů platnosti s již existujícím záznamem. Transakční čas podobně na hodnotu CURRENT_TIMESTAMP do U.C. ( until change )

55 DELETE Marie neměla v červnu 1996 předepsaný žádný lék.
DELETE FROM Předpis WHERE Jméno = ‘Marie’ VALID PERIOD ‘[ – ]’ Některé záznamy mohou být odebrány, některé pouze pozměněny ( zkrácená jejich doba platnosti ), některých se to vůbec netýká ( jejich doba platnosti se nepřekrývá s údajem ve VALID )

56 UPDATE Změň dávkování léku Proventil na 50 mg. UPDATE Předpis
SET Dávkování TO ‘50mg’ WHERE Jméno = ‘Marie’ AND Lék = ‘Proventil’ Ovlivní všechny záznamy, které jsou platné. Tj. všechny záznamy jejichž doba platnosti se protíná s časem UPDATU

57 UPDATE Změň dávkování léku od března do května. UPDATE Předpis
SET Dávkování TO ‘50mg’ VALID PERIOD ‘[ – ]’ WHERE Jméno = ‘Marie’ AND Lék = ‘Proventil’

58 Zaznamenání událostí Definice tabulky laboratorních testů.
CREATE TABLE LabTest ( Jméno CHAR(30), Lékař CHAR(30), ČísloTestu INTEGER) AS VALID EVENT HOUR AND TRANSACTION ( x AS VALID STATE DAY AND TRANSACTION ) Zatím jsme ukládali fakta, které měli nějakou dobu trvání. Nyní si ukážeme jak uložit události, u kterých se zaznamenává pouze čas, kdy se událi, ne jak dlouho trvali. Stačí nám čas testu v hodinách, nepotřebujeme v minutách. ČísloTestu určuje o jaký test se jedná, např. krevní obraz atd.

59 Restrukturalizace Který lékař objednával testy jedinému pacientovi a současně tento lékař byl jediný, kdo danému pacientovi testy objednával? SELECT L1.Jméno, L2.Lékař FROM LabTest(Jméno) AS L1, L1(Lékař) AS L2, LabTest(Lékař) AS L3 WHERE VALID(L1) = VALID(L2) AND L2.Lékař = L3.Lékař AND VALID(L1) = VALID(L3) Hledáme dvojice lékař pacient, kdy lékař objednává testy pouze tomuto pacientovy a nikomu jinému a současně tento lékař je jediným lékařem tohoto pacienta. Tj. žádný jiný lékař tomuto pacientovii test neobjednal. VALID(L1) = VALID(L2) zajistí, že všechny testy, které byli pacientovi udělány objednal L2.Lékař VALID(L1) = VALID(L3) zajistí, že všechny testy byly objednány L3.Lékař

60 Transakční čas Jaké léky měla Marie předepsány? SELECT Lék
FROM Předpis WHERE Jméno = ‘Marie’ Vypíše všechny nyní platné záznamy z tabulky Lék. V potaz se berou opravy, které byli během času provedeny. Tj. ty které mají platný neukončený transakční čas < CURRENT_TIMESTAMP

61 Transakční čas Jaké záznamy o lécích, které měla předepsány Marie, byly uvedeny v databázi 1. června 1996? SELECT Lék FROM Předpis WHERE Jméno = ‘Marie’ AND TRANSACTION(P) OVERLAPS DATE ‘ ’ Vrátí maximální interval transakčního času, který se překrývá s datem a hodnota atributů a času platnosti byla konstantní. Vrátí záznamy, které byly uvedeny v databázi Pokud hodnotu TRANSACTION(P) neuvedeme bere se defaultně hodnota TRANSACTION(P) OVERLAPS CURRENT_TIMESTAMP

62 Transakční čas Kdy byly naposledy změněny záznamy, které se vztahují ke dni ? SELECT SNAPSHOT BEGIN(TRANSACTION(P2)) FROM Předpis AS P1, P2 WHERE P1.Jméno = ‘Marie’ AND P2.Jméno = ‘Marie’ AND VALID(P1) OVERLAPS DATE ‘ ’ AND VALID(P2) OVERLAPS DATE ‘ ’ AND TRANSACTION(P1) MEETS TRANSACTION(P2) TRANSACTION(P1) MEETS TRANSACTION(P2) – řádek asociovaný s P1 byl opravený řádkem asociovaným s P2

63 Agregační funkce Kolik léků Marie brala?
SELECT COUNT(*) FROM Předpis WHERE Jméno = ‘Marie’ Kolik lidí má předepsané jednotlivé léky? SELECT Lék, COUNT(*) GROUP BY Lék

64 RISING Jaké bylo nejdelší období, kdy dávka Proventilu pro Marie rostla? SELECT SNAPSHOT RISING(Dávka) FROM Předpis WHERE Jméno = ‘Marie’ AND Lék = ‘Proventil’ RISING nová agregační funkce. Vrací nejdelší interval, po který daný atribut monotóně roste.

65 Změna schématu tabulky
přidáme k tabulce nový sloupec IdČíslo. ALTER TABLE Předpis ADD COLUMN IdČíslo INTEGER Zobrazení dat ve starém schématu SET SCHEMA DATE ‘ ’ Narozdíl od normální databáze, tímto příkazem nezničíme předchozí schéma databáze. Nemůžeme měnit transakční čas u již uložených záznamů. Je to append-only. Zapíše se nové schéma databáze i se všemi daty z předchozího schématu. Velkou výhodou je, že TSQL umožňuje poté zobrazovat data jak ve starém schématu. Nově přidaný sloupec prostě není dostupný.

66 Převody času CAST vždy vrací přesný výsledek
SCALE může vrátit „nepřesný“ výsledek CAST(TIMESTAMP ‘ :24:00’ AS DAY) SCALE(TIMESTAMP ‘ :24:00’ AS DAY) U obou výsledek ‘ ’ CAST(DAY ‘ ’ AS SECOND) Výsledkem je 1. sekunda tohoto dne. SCALE(DAY ‘ ’ AS SECOND) Výsledkem je nějaká sekunda tohoto dne. SCALE je nedeterministický. Rozdíl je v převodu na menší jednotky. U převodu na větší není rozdíl. Slouží k vyjádření dotazů typu někdy minulý týden apod.

67 Shrnutí Výsledek bez podpory času SELECT SNAPSHOT
Restrukturalizace – provede projekci na vybrané sloupce a provede slití času platnosti ekvivalentních řádků Partitioning – vybere nejdelší interval(y) času platnosti pro každou řádku


Stáhnout ppt "Temporální databáze a TSQL"

Podobné prezentace


Reklamy Google