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

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

Temporální databáze A Caché. Smysl Lepší zachycení reálného světa v databázi Zachycení vývoje v databázi v čase Určení času validace dat  Data se dostaví.

Podobné prezentace


Prezentace na téma: "Temporální databáze A Caché. Smysl Lepší zachycení reálného světa v databázi Zachycení vývoje v databázi v čase Určení času validace dat  Data se dostaví."— Transkript prezentace:

1 Temporální databáze A Caché

2 Smysl Lepší zachycení reálného světa v databázi Zachycení vývoje v databázi v čase Určení času validace dat  Data se dostaví později než platí (Zdravotnictví,Policie)  Data je potřeba vložit dříve než začnou platit (Zákony,Vyhlášky)

3 Další příklady Kurzovní lístky Ceny stanovené na období(slevy..)  za kolik jsem koupil,když teď to stojí... Zatřídění osob,věcí do struktury  Jak to bylo loni, v čase T...

4 Nejsložitější příklad T 1 -čas kdy se něco stalo T 2 -čas kdy se rozhodujeme,ale D(T 1 ) tam ještě nejsou T 3 -data se dostala do Db T 4 -jednáme kdo udělal chybu

5 Hlavní snaha Aby temporální datové struktury/operace byly přímo podporovány SŘBD =>Zjednodušený a „obdobný“ přistup k datům historickým obdobně jako k současným

6 Granuralita Udává nejmenší jednotku času rozlišovanou aplikací.  Může to být měsíc, týden, den, okamžik, fiskální rok,měsíc... Granuralita  -objem dat  Ale s klesající G.roste přesnost.

7 Čas transakce a čas platnosti Čas transakce – kdy byla vložena do Db Čas platnosti – odkdy platí,dokdy Dvě na sobě nezávislé časové osy, které mohou také mít i různé granulity.

8 Statické databáze Zachycují stav reality v jednom časovém okamžiku nemožnost zachycovat změny v čase relace – 2D

9 Rollback databáze Poskytují informace o tom, kdy a jaké informace se kdy do databáze dostaly a jsou tedy schopné odpovídat na dotazy typu : „Co bylo známo v čase T?“.

10 Historické databáze Poskytují informace o tom, odkdy a dokdy je nějaká informace platná a odpovídají na dotazy typu : „Co platilo nebo bude platit v čase T?“. Možnost zpracovávat informace zadávané jak zpětně tak i dopředu.

11 Možné pohledy

12 Bitemporální databáze jsou kombinací rollback a historických databází

13 Implementace temporálních databází v M - Caché Návrhy Globálů a jak se musí změnit program „počítající“ dotaz nad DB. Problém s přepočtem času – Je potřeba aby uživatel vše zadával?  není, čas transakce se dá „odvodit“ ze strojového času – přepočet na granularitní období

14 Statické Databáze Základní struktura - pozdější s ní korespondují ^ZAM(Osobní číslo)=„Jméno#Oddělení#Plat“ ^ZAMS(Středisko, Osobní číslo)= ““ ^ZAM(1)= “Karel#SW#100“^ZAMS(“HW“,2)= ““ ^ZAM(2)= “Josef#HW#120“ ^ZAMS(“SW“,1)= ““ ^ZAM(3)= “Petr#SW#140“^ZAMS(“SW“,3)= ““

15 Výpisy ze statické Db výpis všeho Set OSC="" For Set OSC=$Order(^ZAM(OSC))/ Quit:OSC="" Do Write !,OSC,?10,^(OSC) Výpis všeho setříděný dle středisek Set STR="" For Set STR=$Order(^ZAMS(STR)) Quit :STR="" Do. Set OSC="" For Set OSC=$Order(^ZAMS(STR,OSC)) Quit :OSC="" Do.. Write !,STR,?10,OSC,?20,^ZAM(OSC)

16 ROLLBACK DATABÁZE 1) Jednoduchý rollback 2) Rollback bez konce období 3) Otočený rollback 4) Úsporný rollback

17 1)Jednoduchý rollback Přímo vychází z definice Datová struktura se navěsí na nový kořen(nutná konverze)po skončení období se přidá její bratr a přenastaví se ukazatele na aktuální období. Platy 2003/122004/12004/2undef

