• 37 odgovora
  • 15.054 pregleda
Re: Denormalizacija baze 07.03.2010. u 11:17 · pre 202 meseci #21
Pozdrav drugari vidim da svi imamo isti problem kod prof. Marjanovića :)

Mene interesuje sledeća stvar ako neko može da mi pomogne naime imam sledeću situaciju

Klijent(#ŠifraKlijenta, Adresa, Telefon,#PoštanskiBroj)
FizičkoLice(#ŠifraKlijenta, JMBG, Ime, Prezime, BrojLičneKarte)
PravnoLice(#ŠifraKlijenta, PIB, MatičniBroj, Naziv, Račun)
Saobraćajna(#BrojSaobraćajne, DatumIzdavanja, Napomena, DatumIstekaVaženja, Sup, RegistarskiBroj, #ŠifraKlijenta, #ŠifraVozila)

Klijent mi ima specijalizaciju na Fizičko i Pravno lice da li je moguće sad prebaciti Ime i Prezime sa Fizičkog i PIB i Naziv sa Pravnog u Saobraćajnu u time zadovoljiti denormalizaciju?

Tako da to izgleda ovako

Saobraćajna(#BrojSaobraćajne,....., #ŠifraKlijenta, #ŠifraVozila, Ime, Prezime, PIB, Naziv)

Ovo mi je prva denormalizacjia a druga mi izgleda ovako

Zastupnik(#JMBGZastupnika, Ime, Prezime, Adresa, BrojLičneKarte, #PoštanskiBroj)
Ugovor(#BrojUgovora, DatumUgovora, CenaVozila, #BrojSaobraćajne, #ŠifraKlijentakupuje, #ŠifraKlijentaprodaje, #JMBGZastupnika)

Pa sam na ugovor prebacio ime i prezime zastupnika

Ugovor(#BrojUgovora, DatumUgovora, CenaVozila, #BrojSaobraćajne, #ŠifraKlijentakupuje, #ŠifraKlijentaprodaje, #JMBGZastupnika, Ime, Prezime)

Šta mislite da li je ovo ok?

Pozdrav
Re: Denormalizacija baze 07.03.2010. u 22:24 · pre 202 meseci #22
Mislim da je ovo sto si napisao ok, u oba slucaja je razbijanje III NF. A zar niko nije radio trigere? :( Dajte malo pomoci i komentara oko toga.
Re: Denormalizacija baze 08.03.2010. u 10:03 · pre 202 meseci #23
Treba li uopste da se razbija II NF? Ili je dovoljno samo III NF?
A trigere pravimo za koliko tabela? Posto izgleda nije dovoljno samo za 2 tabele...
Re: Denormalizacija baze 08.03.2010. u 14:15 · pre 202 meseci #24
Potrebno je uraditi 2 denormalizacije i odgovarajuće trigere za te denormalizacije.
Denormalizaciju 2NF i denormalizaciju 3NF. Da li to ima smisla i kako to izvesti, to ne znam. I ja imam problem sa tim. Uradim ja te denormalizacije ali ni jedna niti je logična niti zadovoljava poslovnu logiku ovog mog mini inf. sistema. :)

Što se tiče triggera, ja imam iskustva u PL/SQL-u, nisam nikad radio na SQL serverima 2000, My sql i slično ali sve je to "isto sra.e drugo pakovanje".

Ladene, ono što sam primetio da ti nedostaje u tvom primeru jeste na koju kolonu se odnosi update. To je važno u ovom slučaju sa denormalizacijama, jer bi triger trebao da se okida samo kad se određena kolona promeni a ne ceo red. Kod tebe se triger okida kad god se izvrši update tabele proizvod bilo da mu menjaš naziv proizvoda ili jedinicu mere.

I kod koji si ti napisao više liči na proceduru a manje na update trigger. Kod trigera se najčešće koristi karakteristika :new i :old. Gde :new.JedMere pretstavlja novu vrednost jedinice mere određenog proizvoda u tabeli Proizvod a :old.JedMere staru vrednost, odn vrednost koja se menja. Nema potrebe da u SQL upitu povezuješ tabelu proizvod i stavkuPrijemnice kad već raspolažeš sa podacima iz tabele Proizvod u trenutku okidanja triggera jer se triger izvršava nad tom tabelom.

Code:

CREATE OR REPLACE TRIGGER update_jedmere_u_proizvodu
 BEFORE
 UPDATE OF JedMere
 ON Proizvod
 FOR EACH ROW
DECLARE
 
BEGIN

UPDATE StavkaPrijemnice
SET JedMere=:new.JedMere
WHERE StavkaPrijemnice.SifraPro = :new.SifraPro;

END;



Nego, zna li neko nešto vezano za ove Korisnički definisane tipove podataka. Tu mi ništa nije jasno šta treba uraditi. Nisam baš pazio na tom času :)
Potpis
Miki
Re: Denormalizacija baze 08.03.2010. u 15:07 · pre 202 meseci #25
RESENO, evo triger, nadam se da je to to. Radi ali ako neko ima zamerke neka ih slobodno iznese

[Code]
CREATE TRIGGER update_jedmere_u_proizvodu ON Proizvod
FOR UPDATE
AS
UPDATE StavkaPrijemnice
SET JedMere=Proizvod.JedMere
FROM Proizvod, StavkaPrijemnice
WHERE Proizvod.SifraPro=StavkaPrijemnice.SifraPro
[/code]

Dati triger ima najmanje dva problema, jedan logicki i drugi tehnicki.

Sta radi ovaj triger:
- kad god se promeni bilo sta u tabeli Proizvod => odradi se UPDATE nad tabelom StavkaPrijemnice
- UPDATE StavkaPrijemnice jednostavno prepise sve jedinice mere u SVIM stvakama prijemnice onim sto se nalazi u tabeli Proizvodi za SVE proizvode.

Znaci, promeni se recimo opis za 'Jabuke' u 'Jabike Delises' i ovo izazove UPADTE cele tabele StavkePrijemnice u koloni JedMere, koja se nije promenila uopste u tabeli Proizvod. Ovo je strasno jer se rade nepotrebne operacije, cak i denormalizacija ne zahteva da se radi UPDATE jedinica mere kad se promeni opis proizvoda. Ovo je tehnicki problem, jer se bespotrebno radi UPDATE nad potencijalno velikom tabelom.

Tezi od dva problema je logicki: Jos strasnije je sto se ovo uopste radi. Recimo da je proizvod "Jabuke" bio meren u "kg" jedno vreme. Onda udjemo u EU i sad se jabuke mere u "LB". Sad ce triger da promeni jedinicu mere u svim prijemnicama koje psotoje od ranije u "LB". Posto je LB = 0.454 Kg, jednim potezom si napravio haos u knjigovodstvu. Dobro, EU ne koristi LB, ali s emoze promeniti sa Kg u Tone recimo, i onda opet nastaje haos u knjigovodstvu.

Triger ne sme da dira stare rekorde, ni pod kojim uslovima. Postavlja se pitanje - kako da triger zna koji rekordi u tabeli proizvod su promenjeni, da bi mozda promenio samo te rekorde u nekoj drugoj tabeli.

U sustini, primer je jako lose izabran, a onda je triger lose napisan. I onaj za ORACLE niej bolji u tom pogledu. Konstrukcije tipa 'FOR EACH ROW" su generalno opasne, jer one to i rade - nesto rade za SVAKI red. Gde smoz aboravili WHERE?

Re: Denormalizacija baze 08.03.2010. u 15:44 · pre 202 meseci #26
Cini mi se da je triger trebalo da resi ovu situaciju:

"Kad se rekord unese u StavkePrijemnice, prepisati Jedmere iz tabele Proizvodi"

Ovo zato sto smo procesom denormalizacije uveli nepotrebnu kolonu JedMere u tabelu StavkePrijemnice.

Triger treba da bude ne tabeli StavkePrijemnice, na ON INSERT i treba da za upravo uneti rekord (to jest grupu rekorda) kopira JedMere iz tabele Proizvod. Otprilike ovako (kod pisem iz glave, sigurno negde ima neka sintaksna greska,):

Code:

CRAETE TRIGER trgSTavkePrijemnice_CopyJedMere_from_Proizvod ON dbo.StavkePrijemnice
FOR INSERT AS

UPDATE dbo.StavkePrijemnice
SET JedMere = P.JedMere
FROM StavkePrijemnice AS S
JOIN Inseretd AS I ON I.proizvodID = S.proizvodID
;

GO


Primetite da je upotrebljena SQL Serverova interna tabele "Inserted". Inserted izgleda isto kao tabela koja se modifikuje i sadrzi rekorde koji ce biti uneti ovom transakcijom. Tabela Inseretd je enprazna u slucaju da imamo UPDATE ili INSERT. Postoji i tabele "Deleted" koja se javlja u slucaju DELETE ili UPDATE. Inserted i Deleted imaju strukturu identicnu tabeli koja se menja i koriste se u trigerima da se dejstvo trigera ogranic samo na rekorde koji su se stvarno promenili. O ovome su morali da vas uce u skoli.

Dakle, nas triger cita iz tabele rekorde koji ce upravo biti uneseni u tabelu StavkePrijemnice (FROM Stavkeprijemnice JOIN Inserted) Onda svakom rekordu dodeli verenost JedMere koja mu odgovara (JOIN ON I.proizvodID = S.ProizvodID)

Da se ovo razume, potrebno je razumeti UPDATE komandu koja radi ne sa JOINovanim tabelama.

U praksi, veom je cesto da se ovako prepisuje Cena iz tabele Proizvod u tabelu StavkeRacuna na primer...


Re: Denormalizacija baze 08.03.2010. u 20:43 · pre 202 meseci #27
Hvala Zidar, da si samo znao koliko cesto sam ovih dana prizeljkivao tvoj post:) Ono gore mi je prvi napisan triger ikada tako da sam bio srecan samo kad sam video da radi radnju:) a pretpostavljao sam da ce biti gresaka. Trudim se da ne ocekujem ovde gotova resenja, nego da ponudim bar nesto za diskusiju, ma koliko bilo pogresno. Hvala jos jednom.
Re: Denormalizacija baze 09.03.2010. u 12:15 · pre 202 meseci #29
Citat:

DepoKarton (IDDepoKartona#, IDKlijenta#,DatumDK, ..., BrojRačuna#)
Račun(BrojRačuna#, BrojModela, PozivNaBroj, Suma...)
StavkeDepoKartona(IDDepoKartona#, IDKlijenta#, RBStavkeDK#, Samostalno, ....)
OvlascenoLice(IDOvlLice#, ImePrezime...)

Ja se i dalje zezam sa denormalizacijom. Moze li neko da napise primer razbijanja II nf za denormalizaciju?
Ne verujem da ce dati da se preda primer sa 2x razbijenom III nf.
Zanima me takodje da li mogu da uradim sledece: posto mi je veza StavkeDepoKartona i OvlascenoLice 1,M i 0,M, tj. u relacionom modelu je pravljena nova tabela Relacija3(IDDepoKartona#, IDKlijenta#, RBStavkeDK#,IDOvlLice#);
Da li mogu umesto pravljena te nove tabele samo da spustim FK IDOvlLice u tabelu StavkeDepoKartona i da dobijem => StavkeDepoKartona(IDDepoKartona#, IDKlijenta#, RBStavkeDK#, Samostalno, ....... IDOvlLice#) i da tako izvrsim denormalizaciju (tako cu umesto spajanja 3 tabele, imati spajanje samo 2 tabele)?

Znam da su rekli da moraju po jedan insert, update, delete trigger da se napise. Ja nisam sigurna da cu imati insert trigger...

I jos nesto za korisnicke definisane tipove - u ms sql serveru: CREATE TYPE nekiTip FROM varchar(11) NOT NULL ; i sl.
Nije valjda da na ovo misle?

Re: Denormalizacija baze 09.03.2010. u 16:45 · pre 202 meseci #30
Citat:
yeki: Moze li neko da napise primer razbijanja II nf za denormalizaciju?

primer
Potpis
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Re: Denormalizacija baze 09.03.2010. u 17:04 · pre 202 meseci #31
^Procitala sam ovu temu, ali mi to nije pomoglo... (videces i moj post da sam isto tako uradila, ali poprilicno sam sigurna da ce da nas vrate kad onako uradimo)
Moze li neko da okaci primer razbijanja II NF koja je prosla kod profesora?
Re: Denormalizacija baze 09.03.2010. u 17:53 · pre 202 meseci #32
@yeki
Nemoj siriti ovu temu tako sto pitas neke stvari vezane za faks, to sve mozes postovati na fonforum. Ovde bi bilo bolje da razradimo neku opstu pricu na temu denormalizacije, trigera itd, a to sto prof. trazi nema bas mnogo veze sa realnoscu i stvarnim zahtevima u nekom poslovnom sistemu. Btw, ja necu raditi nesto sto je mnoooooogo nelogicno, a mislim da je razbijanje II NF bas takva stvar.
Re: Denormalizacija baze 09.03.2010. u 18:21 · pre 202 meseci #33
Nikako mi nije jasno da se trosi toliko vremena na nesto sto ne treba raditi. Da bi nesto denormalizovao, treba da je prvo normalizovano. A u prirodi ne psotoje normalizovani podaci. Normalizacijom mukotrpno popravljamo ono sto u prirodnom obliku ne valja. Znaci, denormalizoacijom kvarimo nesto do cega se doslo mukom i znojem. Pa jos se sporimo oko toga koji je pravi nacin da pokvarimo ono sto smo napravili dobro...

Koji je pravilan nacin da se sa 2NF vratimo na 1NF? Da li je bolje napiti se od piva, vina ili meke rakije, pitanje je sad...

Ne mogu da verujem da neko maltretira studente ovakvim glupostima.

U realnom zivotu postoje dva - tri primera gde se moze dopustiti pod odredjenim (sve redjim) uslovim nedovoljna normalizacija, i to je sve:

- Banke ne racunaju stanje na tekucem racunu kverijima, stanje na racunu se azurira (UPDATE) posle svake transakcije. Tako banke rade. Tacka. Nema normalizacije u tom delu. Tako banke hoce, jer su navikle, nekad je glavni jezik bio COBOL. Tacka.

- Cena se prepisuje iz tabele Proizvodi u tabelu StavkeNaRecunu. Adresa se prepisuje iz tabele Kupci u tabelu Otpremnice, da bi se zapamtilo na koju je adresu roba otisla u slucaju da kupac promeni adresu kasnije. Ovo mozda i nije denormalizacija, jer postoji TrenutnaCena i CenaPoKojoj smo prodali robu na odredjeni dan. Isto i za adresu, tekuca adresa i adresa na koju smo isporucili robu, mogu da budu iste, ali i ne moraju. Nema duplikacije, pa nema ni denormalizacije, iako izgleda kao da ima.

- Datum stupanja na posao i datum prekida rada se cuvaju u istom redu, iako to krsi neko tamo pravilo koje kaze da svaki atribut sme da zavisi samo i samo od PK. Datum prekida rada zavisi od PK, ali zavisi i od Datuma pocetka rada, znaci prekrseno pravilo. Ne znam da je neko ovo razresio daljom normalizacijom, iako je svakako moguce.

To su neki primeri nedovoljno normalizovanih struktura. Mozda ima jos, ali mi tesko pada na pamet. Da sam ja profesor, pokusao bih da objasnim deci bar neke od ovih situacija, jer ce se sa time sresti u praksi. A ne da ih maltretiram trazenjem "pravilnog" nacina da se denormalizuje skup tabela. To je isto kao prihvatiti deljenje sa nulom. Jednom kad prihvatis da se sme deliti nulom, sve je moguce i nema kraja mogucnostima. Mogu da dokazem da je 1=2, na primer:

X2-X2 = X2-X2

to moze da se napise kao:

(X-X)(X+X) = X(X-X)

podelimo obe strane sa (X-X) i dobijemo

X+X = X => 1=2

Ako dakle prihvatim glupost za ispravan korak u postupku, dobicu glupost kao rezultat. A onda pomnozim obe strane sa 7, pa dobijem 7 = 14. Onda to nazovem 'optimizacijom', a deljenje sa (X-X) ostaje 'denormalizacija'

Tako je isto i sa denormalizacijom. Cuj, 'optimizacija'. Jedan doktor me izleci od gripa, a onda mi drugi prebije nogu, jer me prvi izlecio previse. I to je optimizacija. Da mi je izbio oko, bila bi denormalizacija.

Bez namere da uvredim ikoga, ali pitam se ko je ovde 'denormalan'?

:-)
Re: Denormalizacija baze 09.03.2010. u 18:33 · pre 202 meseci #34
@yeki: Ne mogu ti pomoci jer ne vidim tvoje tabele niti znam sta radis. Chachka je dao generalno resenje - ides unazad. Ili zamisli da nije normalizovana baza, pa kreni ponovo korak po korak. Kad stignes do 2NF, ti stani i izgledace kao da si se vratila sa 3NF.

Najbolje ej da pitas profesore, oni valjda naju sta se hoce ovom vezbom i kako to izvesti.

Moj poslednji post se ne odnosi na studente, vi ste zrtve u ovoj guzvi, a mi vam ne mozemo pomoci. Samo sam se iskukao, kao kad se zale ljudi na zagadjene vazdha i unistavanje okoline.

Mozda ti budem mogao pomoci su ti kad se bude pisao triger koji ce morati da obezbedi ono sto je bilo obezbedjeno referencijalnim integritetom, a mi smo ga pokvarili (optimizovali?) denormalizacijom.

Mene su u skoli ucili da 'optimal' znaci 'najbolji'. Optimizacija dakle ne znaci 'poboljsanje performansi' nego znaci 'pronalazenje najboljeg resenja'. Nikako mi ta rec 'optimizacija' ne pasuje ovde
Re: Denormalizacija baze 09.03.2010. u 18:50 · pre 202 meseci #35
Ok, hvala ti. Znam ja normalizaciju, samo me buni do koje tacke se treba denormalizvoati, a da se ne pretera...
Re: Denormalizacija baze 09.03.2010. u 20:26 · pre 202 meseci #36
Evo još jednom:

Normalizacijom se dobija set tabela u kojima ne postoji redundansa podataka (nema čuvenih problema sa duplim ili višestrukim ažuriranjem podataka itd...). Njome smo rešili problem UNOSA i skladištenja podataka. Postupak normalizacije NE ZAVISI od prirode ulaznih podataka.

Ako je normalizovana baza dobra i sa stanovišta izveštavanja (izveštavanje troši prihvatljivu količinu vremena i drugih resursa) posao je gotov, ne treba nam denormalizacija.

Ako su performanse izveštajnih programa loše, tada se uvode IZVEDENI objekti (radi se denormalizacija baze) ali samo za one situacije za koje želimo popraviti performanse. Zato ne postoji opšti recept KAKO se radi denormalizacije. Ona se radi samo za deo kome se žele popraviti performanse.
Pedagoški bi bilo da profesor zada zadatak u kome će studenti moći da vide kako se nekom denormalizacijom nešto popravilo. Ovako ostaje suvoparan primer "denormalizacije radi denormalizacije".
Re: Denormalizacija baze 10.03.2010. u 16:34 · pre 202 meseci #37
Citat:
...samo me buni do koje tacke se treba denormalizvoati, a da se ne pretera...

To samo profesor moze da ti odgovori. Nama je lako da ovde pricamo kako profesori maltretiraju studente, medjutim profesori nisu bas blesavi. SIgurno postoji razlog zasto ovo traze od vas i najverovatnije da profesor(i) zna(ju) i dokle treba da idete sa denormalizacijom. Najprostije resenje - posalji e-mail profesoru, ili trk pred kabinet pa cekaj red za konsultacije. A i asistenti na vezbama mora da imaju neku ideju i mogu pomoci.

Ovo su nezgodna pitanja, u sivoj zoni, pa saveti koje delimo po forumu mogu vise da odmognu nego da pomognu. Ovde niko ne moze da odgovori dokle treba ici sa denormalizacijom 'a da se ne pretera', pa nem svrhe to ni pitati.

Re: Denormalizacija baze 16.01.2013. u 08:39 · pre 167 meseci #38
Pozdrav,
Da ne otvaram novu temu pisacu ovde jer naslov mi skroz odgovara :-),posto nije odavno pisano nadam se da ce neko ugledati moj post :-)
opet mi treba podrska da li sam na dobrom putu? :-)
Uradila sam denormalizaciju 2NF izgleda kao u prilozenim stavkama,interesuje me da li ovo ima logike i jesam li dobro predstavila.Hvala unapred!

Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme