Overview of Temporal Databases & TSQL2 Tomáš Hladík
Přehled O SQL92 v kombinaci s časem O Temporální databáze O TSQL2 2
Pohled času O Rozvrhy O Platy O Události O Zkoušky O Reklamy O Logování 3
Klasické databáze O Zachycují moment v čase O Obtížnější práce s časem O Veškerou práci řídí aplikační programy O DELETE / UPDATE typicky maže stav a vytvoří nový O Klasicky speciální sloupce pro časové úseky O Historie rozvrhů – pod který semestr patří O Složitější zdrojový kód 4
Temporální databáze O Hledisko času O Ukládají historii O Dva typy databází podle časových údajů O KDY / JAK DLOUHO událost trvala O Čas určujeme sami O KDY byla událost nastala O Čas se měří automaticky 5
Klasické databáze CASE STUDY O Příklad univerzity a svých zaměstnanců O Tabulka EMPLOYEE O Jaký mám Bob plat? SELECT Salary FROM Employee WHERE Name = `Bob` NameString SalaryInteger TitleString 6
CASE STUDY O Jaké je datum narození Boba? SELECT DateOfBirth FROM Employee WHERE Name = `Bob` O PROBLÉM: historie NameString SalaryInteger TitleString DateOfBirthDate 7
CASE STUDY NameString SalaryInteger TitleString DateOfBirthDate StartDate StopDate 8
CASE STUDY O Jaký je aktuální plat Boba? SELECT Salary FROM Employee WHERE Name = `Bob` AND Start <= CURRENT_DATE AND Stop >= CURRENT_DATE 9
CASE STUDY 10
Historie platů – 1. pokus CREATE TABLE Temp(Salary, Start, Stop) AS SELECT Salary, Start, Stop FROM Employee WHERE Name = `Bob` 11
Historie platů – 1. pokus repeat UPDATE Temp T1 SET (T1.Stop) = (SELECT MAX(T2.Stop) FROM Temp AS T2 WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop) WHERE EXISTS (SELECT * FROM Temp AS T2 WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop) until no tuples updated 12 Vytvoříme maximální délku
Historie platů – 1. pokus DELETE FROM Temp T1 WHERE EXISTS (SELECT * FROM Temp AS T2 WHERE T1.Salary = T2.Salary AND ((T1.Start > T2.Start AND T1.Stop <= T2.Stop) OR (T1.Start >= T2.Start AND T1.Stop < T2.Stop)) 13 Menší úseky smažeme
Historie platů – 2. pokus SELECT DISTINCT F.Salary, F.Start, L.stop FROM Temp AS F, Temp AS L WHERE F.Start < L.Stop AND F.salary = L.Salary AND NOT EXISTS (SELECT * FROM Temp AS M WHERE M.Salary = F.Salary AND F.Start < M.Start AND M.Start < L.Stop AND NOT EXISTS (SELECT * FROM Temp AS T1 WHERE T1.Salary = F.Salary AND T1.Start < M.Start AND M.Start <= T1.Stop)) AND NOT EXISTS (SELECT * FROM Temp AS T2 WHERE T2.Salary = F.Salary AND ((T2.Start < F.Start AND F.Start <= T2.Stop) OR (T2.Start < = L.Stop AND L.Stop < T2.Stop))) 14 Platy na sebe navazují Období je maximální
Historie platů – 3. pokus DECLARE emp_cursor CURSOR FOR SELECT Salary, Title, Start, Stop FROM Employee WHERE Name = `Bob` OPEN emp_cursor loop: FETCH emp_cursor INTO :salary, :start, :stop if no data returned then goto finished; find position in linked list to insert this information goto loop; finished: CLOSE emp_cursor; iterate through linked list, printing out dates and salaries 15
Historie platů – TSQL2! SELECT Salary FROM Employee WHERE Name = ´Bob´ 16
Historie platů SQL, další problém O Co když oddělíme historii platu a historii pozice? O Employee1(Name, Salary, Start, Stop) O Employee2(Name, Dept, Start, Stop) 17
18
Historie platů – TSQL2 SELECT Salary.Name, Salary, Dept FROM Employee1, Employee2 WHERE Employee1.Name = Employee2.Name 19
SQL92 vs. TSQL2 O Čas je běžným problémem O Klasický SQL dotaz může být velmi komplikovaný O Ztráta přehlednosti 20
Modely času O Lineární model O Je uspořádán a postupuje po „krocích“, např. dnech O Cyklický model O Dny v týdnu / měsíci O Diskrétní model O Isomorfní k přirozeným číslům (axiom následníků) O Nejčastěji používaný O Nekonečný model O Isomorfní k reálným číslům 21
Čas a SQL92 O DATE O TIME O TIMESTAMP O INTERVAL O V některých DB ani není podporován O Typy: Year-month & second-day 22
Čas O 2 hlavní typy O VALID time O KDY událost nastala / JAK DLOUHO trvala O TRANSACTION time dimension O JAK DLOUHO událost trvala O KDY začala platit a KDY byla zneplatněná O viz platy O SNAPSHOT O DB nepodporující ani jeden typ 23
Rozdíly O VALID time O Možnost vkládat jakýkoli čas O TRANSACTION time O Čas je počítán od doby založení DB O Nelze měnit 24
Časové datové modely O Relační vs. Objektově-orientované 25
Časové datové modely O Valid-time vs. Transaction time 26
Příklady datových modelů O Sevgev‘s valid-time data model O Začátek události O Neumožňuje souběh dvou činností 27
Příklady datových modelů O Sarda‘s data model (valid) O Umožňuje souběh více činností O Null není povinná 28
Příklady datových modelů O HRDM data model (valid) O Funkce: z času do hodnot atributů 29
Příklady datových modelů O The extensional data model O Obě časové dimenze O Kompletně popisuje historii O Kdy se co stalo O Kdy se co změnilo O Paměťově náročné 30
Příklady datových modelů O Bhargava‘s data model O 1. transaction time O 2. valid time 31
Dotazovací jazyky O 40 datových modelů O Každý má lehce odlišnou sémantiku O Jiný dotazovací jazyk 32
TSQL2 Temporal Structured Query Language 33
TSQL2 O Na návrhu se podílelo 18 lidí O Nadmnožina SQL92 O Základ pro nový standard SQL3 O Lineární časový model O 18 miliard let do minulosti O 18 miliard let do budoucnosti O Diskrétní reprezentace časového prostoru O Různé granularity 34
TSQL2 O BCDM O Bitemporal Conceptual Data Model O Valid-time & transaction-time 35
TSQL2 – CREATE TABLE CREATE TABLE Prescription (Name CHAR(30), Physician CHAR(30), Drug CHAR(30), Dosage CHAR(30), Frequency INTERVAL MINUTE) AS VALID STATE DAY AND TRANSACTION O AS – nová konstrukce O SNAPSHOT – bez podpory času O VALID STATE O VALID EVENT O TRANSACTION O VALID STATE AND TRANSACTION O VALID EVENT AND TRANSACTION 36
TSQL2 - SELECT O Komu byly předepsané léky? SELECT SNAPSHOT Name FROM Prescription O Komu byl předepsán Proventil? SELECT SNAPSHOT Name FROM Prescription WHERE Drug = ´Proventil´ 37
TSQL2 - SELECT O Historie SELECT Name FROM Prescription O Jaké léky byly předepsané společně s Proventilem? SELECT P1.Name, P2.Drug FROM Prescription AS P1, Prescription AS P2 WHERE P1.Drug = ´Proventil´ AND P2.Drug <> ´Proventil´ AND P1.Name = P2.Name O Výsledek trojice (Jméno, lék, max čas), kdy byly léky užívány společně 38
TSQL2 – SELECT Restructuring O Kdo bral léky déle než 6 měsíců? SELECT Name, Drug FROM Prescription(Name, Drug) AS P WHERE CAST(VALID(P) AS INTERVAL MONTH) > INTERVAL ´6´ MONTH O Prescription(Name, Drug) - čas (maximální, kdy pacient užívá lék) je vztažen k této dvojici bez ohledu na další sloupce O VALID – elementy valid-time spojené se sloupci O CAST – převod na INTERVAL MONTH za pomocí součtů doby předepsání léků O Výsledek – Jméno, lék, čas předepsání 39
TSQL2 – SELECT / Restructuring O Kdo užíval Proventil po celou dobu léčení? SELECT SNAPSHOT P1.Name FROM Prescription(Name) AS P1, P1(Drug) AS P2 WHERE P2.Drug = ´Proventil´ AND VALID(P1) = VALID(P2) O FROM (SELECT Name FROM Prescription) AS P1, (SELECT Name, Drug FROM Prescription) AS P2 + WHERE P1.Name = P2.Name O P1(Drug) obsahuje podmínku na jméno, VALID(P1) obsahuje VALID(P2), opačná relace neplatí 40
TSQL2 – SELECT / Partioning O Kdo užíval nějaký lék souvisle 6 měsíců SELECT SNAPSHOT Name, Drug, VALID(P) FROM Prescription(Name, Drug) (PERIOD) AS P WHERE CAST(VALID(P) AS INTERVAL MONTH) > INTERVAL ´6´ MONTH O Případně bez „SNAPSHOT VALID(P)“ O Vrací pouze jednu dvojici (Name, Drug) s MAX intervalem O První verze může vrátit více trojic 41
TSQL2 - INSERT INSERT INTO Prescription VALUES (´Melanie´, ´Dr. Beren´, ´Proventil´, ´100mg´, INTERVAL ´8:00´ MINUTE O Výchozí hodnota transaction-time O VALID PERIOD (CURRENT_TIMESTAMP, NOBIND(CURRENT_TIMESTAMP)) O VALID PERIOD ´[ – ]´ 42
TSQL2 - DELETE DELETE FROM Prescription WHERE Name = ´Melanie´ VALID PERIOD ´[ – ]´ 43
TSQL2 - UPDATE UPDATE Prescription SET Dosage TO ´50mg´ VALID PERIOD ´[ – ]´ WHERE Name = ´Melanie´ AND Drug = ´Proventil´ 44
TSQL2 - UDÁLOSTI CREATE TABLE LabTest (Name CHAR(30), Physician CHAR(30), TestID INTEGER) AS VALID EVENT HOUR AND TRANSACTION 45
TSQL2 - UDÁLOSTI O Byl některé pacient jediným účastníkem testů u svého doktora? SELECT L1.Name, L2.Physician FROM LabTest(Name) AS L1, L1(Physician) AS L2, LabTest(Physician) AS L3 WHERE VALID(L1 ) = VALID(L2) AND L2.Physician = L3.Physician AND VALID(L1) = VALID(L3) O VALID(L1) obsahuje souhrn událostí testů na pacientovi 46
TSQL2 - HISTORIE O Výpis historie SELECT P.Drug FROM Prescription AS P WHERE Name = ´Melanie´ O Jak vypadala historie k datu ? AND TRANSACTION(P) OVERLAPS DATE ´ ´ 47
TSQL2 O Kdy byla naposledy editována data platná ke SELECT SNAPSHOT BEGIN (TRANSACTION(P2)) FROM Prescription AS P1, P2 WHERE P1.Name = ´Melanie´ AND P2.Name = ´Melanie´ AND VALID(P1) OVERLAPS DATE ´ ´ AND VALID(P2) OVERLAPS DATE ´ ´ AND TRANSACTION(P1) MEETS TRANSACTION(P2) O N-tice P1 byla opravená – jeden z atributů stavu P2 48
TSQL2 – AGREGAČNÍ FUNCKCE O SELECT COUNT(*) FROM Prescription WHERE Name=´Melanie´ O SELECT Drug, COUNT(*) FROM Prescription GROUP BY Drug O Nově RISING O Nejdelší období, kdy se atribut monotónně zvyšuje O Kdy rostlo dávkování Proventilu u Melanie? O SELECT SNAPSHOT RISING(Dosage) FROM Prescription WHERE Name=´Melanie´ AND Drug=´Proventil´ 49
TSQL2 – ÚPRAVY TABULEK O ALTER TABLE O SQL92 – dostupná jen nejnovější verze O TSQL2 – při přidání sloupce lze získat i starší verzi O Nutná podpora transactional-time 50
ZÁVĚR O Velmi dobrá podpora času O Valid-time O Transaction-time O Výrazně jednodušší dotazování O Změny v rámci tabulek mohou být verzované O Automatické uchovávání historie 51
Zdroje O Carlo Zaniolo, et al: Advanced Database Systems. Chapters 5, 6. Morgan Kaufmann Publ.,
Děkuji za pozornost 53