18 Data ^ZAM(199801,1)= “Karel#SW#100“^ZAMS(199801,“HW“,2)= ““,2)= “Josef#HW#120“,“SW“,1)= ““,3)= “Petr#SW#140“,3)= ““ ^ZAM(199802,1)= “Karel#SW#100“^ZAMS(199802,“HW“,2)= ““,2)= “Josef#HW#120“, “SW“,1)= ““,4)= “Jan#SW#130“,4)= ““ ^ZAM(199803,1)= “Karel#SW#130“^ZAMS(199803, “HW“,2)= ““,2)= “Josef#HW#125“, “SW“,1)= ““,4)= “Jan#SW#130“,4)= ““,5)= “Petra#SW#120“,5)= ““ ^ZAM(199804,2)= “Josef#HW#125“^ZAMS(199804, “HW“,2)= ““,4)= “Jan#SW#130“, “SW“,4)= ““,,5)= “Petra#HW#125“,5)= ““

19 Přístupové metody ; ukončí aktuální měsíc MES a vrací nový aktuální měsíc KONEC(MES)New NEWMES Set NEWMES=MES+"1" ; stanovení nového období ; kopie celého podstromu do nového období Merge ^ZAM(NEWMES)=^ZAM(MES) Merge ^ZAMS(NEWMES)=^ZAMS(MES) Quit NEWMES ; vrací n-tici pro měsíc MES a dané osobní číslo OSC LOAD(MES,OSC)Quit $Get(^ZAM(MES,OSC)) ; vrací proměnné ZAMJM, ZAMODD, ZAMPLAT pro měsíc MES a dané osobní číslo OSC LOADV(MES,OSC)New XX Set XX= $$LOAD (MES,OSC),ZAMJM=$Piece(XX,D),ZAMODD=$Piece(XX,D,2),ZAMPLAT=$Piece(XX,D,3 ) Quit XX ; uloží pro měsíc MES a dané osobní číslo OSC obsah n-tice daný proměnnými ZAMJM, ZAMODD, ZAMPLAT SAVEV(MES,OSC)Do SAVE (MES,OSC,ZAMJM_D_ZAMODD_D_ZAMPLAT) Quit ; uloží pro měsíc MES a dané osobní číslo OSC obsah n-tice XX SAVE(MES,OSC,XX)Set ^ZAM(MES,OSC)=XX Quit ;zruší v měsíci MES informace o daném osobním čísle OSC KILL(MES,OSC)Kill ^ZAM(MES,OSC) Quit ; vrátí v měsíci MES následníka (KAM=1) nebo předchůdce (KAM=-1) osobního čísla OSC ORDER(MES,OSC,KAM)Set :'$Data(KAM) KAM=1 Quit $Order(^ZAM(MES,OSC),KAM)

20 Dotazy ; výpis všeho Set OSC="" For Set/ OSC=$Order(^ZAM(MES,OSC)) Quit:OSC="" Do/ Write !,OSC,?10,^(OSC) Stejně tak i výpis zaměstnanců setříděný podle středisek nevyžaduje žádnou režii navíc. ; výpis všeho setříděný dle středisek Set STR="" For Set/ STR=$Order(^ZAMS(MES,STR)) Quit:STR="" Do. Set OSC="" For Set / OSC=$Order(^ZAMS(MES,STR,OSC)) Quit:OSC="" Do.. Write !,STR,?10,OSC,?20,^ZAM(MES,OSC) Nové : ; vývoj dat o zaměstnanci OSC Set MES="" For Set MES=$Order(^ZAM(MES)) Quit :MES="" Do. Set XX= $$LOAD ^ R1 (MES,OSC). Write !,MES,?10,$Select(XX="":" ",1:XX)

21 Výhody/nevýhody + Jednoduchost použití + Snadný přechod od statických Db - paměťová náročnost,časová při kopírování Vhodné pro systémy s větší granularitou,jako vhodné rozšíření Stat.Db

22 2)Rollback bez konce období Celá Db(větev) se nebude kopírovat,dohledání bude na dotazovacím programu Do období se zapisují jen změny snížíme tím paměť.náročnost,ale co čas?

