Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Tolik rozruchu
jen v Lopuchu

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub Database (mysql,...) [ŽP: neomezená] (kategorie Programování) moderuje melkor_unlimited.
Archiv
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: irqkfkx
[ 1008 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
bredy 3.12.2007 17:05  604
pepakklíč autoinc je imho zbytečný
pepak pepak - Pepak.net 3.12.2007 15:33  603
Ta historicka tabulka by IMHO mela obsahovat vsechny sloupecky z normalni tabulky, plus 3 dalsi:
1) klic (autoinc)
2) datum od (timestamp)
3) datum do (timestamp)

Vzhledem k tomu, ze je pozadavek na MSSQL, tak neni problem to v triggeru osetrit vsechno.
bredy 3.12.2007 14:56  602
knedleNo to je právě ten problém. Proto možná řešení s dvěmi tabulky je lepší. V hlavní tabulce mám normálně atomické číslo, v historické tabulce mám normální index - idx z normální tabulky (určitě bude atomické), a pak některé z datumů (například platí_do). To určuje záznam přesně, protože by němělo nastat, že se do historie uloží dva záznamy se stejným datumem plati_do. A pokud ano, je celkem logické, že druhý zápis selže,protože zaznamenávat změny v tak ktátkém čase nemá až tak valný význam.
bredy 3.12.2007 14:52  601
huhOno se může jednat o kombinaci řešeních. Pro rychlý přístup je možná lepší mít vždy aktivní tabulku a pak historickou. Historická tabulka obsahuje záznamy s datumy, tak jak jsem popsal, aktivní tabulka obsahuje normálně záznamy tak jak je běžné.

Ovšem každá změna znamená nejprve přesunout měněné záznamy do historie a pak provést update. Což by ovšem nemuselo být tak těžké. Stačí:

table(idx,a,b,c,d)
hist_table(idx,a,b,c,d,plati_do}

INSERT INTO hist_table SELECT *, NOW() FROM table WHERE cond;
UPDATE table SET .... WHERE cond;

Pro výpis historie pro určité datum by se muselo udělat
SELECT DISTINCTROW idx,a,b,c,d FROM hist_table WHERE plati_do > vybrane_datum ORDER BY plati_do DESC

Tím supluji chybějící plati_od, protože se mi zobrazí vždy nejnovější záznam starší než zadané datum. Nicméně pokud by to byl problém, pak je nutné pravděpodobně vést plati_od v aktivní tabulce, aby se pak mohlo toto datum přepsat do historie jednoduchým SELECTem.

Další varianta jak vyrobit plati_od za předpokladu že jej chci mít v hist_table.

INSERT INTO hist_table SELECT *,MAX(hist_table.plati_do),NOW() FROM table LEFT JOIN hist_table ON table.idx = hist_table.idx WHERE cond

Ale LEFT JOIN nebudí moc důvěru v efektivitě.
knedle knedle online - Krabice živých 3.12.2007 14:51  600
dotaz na bredyho reseni:

primarni klic je pak co? id (bez ai) a casove razitko zacatku?

nebo je tam standardni prim klic autoinc - ale pak by to muselo mit take jeste nejake jine pseudoid - ve stejne tabulce nebo jine?
edmundl 3.12.2007 14:21  598
konkrétní řešení je samozřejmě závioslé na tom, co přesně se od toho požaduje. Dotaz byl zadán velmi obecně a tak je možné použít i více řešení.
huh huh 3.12.2007 14:14  597
Me teda nejnormalnejsi prijde Bredyho reseni
pepak pepak - Pepak.net 3.12.2007 11:13  596
Tak vidis.
bredy 3.12.2007 10:57  595
pepakJá tohle viděl v informačním systému FNKV (Fakultní Nemocnice Královské Vinohrady)
edmundl 3.12.2007 10:57  594
Varianta 1 je sice pracnější na začátku, ale při práci s historickými daty se ti to vrátí, protože s nimi můžeš pracovat skoro stejně jako s živými. To ve variantě 2 bude dohledávání stavu mnohem pracnější.
knedle knedle online - Krabice živých 3.12.2007 10:25  593
jsou jeste nejake vyhody nevyhody:

1/ kopie zive tabulky
- vyhoda: prehlednost
- nevyhoda: pracnost

2/ jedina tabulka historie, kam se ukladaji data ze vsech tabulek
- vyhoda: mensi pracnost
- nevyhoda: neprehlednost, snad i velikost tabulky co do poctu zaznamu (?)

-- u teto je otazka, zda ukladat vsechna pole, nebo jen ty zmenena
- pokud nekompletni, spatne by se asi dohledavali ostatni data stejnho zaznamu
- pokud kompletni, velke narustani dat v teto tab, lze rict, ze i redundance dat


a jeste, pokud se dela takovato historie, dela se to pred novou zmenou (tj. zpetne - aktualni stav neni v tabulce historie) nebo hned po zmene (aktualni stav je i v tabulce historie)
pepak pepak - Pepak.net 3.12.2007 10:22  592
Bredy: To neni dobre reseni. Databaze jsou sice delane, aby se vyporadaly s velkym mnozstvim zaznamu, ale presto je lepsi ty neaktivni necpat do zive databaze. To by se snad hodilo v pripade, ze VZDY potrebuju delat s historii, ale to plati jen u velice malo tabulek.
bredy 3.12.2007 10:15  591
pepak, knedleNebo v každé tabulce mít záznamy:
tabulka(... položky ..., platí_od, platí_do)
Pak stačí filtrovat podle datumu, a zobrazovat záznamy, které jsou v zadaném rozsahu.

Nevýhodou je, že každá změna znamená nový záznam, byť se změnilo něco v jednom sloupci.
pepak pepak - Pepak.net 3.12.2007 10:00  590
Bud jedna kopirovaci tabulka pro kazdou zivou tabulku (prehledne, ale pracne) nebo jedna globalni tabulka historie(jmeno_tabulky, jmeno_pole, [puvodni_hodnota], [nova_hodnota], cas_zmeny)
knedle knedle online - Krabice živých 3.12.2007 09:42  589
dotazasi na princip:

pokud chci mit kompletni historii stavu zaznamu "jak sel cas" v databazi - jakym stylem se to da udelat? je vice moznosti?

mam mssql, v ni cca 40 tab - klasicka relacni db

jedine rozumne co me napada, je "kopie" vsech tabulek, urcena prave pro ukladani historie - napr:
tabulka "uzivatel" obsahuje aktualni realna data, pokud by se data 1 zaznamu zmenila, byla by zkopirovana do tabulky "archiv_uzivatel", kde by bylo navic casove razitko



jsou pouzivany jeste jine zpusoby resici tohle zadani? (kompletni historie zaznamu u cele db)

[ 1008 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt