Temporálne databázy umožňujú zachytávať históriu biznisových a systémových zmien dát a poskytujú prostriedky na pohodlnú prácu s historickými dátami. Majú široké uplatnenie v rôznych sektoroch ako napríklad poisťovníctvo, bankovníctvo či rezervačné systémy. Umožňujú jednoduché kontrolovanie vykonaných zmien, návrat k predchádzajúcim stavom dát a rôzne analytické dotazy nad históriou. V rámci prezentácie sa budem venovať všeobecnému prehľadu oblasti, existujúcim štandardom (napr. SQL:2011) a riešeniam a na jednoduchých príkladoch predvediem hlavnú funkcionalitu temporálnych databáz. Nakoniec ešte načrtnem možnosti pridania temporálnej podpory do Postgresql a porozprávam aj o tom, ako sa snažím temporálnu podporu dostať do oficiálneho release a čo všetko také niečo obnáša.
2. Zachytávajú len jeden stav dát, väčšinou súčasný
Pri modifikácii sú staré hodnoty nahradené novými a
ďalej nedostupné
Príklad: systém na správu zamestnancov
◦ Zamestnanec požiada o zvýšenie platu
Kedy sme mu naposledy zvýšili plat a o koľko?
◦ V databáze sa „pokazili“ dáta
Akou postupnosťou operácií dáta vznikli? Kto je za to zodpovedný?
3. Návrat k historickým dátam
◦ Restore databázy + rollforward
Ťažkopádne a nedostatočné riešenie
Zavedenie histórie – časté riešenia:
◦ Triggre
◦ Uložené procedúry
◦ Aplikačná vrstva
Netriviálne problémy
◦ Dotazy
◦ Modifikujúce operácie
◦ Dátová integrita
4. Databázy pracujúce s časom, umožňujúce zachytávať
históriu v čase sa meniacich (temporálnych) dát.
Jednoduchá a efektívna práca s temporálnymi dátami
Bez nutnosti vývoja vlastných riešení
Široké spektrum uplatnenia
◦ Poisťovníctvo
◦ Bankovníctvo
◦ Zdravotníctvo
◦ Rezervačné systémy
5. Aplikačný čas
◦ Čas platnosti dát v reálnom svete
◦ Zadáva používateľ
◦ Zaznamenáva napríklad zmeny výšky platu
◦ Využitie
Analýzy vývoja dát
Historické reporty
Systémový čas
◦ Čas operácie (INSERT, UPDATE, DELETE ...) v databázovom systéme
◦ Udržiavaný databázovým systémom
◦ Zaznamenáva napríklad opravy preklepov
◦ Využitie
Audity modifikácií
Identifikácia a oprava chýb
Obnova dát
6. Snapshot databázy
◦ Uchovávajú len aktuálne dáta
7. Historické databázy
◦ Zachytávajú zmeny v reálnom svete (biznise)
8. Rollback databázy
◦ Zachytávajú zmeny v databáze samotnej
9. Bitemporálne databázy
◦ Kombinácia historických a rollback databáz
10. TSQL2 (1994)
◦ Rozšírenie SQL-92
◦ Základ novších štandardov
◦ Publikovaný, ale nebol predložený žiadnej štandardizačnej autorite
SQL/Temporal (1997)
◦ Časť štandardu SQL 3
◦ Návrh na pridanie temporálnej podpory vychádzajúcej z TSQL2 bol
zamietnutý ISO komisiou
◦ Základ niektorých existujúcich riešení
SQL 2011 (koniec 2011)
◦ Výrazné rozdiely oproti TSQL2
◦ Vydaný ISO
◦ Nie je voľne dostupný – dokopy cca 1300$
11. Len proprietárne
IBM DB2 10
◦ Rozšírená syntax
◦ Dodržiava štandard SQL 2011
Oracle 11g Workspace Manager
◦ Nepodporuje štandardy
◦ Pomocou prostriedkov databázy (uložené procedúry)
Teradata Database 13
◦ Vychádza zo SQL/Temporal
◦ Poskytuje najbohatšiu temporálnu podporu
12. Predstavuje interval hodnôt
Môže byť založený na rôznych typoch
◦ date, timestamp, integer, decimal...
◦ rôzna granularita
Rôzna uzavretosť hraníc
Operácie
◦ UNION, EXCEPT, INTERSECT
Predikáty
◦ PRECEDES, SUCCEEDS, MEETS, OVERLAPS, CONTAINS
Vhodný na vyjadrenie období platnosti záznamov
SQL 2011 – slabá podpora
13. CREATE TABLE person (
id INTEGER PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
sys_start TIMESTAMP GENERATED ALWAYS AS ROW START,
sys_end TIMESTAMP GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (sys_start, sys_end)
) WITH SYSTEM VERSIONING;
14. Syntax príkazov nezmenená
Hodnoty pre začiatok a koniec platnosti stĺpcov sa generujú automaticky
INSERT
◦ Správanie nezmenené
◦ Začiatok platnosti = začiatok transakcie
◦ Koniec platnosti = max. hodnota typu
UPDATE UPDATE
◦ Automatické vytvorenie novej verzie
a ukončenie platnosti starej verzie
◦ Len aktuálne platné riadky môžu byť 1999 2012 (zač. transakcie) 9999
modifikované
1999 2012 9999
DELETE DELETE
◦ Automatické ukončenie platnosti starej verzie
◦ Len aktuálne platné riadky môžu byť vymazané
1999 2012 9999
1999 2012
15. Bežný SELECT pracuje len s aktuálnymi verziami záznamov
◦ Spätná kompatibilita s existujúcimi aplikáciami
Na prístup k historickým verziám definuje štandard
rozšírenú syntax:
◦ FOR SYSTEM_TIME AS OF <point in time 1>
◦ FOR SYSTEM_TIME BETWEEN <point in time 1> AND
<point in time 2>
◦ FOR SYSTEM_TIME FROM <point in time 1> TO <point in
time 2>
Príklad
SELECT *
FROM person
FOR SYSTEM_TIME AS OF '2012-09-26-19.00.00.000000'
16. CREATE TABLE person (
id INTEGER,
first_name VARCHAR(50),
last_name VARCHAR(50),
bus_start TIMESTAMP NOT NULL,
bus_end TIMESTAMP NOT NULL,
PERIOD FOR bus_time (bus_start, bus_end)
PRIMARY KEY (id, bus_time WITHOUT OVERLAPS)
);
17. Hodnoty pre začiatok a koniec platnosti stĺpcov zadáva
používateľ
INSERT
◦ Syntax a správanie nezmenené
UPDATE
◦ S nezmenenou syntaxou
Ľubovoľná modifikácia riadkov v tabuľke (aj začiatok a koniec platnosti)
◦ FOR PORTION OF <application time period name> FROM <point in
time 1> TO <point in time 2>
Zabezpečené automatické rozdeľovanie riadkov
Nie je možné modifikovať začiatok a koniec platnosti riadkov
UPDATE person
FOR PORTION OF bus_time
FROM '2012-09-26-19.00.00.000000'
TO '2013-12-14-01.00.00.000000'
SET name = 'Ferko'
19. DELETE
◦ S nezmenenou syntaxou – mazanie ľubovoľných riadkov
◦ FOR PORTION OF <application time period name> FROM
<point in time 1> TO <point in time 2>
Zabezpečené automatické rozdeľovanie riadkov
DELETE FROM person
FOR PORTION OF bus_time
FROM '2012-09-26-19.00.00.000000'
TO '2013-12-14-01.00.00.000000'
21. CREATE TABLE department (
id INTEGER,
name VARCHAR(50),
bus_start TIMESTAMP NOT NULL,
bus_start TIMESTAMP NOT NULL,
PERIOD FOR business_time (bus_start, bus_end)
PRIMARY KEY (id, business_time WITHOUT OVERLAPS)
);
CREATE TABLE person (
id INTEGER,
first_name VARCHAR(50),
last_name VARCHAR(50),
department_id INTEGER,
bus_start TIMESTAMP NOT NULL,
bus_start TIMESTAMP NOT NULL,
PERIOD FOR bus_time (bus_start, bus_end)
PRIMARY KEY (id, bus_time WITHOUT OVERLAPS)
FOREIGN KEY (department_id, PERIOD bus_time)
REFERENCES department(id, PERIOD bus_time)
);
22. Množinové operácie
◦ Vyhodnocované v každom časovom okamihu
◦ Nezahrnuté v SQL 2011
◦ Príklad:
person person
id first_name last_name bus_time id first_name last_name bus_time
1 Paľko Malý [1989-1999) 1 Paľko Malý [1960-1980)
4 Janko Hraško [2006 - 2020) 2 Jožko Mrkvička [1985-2005)
2 Jožko Mrkvička [1999-∞) 3 Peter Krasko [1960 - 1970)
INTERSECT
person
id first_name last_name bus_time
2 Jožko Mrkvička [1999-2005)
23. Agregačné funkcie
◦ Vyhodnocované v každom časovom okamihu
◦ Nezahrnuté v SQL 2011
◦ Príklad:
person
id first_name last_name salary bus_time SELECT SUM(salary) FROM person
1 Paľko Malý 1000 [1960-1980)
2 Janko Hraško 900 [1970 - ∞)
3 Jožko Mrkvička 1500 [1975-1990)
salary_sum bus_time
1000 [1960-1970)
1900 [1970-1975)
3400 [1975-1980)
2400 [1980-1990)
900 [1990-∞)
24. DISTINCT
◦ Duplicitné riadky musia platiť v rovnakom čase
◦ Nezahrnuté v SQL 2011
JOIN
◦ Spájané riadky musia platiť v rovnakom čase
◦ Realizovateľné aj v SQL 2011
25. Range types (PERIOD)
◦ od verzie 9.2
◦ Možnosť indexovania GIST indexom
Podpora všetkých spomínaných predikátov
EXCLUDE constraint – flexibilnejší UNIQUE constraint
◦ Zabránenie prekrývaniu období platnosti
EXCLUDE USING gist (id WITH =, bus_time WITH &&)
26. Vytvorený v rámci diplomovej práce
Snaha o zaradenie do oficiálneho release
Pôvodne založený na štandarde SQL/Temporal
Funkcionalita zahrnutá priamo v backende (nie extension)
Pre prijatie je nutný redizajn
◦ Podpora SQL 2011
◦ Využitie novo pridanej funkcionality
V súčasnosti - čakanie na schválenie nového návrhu
komunitou
Následne – implementácia
◦ Extension / core funkcionalita ?
27. Implementačný jazyk – C
Rozšírenie syntaxe
◦ Gramatika v BNF, z ktorej sa pomocou nástroja Bison generuje
prekladač v jazyku C
Úpravy systémových katalógov
◦ Pridanie stĺpcov na ukladanie informácií o temporálnych tabuľkách
Zmeny vo vnútorných štruktúrach
Spúšťače na odkladanie starých verzií záznamov
◦ Používajú pripravené príkazy, ukladané do hash tabuliek
Rozsah zmien – cca 4000 riadkov v 80 súboroch
Modifikované moduly:
◦ Parser – zaoberá sa prekladom a spracovávaním SQL príkazov
preložených do vnútornej štruktúry
◦ Command – zabezpečuje spracovanie a vykonávanie príkazov na
vytváranie a úpravu databázových objektov