23 Data ^ZAM(199801,1)= “Karel#SW#100“,2)= “Josef#HW#120“,3)= “Petr#SW#140“ ^ZAM(199802,3)= “ “,4)= “Jan#SW#130“ ^ZAM(199803,1)= “Karel#SW#130“,2)= “Josef#HW#125“,5)= “Petra#SW#120“ ^ZAM(199804,1)= “ “,2)= “ “,5)= “Petra#HW#125“

24 Mazání Již není možné rušit použitím Kill,ale musíme poznačit „ “ ; zruší v měsíci MES informace o daném osobním čísle OSC KILL(MES,OSC)Set ^ZAM(MES,OSC)=" " Quit

25 Vyhledání Nelze použít jednoduchý dotaz $Get(^ZAM(199803,1)) Musím vyhledat nejbližší nižší měsíc s nesenou informací ; funkce LOAD pro variantu Rollback bez konce období LOAD(MESIC,OSC)New MES,FOUND,XX Set MES=MESIC+"1",FOUND=0 For Set MES=$Order(^ZAM(MES),-1) Quit :MES="" Do Quit :FOUND. If $Data(^ZAM(MES,OSC)) Set / FOUND=1,XX=$Get(^ZAM(MES,OSC)) Quit / $Select(FOUND:$Select(XX=" ":"DELETED",1:X/ X),1:"NOT FOUND")

26 Dotaz na historii vypiš vše co jsi znal v Měsíci MESIC. ; zruš dočasnou strukturu Kill ^TEMP($J) ; projdi všechny dosud známé měsíce (byla-li v nich změna) a informace z nich přihrávej do ^TEMP Set MES="" For Set MES=$Order(^ZAM(MES)) Quit :MES="" Quit :MES>MESIC Do. Set OSC="" For Set OSC=$Order(^ZAM(MES,OSC)) Quit :OSC="" Do.. Set XX=^(OSC).. If XX=" " Kill ^TEMP($Job,OSC).. Else Set ^TEMP($Job,OSC)=XX ; projdi výslednou strukturu Set OSC="" For Set OSC=$Order(^TEMP($Job,OSC)) Quit :OSC="" Write !,OSC,?10,^(OSC)

27 Výhody nevýhody + Už tolik nezáleží na granularitě,ale na počtu změn za jednotkové období + Snížená paměťová náročnost - Zvýšena časová a programátorská náročnost

28 3)Otočený rollback Pokusíme se snížit časovou náročnost obrátíme myšlenkový postup pohledu na Rollback Db jako na posloupnost statických Datová struktura ^Zam(OSC,MES)=Jméno#Oddělení#Plat

29 Data ^ZAM(1,199801)= “Karel#SW#100“^ZAMS(“HW“,2)= ““,199803)= “Karel#SW#130“,5)= ““,199804)= “ “^ZAMS(“SW“,1)= ““ ^ZAM(2,199801)= “Josef#HW#120“,3)= ““,199803)= “Josef#HW#125“,4)= ““ ^ZAM(3,199801)= “Petr#SW#140“,5)= ““,199802)= “ “ ^ZAM(4,199802)= “Jan#SW#130“ ^ZAM(5,199803)= “Petra#SW#120“,199804)= “Petra#HW#125“ Struktura je vlastně struktura zaměstnanců, z nichž každý má „pod sebou“ události,které jej modifikovali

30 Přístupové metody : ; vrátí celou n-tici z db pro měsíc MESIC a dané osobní číslo OSC LOAD(MESIC,OSC)New XX,MES S MES=$O(^ZAM(OSC,MESIC+"1"),-1),XX="" I MES’="" S XX=^ZAM(OSC,MES) Q XX ; uloží pro měsíc MES a dané osobní číslo OSC obsah n-tice z XX SAVE(MES,OSC,XX)S ^ZAM(OSC,MES)=XX Q ; zruší v měsíci MES informace o daném osobním čísle OSC KILL(MES,OSC)S ^ZAM(OSC,MES)=" " Q ; vrátí v měsíci MES následníka (KAM=1) nebo předchůdce (KAM=-1) osobního čísla OSC ORDER(MES,OSC,KAM)New XX S :'$Data(KAM) KAM=1 F S OSC=$O(^ZAM(OSC),KAM) Q :OSC="" Do I XX'=" ",XX'="" Q. S XX= $$LOAD ^ R2 (MES,OSC) Q OSC

