miroslav Šimulčík: temporálne databázy
DESCRIPTION
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.TRANSCRIPT
Ing. Miroslav Šimulčík [email protected]
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ý?
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
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
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
Snapshot databázy ◦ Uchovávajú len aktuálne dáta
Historické databázy ◦ Zachytávajú zmeny v reálnom svete (biznise)
Rollback databázy ◦ Zachytávajú zmeny v databáze samotnej
Bitemporálne databázy ◦ Kombinácia historických a rollback databáz
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$
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
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
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;
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 ◦ Automatické vytvorenie novej verzie
a ukončenie platnosti starej verzie
◦ Len aktuálne platné riadky môžu byť
modifikované
DELETE ◦ Automatické ukončenie platnosti starej verzie
◦ Len aktuálne platné riadky môžu byť vymazané
1999 9999
UPDATE
2012 (zač. transakcie)
1999 9999 2012
1999 9999
DELETE
2012
1999 2012
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'
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)
);
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'
1992 2020
UPDATE
2008 2000
2020 2008 2000
2025 2020
UPDATE
2012 2000
2020 2012 2000
2020
UPDATE
2000
2020 2000
2020 2000
UPDATE
2005 2010
2020 2000 2005 2010
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'
1992 2020
DELETE
2008 2000
2020 2008
2025 2020
DELETE
2012 2000
2012 2000
2020
DELETE
2000 2020 2000
DELETE
2005 2010
2020 2000 2005 2010
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)
);
Množinové operácie ◦ Vyhodnocované v každom časovom okamihu ◦ Nezahrnuté v SQL 2011 ◦ Príklad:
person
id first_name last_name bus_time
1 Paľko Malý [1989-1999)
4 Janko Hraško [2006 - 2020)
2 Jožko Mrkvička [1999-∞)
person
id first_name last_name bus_time
1 Paľko Malý [1960-1980)
2 Jožko Mrkvička [1985-2005)
3 Peter Krasko [1960 - 1970)
person
id first_name last_name bus_time
2 Jožko Mrkvička [1999-2005)
INTERSECT
Agregačné funkcie ◦ Vyhodnocované v každom časovom okamihu ◦ Nezahrnuté v SQL 2011 ◦ Príklad:
person
id first_name last_name salary bus_time
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-∞)
SELECT SUM(salary) FROM person
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
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 &&)
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 ?
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
Otázky?