Diskuze: Verziovanie dat
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Taky tohle budu řešit a přemýšlel jsem nad tím.
Napadla mě ještě jedna možnost:
v tabulce bude sloupec např. 'original', ve kterém bude ID toho úplně
půdovního záznamu.
a pak to budeš tahat takto:
SELECT * FROM article WHERE article.original = 1755 ORDER BY article.id DESC LIMIT 1;
vytáhneš jeden záznam, který má jako absolutního 'rodiče' (sloupec original ) záznam s ID např. 1755, seřazeno podle ID sestupně - poslední verze.
Jinak z uvedených možností bych asi zvolil spíše 2. možnost. Příjde mi jednodušší nastavit defaultní hodnotu sloupci na CURRENT_TIMESTAMP , než vytahovat nějaký počet atd. je to takhle vlastně automatizováno
Ale kdyžtak počkej až se vyjadří někdo další ...
Vdaka za tip. Rozmyslam nad tym ze tych zaznamov tam pojde strasne vela a obcas aj velmi casto. To znamena ze v niektorych sekundach sa tam moze dostat aj viacero zmien jedneho zaznamu. V takom pripade by som mal viac zaznamov s rovnakym timestampom v stlpci timestamp a uz by som neveel urcit ktory je posledny. Preto si myslim ze prva moznost je asi lepsia.
Tvoje riesenie je tiez super a hodi sa do nejakeho jednoducheho CMS alebo tak. Tvoje riesenie nema vedomost o tom ktory zaznam je posledny. Predpokladas ze posledny je ten s poslednym id ale to nemusi byt pravda ak mas viac read a write nodes, mozes precitat staru informaciu ktora este nie je propagovana v DB pooli.
Napr ak by si riesil system prevodov v banke, tak by si chcel aktualizovat poslednu verziu stavu uctu a nie jej posledny zaznam v DB.
Este pockam ci sa vyjadri niekto iny. Ak nie, tak ta oznacim ako najlepsie riesenie.
Je vůbec nutné nějaké data tahle verzovat? Takový návrh se mi moc nezdá.. Třeba pokud vezmu v potaz ten bankovní účet, tak přece není třeba jeho stav takhle "verzovat", ale pouze zpětně dopočítávat jeho stav podle provedených transakcí. Takhle bys měl v databázi vpodstatě redudantní data, což je většinou špatně.
No dajme tomu ze zakaznik si vyziada bankovy vypis za posledny mesiac. Na nom nebude len posledny/aktualny zaznam(zostatok) ale vsetky zaznamy.
Transakcie verzovane nemam takze nemam ako spetne prepocitat co sa vtedy stalo. Problem je ze parametre transakcii sa casom tiez menia, napr cena za chleba je 15 korun dnes ale vcera bola len 12. Takze spetne si to neviem vypocitat.
Ktore data povazujes za redundantne?
No v případě, že bych si ukládal transakce (včetně hodnoty transakce v té době, tzn. v tvojem příkladu 12 korun místo současných 15ti), tak platí, že zůstatek k určitému datu můžeš získat tak, že vezmeš současný zůstatek a přičteš k němu všechny proběhlé transakce. Tohle je hodnota, kterou jednoduše spočítáš a nemusíš ji ukládat zvlášť.
Navíc si nemyslím, že by časová náročnost takového výpočtu byla nějak podstatně vyšší než obyčejného selectu a pokud nemáš aplikaci s desetitisícema dotazama za sekundu, tak je zbytečné to takhle optimalizovat.
Transakcie su dost zlozite, su tam rozne akcie, zlavy a nedaju sa spatne vypocitat aj kvoli malemu nahodnemu cislu. Uzivatelov je strasne vela a transakcii je este ovela viacej a vypocitavat pre kazdeho uzivatela stav uctu k zaciatku vekov by istotne bolo narocne. Pravdepodobne by bolo vhodne verziovat aj transakcie.
Netrap sa s rozhodnutim co je zbytocne optimalizovat ani aka je casova narocnost vypoctu - to rozhodnem ja. Pytal som sa na najlepsi model na verzovanie dat v big data systemoch.
Nemusíš nic zpětně vypočítávat u transakcí, tam si jen uložíš její hodnotu. Pokud fakt vyloženě trváš na tom si ukládat minulé stavy účtu, tak bych to udělal jednoduše pomocí druhé tabulky a triggeru. V hlavní tabulce máš současný stav. Při jakékoliv změně se spustí trigger, který ti vezme starou hodnotu a uloží do vedlejší tabulky, kde si to budeš ukládat podle timestampu (PK by měl stačit id účtu + timestamp s přesností na milisekundy).
Ale stejně si myslím, že tohle není úplně správná cesta (ikdyž nevidím celou strukturu databáze), uživatel se síce dozví, jaké měl změny na účtu, ale nedozví se, kolik přesně za konkrétní transakci zaplatil/získal, když nastanou dvě a více transakcí najednou (pokud sem to dobře pochopil, tak transakce ukládáš, ale neukládáš hodnotu, takže když je pouze jedna, dá se to ze změny stavu jednoduše vyčíst, ale pokud je jich více, tak už ne).
Ano, toto je navrh s ktorym momentalne pracujem.
Mam kolekciu v ktorej su aktualne stavy a mam druhu kolekciu, v ktorej je
historia danych dokumentov. Druha kolekcia odkazuje na hlavnu kolekciu cez
primary id a cez verziu. Vdaka tomuto rozdeleniu ma kolekcia s aktualnymi
dokumentami o miliony zaznamov menej a hladanie je rychlejsie.
Mam tam aj timestamp ale ten nepouzivam pre pripad ze by niekto manipuloval datami. Verzie su lepsie, lebo vies presne povedat ci chyba nejaky dokument z kolekcia alebo je tam nejaky dokument ulozeny dvakrat.
V pripade ze by som potreboval transakcie, tak z rozdielov stavov medzi jednotlivymi dokumentami si viem vypocitat deltu zmeny.
Toto je zatial to najlepsie, na co som prisiel aj ja. Len ma zaujimalo ci vie niekto este lepsie riesenie verzovania.
Zobrazeno 9 zpráv z 9.