31 Výpisy ; výpis všeho S OSC="" F S OSC= $$ORDER ^ R3 (MES,OSC) Q :OSC="" Do. W !,OSC,?10, $$LOAD ^ R3 (MES,OSC) LOAD: 1. najde nejbližší starší měsíc se změnou 2. pokud takový měsíc existuje, pak vrátí jeho data 3. jinak vrací prázdný řetězec indikující neexistenci informace 4. ; výpis všeho setříděný dle středisek S STR="" F S STR=$O(^ZAMS(STR)) Q :STR="„ D. S OSC="" F S OSC=$O(^ZAMS(STR,OSC)) Q :OSC=““ D.. S XX= $$LOAD ^ R3 (MES,OSC) Q :STR'=$P(XX,D,2).. W !,STR,?10,OSC,?20,XX

32 Jak se vyvíjela data o zaměstnanci s osobním číslem OSC? Triviální ; vývoj dat o zaměstnanci S MES="" F S MES=$O(^ZAM(OSC,MES)) Q :MES="" Do. W !,MES,?10,^ZAM(OSC,MES)

33 4)Úsporný rollback vychází z varianty Jednoduchý rollback a využívá možnosti prohlásit část dat za data statická. Nemusíme kopírovat tolik dat,ale zůstávají výhody jednoduchého rollbacku Datové struktury ^ZAMST(Osobní číslo)=„Jméno“ ^ZAM(Měsíc, Osobní číslo)=„Středisko#Plat“ + indexová struktura hledání podle středisek ^ZAMS(Měsíc, Středisko, Osobní číslo)= ““

34 Data ^ZAMST(1)= “Karel“ (2)= “Josef“ (3)= “Petr“ (4)= “Jan“ (5)= “Petra“ ^ZAM(199801,1)= “SW#100“^ZAMS(199801,“HW“,2)= ““,2)= “HW#120“,“SW“,1)= ““,3)= “SW#140“,3)= ““ ^ZAM(199802,1)= “SW#100“^ZAMS(199802,“HW“,2)= ““,2)= “HW#120“,“SW“,1)= ““,4)= “SW#130“,4)= ““ ^ZAM(199803,1)= “SW#130“^ZAMS(199803,“HW“,2)= ““,2)= “HW#125“,“SW“,1)= ““,4)= “SW#130“,4)= ““,5)= “SW#120“,5)= ““ ^ZAM(199804,2)= “HW#125“^ZAMS(199804,“HW“,2)= ““,4)= “SW#130“,5)= ““,5)= “HW#125“,“SW“,4)= ““

35 Funkce ; ukončí aktuální měsíc MES a vrací nový aktuální měsíc KONEC(MES)New NEWMES S NEWMES=MES+"1" ; stanovení nového období ; kopie celého podstromu do nového období Merge ^ZAM(NEWMES)=^ZAM(MES) Merge ^ZAMS(NEWMES)=^ZAMS(MES) Q NEWMES ; vrací n-tici pro měsíc MES a dané osobní číslo OSC LOAD(MES,OSC)Q $Get(^ZAMST(OSC))_$G (^ZAM(MES,OSC)) ; vrací proměnné ZAMJM, ZAMODD, ZAMPLAT pro měsíc MES a dané osobní číslo OSC LOADV(MES,OSC)New XX S XX= $$LOAD (MES,OSC),ZAMJM=$P(XX,D),ZAMODD=$P(XX,D,2),ZAMPLAT=$P(XX,D,3) Q XX ; uloží pro měsíc MES a dané osobní číslo OSC obsah n-tice daný proměnnými ZAMJM, ZAMODD, ZAMPLAT SAVEV(MES,OSC)Do SAVE (MES,OSC,ZAMJM_D_ZAMODD_D_ZAMPLAT) Q ; uloží pro měsíc MES a dané osobní číslo OSC obsah n-tice XX SAVE(MES,OSC,XX)S ^ZAMST(OSC)=$P(XX,D,1),^ZAM(MES,OSC)=$P(XX,D,2,3) Q ;zruší v měsíci MES informace o daném osobním čísle OSC KILL(MES,OSC)Kill ^ZAM(MES,OSC) Q ; vrátí v měsíci MES následníka (KAM=1) nebo předchůdce (KAM=-1) osobního čísla OSC ORDER(MES,OSC,KAM)Set :'$D(KAM) KAM=1 Q $O(^ZAM(MES,OSC),KAM)

