Ing. Miroslav Šimulčík
      simulcik.miro@gmail.com
   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                                                        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
   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'
UPDATE                                              UPDATE


1992      2000     2008          2020   2000      2012         2020    2025

          2000     2008          2020   2000      2012         2020


                 UPDATE                               UPDATE


   2000                   2020          2000   2005        2010       2020

   2000                   2020          2000   2005        2010       2020
   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'
DELETE                                                    DELETE


1992      2000      2008          2020    2000          2012      2020      2025

                    2008          2020    2000          2012



                 DELETE                                 DELETE


   2000                    2020          2000    2005            2010     2020

                                         2000    2005            2010     2020
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                                            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)
   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-∞)
   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?

Miroslav Šimulčík: Temporálne databázy

  • 1.
    Ing. Miroslav Šimulčík simulcik.miro@gmail.com
  • 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'
  • 18.
    UPDATE UPDATE 1992 2000 2008 2020 2000 2012 2020 2025 2000 2008 2020 2000 2012 2020 UPDATE UPDATE 2000 2020 2000 2005 2010 2020 2000 2020 2000 2005 2010 2020
  • 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'
  • 20.
    DELETE DELETE 1992 2000 2008 2020 2000 2012 2020 2025 2008 2020 2000 2012 DELETE DELETE 2000 2020 2000 2005 2010 2020 2000 2005 2010 2020
  • 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
  • 28.