36 Historické Databáze 1) Jednoduchá historická databáze 2) Historická databáze s ukončením platnosti 3) Historická databáze s rozdílným časem platnosti 4) Historická databáze s platností po atributech

37 1) Jednoduchá historická databáze Například ceník ^CENIK(Výrobek, Od data)=1. Cena Obdobná struktura jako otočený rollback Pouze je zde Od data. ^ZAM(Osobní číslo, Od Měsíce)=„Jméno#Oddělení#Plat“ + indexová struktura pro rychlé hledání podle středisek ^ZAMS(Středisko, Osobní číslo)=““

38 Data ^ZAM(1,199801)= “Karel#SW#100“ ^ZAMS(“HW“,2)= ““,199803)= “Karel#SW#130“,5)= ““,199804)= “ “ ^ZAMS(“SW“,1)= ““ ^ZAM(2,199801)= “Josef#HW#120“,3)= ““,199803)= “Josef#HW#125“,4)= ““ ^ZAM(3,199801)= “Petr#SW#140“,5)= ““,199802)= “ “ ^ZAM(4,199802)= “Jan#SW#130“ ^ZAM(5,199803)= “Petra#SW#120“,199804)= “Petra#HW#125“

39 Přístupové metody Obdobné jako Otočený rollbackOtočený rollback pouze Save předtím zjistí,zda neaktualizuje stejná data jak to zrychlit? Použít temp. strukturu

40 2)Historická databáze s ukončením platnosti Uvedeme nejen od kdy,ale i do kdy ^ZAM(Osobní číslo, Od měsíce)=„Do měsíce#Jméno#Oddělení#Plat“ + indexová struktura pro rychlé hledání podle středisek ^ZAMS(Středisko, Osobní číslo)= ““

41 Data ^ZAM(1,199801)= “#Karel#SW#100“^ZAMS(“HW“,2)= ““,199803)= “199804#Karel#SW#130“,5)= ““,199804)= “# “^ZAMS(“SW“,1)= ““ ^ZAM(2,199801)= “199802#Josef#HW#120“,3)= ““,199803)= “199912#Josef#HW#125“,4)= ““ ^ZAM(3,199801)= “#Petr#SW#140“,5)= ““,199802)= “ “ ^ZAM(4,199802)= “199912#Jan#SW#130“ ^ZAM(5,199801)= “199804#Petra#SW#120“,199805)= “199912#Petra#HW#125“

42 Přístupové funkce ; vrací n-tici platnou v měsíci MES pro dané osobní číslo OSC LOAD(MESIC,OSC)New MES,XX Set MES=$Order(^ZAM(OSC,MESIC+"1"),-1) Quit :MES="" " " Set XX=$Get(^ZAM(OSC,MES)) ; pokud je zadáno dokdy a zároveň je dokdy menší než měsíc -> informace již neplatí If $Piece(XX,D,1)'="",$Piece(XX,D,1) " Quit $Piece(XX,D,2,4) ; !!! první nedefinitivní varianta SAVE !!! ; uloží pro dané osobní číslo OSC obsah n-tice z XX s platností od měsíce VALIDF do měsíce VALIDT SAVE(VALIDF,VALIDT,OSC,XX)If XX'= $$LOAD (MES,VALIDF) Set ^ZAM(OSC,VALIDF)=VALIDT_D_XX Quit ; zruší informace o daném osobním čísle OSC s platností od měsíce VALIDF do měsíce VALIDT KILL(VALIDF,VALIDT,OSC)Do SAVE (VALIDF,VALIDT,OSC," ") Quit ; vrátí následníka (KAM=1) nebo předchůdce (KAM=-1) osobního čísla OSC platného v měsíci MES ORDER(MES,OSC,KAM)New XX Set :'$Data(KAM) KAM=1 For Set OSC=$Order(^ZAM(OSC),KAM) Quit :OSC="" Do If XX'=" ",XX'=" ",XX'="" Quit. Set XX= $$LOAD (MES,OSC) Quit OSC

43 Problémy Data se nesmí překrývat,protože program najde první takovou strukturu,která odpovídá datu Je třeba upravit SAVE a KILL aby k tomuto nedocházelo

44 SAVE SAVE(VALIDF,VALIDT,OSC,XX)New CELE,BYLO,MES,KILL ; pokud se nic nezměnilo, pak konec Set CELE=VALIDT_D_XX Quit :CELE= $$LOADK (MES,OSC) ; uložíme nově zadanou hodnotu Set ^ZAM(OSC,VALIDF)=VALIDT_D_XX ; propagace datumu VALIDT ; pokud je nová informace až do nekonečna, pak všechno za ní musíme zrušit If VALIDT="" Do Quit. S MES=VALIDF For Set MES=$Order(^ZAM(OSC,MES)) Quit :MES="" Kill ^ZAM(OSC,MES) ; projdeme všechny měsíce od VALIDF dále, skončíme na konci nebo pokud dojdeme za VALIDT S BYLO="" S MES=VALIDF For Set MES=$Order(^ZAM(OSC,MES)) Quit :MES="" Quit :MES>VALIDT Do Quit :'KILL. ; zapamatujeme si minulou původní hodnotu do BYLO a nastavíme příznak propagování změny. S BYLO=^(MES). Set KILL=MES'<VALIDT ; pokud tento záznam začíná před datem VALIDT, pak ho budeme přepisovat. Quit :'KILL. Kill ^ZAM(OSC,MES) If BYLO'="",$Piece(BYLO,D)<VALIDT Set ^ZAM(OSC,VALIDT+"1")=BYLO Quit

45 3)Historická databáze s rozdílným časem platnosti Struktura, kdy celý záznam rozdělíme na logické celky. Při tomto dělení budeme k sobě dávat atributy, u kterých předpokládáme jejich společné změny. Příklad schématu : ^ZAM(Osobní číslo)=Jméno#Příjmení,“Zařazení“, od data)=Oddělení#Plat#Funkce,“Osobní“,od data)=Rodinný stav#Adresa

46 Výhody a nevýhody + Jednodušší zamykání objektů, které spolu souvisí + Vhodné pro „obrazovkové“ systémy + Možnost vytvořit pro kažsou skupinu vlastní LOAD a SAVE - pomalejší přístup k datům

47 4)Historická databáze s platností po atributech ^ZAM(Osobní číslo)=Jméno#Příjmení,1, od data)=Oddělení,2, od data)=Plat,3, od data)=Funkce,4, od data)=Rodinný stav,5, od data)=Adresa

48 Přístupové metody LOAD1(MESIC,OSC)New Result,MES,Attribut S Result="" S Atribut="" F S Atribut=$O(^ZAM(OSC,Atribut)) Q :Atribut="" D. S MES=$O(^ZAM(OSC,Atribut,MESIC+"1"),-1). S $P(Result,D,Atribut)=$S(MES="":"",1:^ZAM(OSC,Atribut,MES)) Q Result ; rutina vracejí výsledek v poli Result LOAD2(MESIC,OSC,Result)New MES,Attribut Kill Result S Atribut="" F S Atribut=$O(^ZAM(OSC,Atribut)) Q :Atribut="" Do. S MES=$O(^ZAM(OSC,Atribut,MESIC+"1"),-1). S Result(Atribut)=$S(MES="":"",1:^ZAM(OSC,Atribut,MES)) Q ; rutina vracejí výsledek jako sadu proměnných Result1,Result2,...,Resultn LOAD3(MESIC,OSC)New MES,Attribut S Atribut="" F S Atribut=$O(^ZAM(OSC,Atribut)) Q :Atribut="" Do. S MES=$O(^ZAM(OSC,Atribut,MESIC+"1"),-1). S @("Result"_Atribut)=$S(MES="":"",1:^ZAM(OSC,Atribut,MES)) Quit ; funkce vracejí zvolený atribut LOAD4(MESIC,OSC,Attribut)New MES S MES=$O(^ZAM(OSC,Atribut,MESIC+"1"),-1) Q $S(MES="":"",1:^ZAM(OSC,Atribut,MES))

49 Bitemporální Databáze Jednoduchá bitemporální databáze Bitemporální databáze s žurnálem změn

50 1)Jednoduchá bitemporální databáze kombinace skoro všech dosud řečených postupů Je třeba: možnost prohlásit část dat za data statická sdružování atributů do celků s předpokládanými stejnými parametry transakcí a platnosti oddělení nezávislých a často se měnících atributů

51 Datová struktura ^ZAM(„STATIC“, Osobní číslo)=Jméno#Rodné příjmení#Rodné číslo, Od data)=Příjmení ^ZAM(Měsíc, Osobní číslo)=Rodinný stav#Adresa,“Zařazení“, Od data)=Oddělení#Plat#Funkce

52 2)Bitemporální databáze s žurnálem změn Myšlenka mít v Db o nějakém objektu stav v čase T,+ pomocná struktura,která „ví“ o jeho změnách Možné směry 1)od minulosti (přes současnost) k budoucnosti 2)od budoucnosti (přes současnost) k minulosti

53 Datová struktura ^ZAM(Osobní číslo)=Jméno#Oddělení#Plat, 1, Pořadí)=Čas transakce#Platnost od#Platnost do#Který údaj#Nová hodnota#Kdo provedl změnu, 2, Čas transakce, Čas platnosti od, Pořadí)=„„, 3, Čas platnosti od, Čas transakce, Pořadí)=„„ ^ZAM(1)= “Karel#SW#100“,1,1)= “011998#031998##2#HW#PB“,2)= “021998#011998##3#120#PB“,3)= “021998#021998#031998#0##XYZ“,2,199801,199803,1)= ““,199802,199801,2)= ““,199802,3)= ““,3,199801,199802,2)= ““,199802,199802,3)= ““,199803,199801,1)= ““

54 Přístupové metody ; funkce vrací data o zaměstnanci OSC známá v čase MEST a platná v čase MESV ; funkce procházející všechny záznamy LOAD1(OSC,MEST,MESV)New Result,CR,POM,Piece,NewValue ; základní data S Result=$G(^ZAM(OSC)) ; projdi všechny transakce S CR="" F S CR=$O(^ZAM(OSC,1,CR)) Q :CR="" Do. S POM=^ZAM(OSC,1,CR). Q :$P(POM,D,1)>MEST ; zadáno později než v MEST. Q :$P(POM,D,2)>MESV ; platné později než MESV. I $P(POM,D,3)'="",$P(POM,D,3)<MESV Q ; platnost končí dřív než v MESV. S Piece=$P(POM,D,4),NewValue=$P(POM,D,5). I Piece=0 S Result=" " Q ; výsledek oznamující zrušený záznam (může být také prázdno). S $P(Result,D,Piece)=NewValue Q Result ; funkce vrací data o zaměstnanci OSC známá v čase MEST a platná v čase MESV ; funkce procházející přes index podle času transakce LOAD2(OSC,MEST,MESV)New Result,CR,POM,Piece,NewValue,PMEST,PMESV ; základní data S Result=$Get(^ZAM(OSC)) ; projdi všechny a pocházej jen ty, které jsou až do zadaného období S PMEST="" F S PMEST=$O(^ZAM(OSC,2,PMEST)) Q :PMEST="" Q :PMEST>MEST D. S PMESV="" F S PMESV=$O(^ZAM(OSC,2,PMEST,PMESV)) Q :PMESV="" Q :PMESV>MESV D.. S CR="" F S CR=$O(^ZAM(OSC,2,PMEST,PMESV,CR)) Q :CR="" D... S POM=^ZAM(OSC,1,CR)... I $P(POM,D,3)'="",$P(POM,D,3)<MESV Quit ; platnost končí dřív než v MESV... S Piece=$P(POM,D,4),NewValue=$P(POM,D,5)... I Piece=0 S Result=" " Q ; výsledek oznamující zrušený záznam (může být také prázdno)... S $P(Result,D,Piece)=NewValue Q Result

55 Výhody nevýhody + Nezávislost na granuleritě + Lehká auditovatelnost - Odlišný pohled a proto nutnost přepsat rutiny a datové struktury – horší konvertibilita

56 Shrnutí


Stáhnout ppt "Temporální databáze A Caché. Smysl Lepší zachycení reálného světa v databázi Zachycení vývoje v databázi v čase Určení času validace dat  Data se dostaví."

Podobné prezentace


Reklamy Google