You are on page 1of 21

UNIVERZITET U BEOGRADU

FAKULTET ORGANIZACIONIH NAUKA




Baze podataka 2
-Seminarski rad-
Informacioni sistem prodaje raunara




Mentor: Miroslav Ljubiid
Student: Aleksandar Mirosavljevid
Br. Indeksa: 2013/3095

Beograd, Septembar 2014.


2

Sadraj

1. PMOV ......................................................................................................................................................... 3
2. Relacioni model ......................................................................................................................................... 9
3. Denormalizacija ....................................................................................................................................... 10
4. Korisnicki definisani tipovi ....................................................................................................................... 12
5. Implementacija trigera ............................................................................................................................ 13
6. Optimizacija ............................................................................................................................................. 17
7. Vertikalno particionisanje i index ............................................................................................................ 21



3

1. PMOV


- Kompletan model



- Kupac






4

- Radnik



- Narudzbenica

5

- Otpremnica

















6

- Faktura

















7

- Nalog za prenos























8

- Reklamacija






















9

2. Relacioni model

Kupac (#PIB, NazivKupac, ZiroRacun)

Radnik (#JMBG, Ime, Prezime, Telefon, Email, Sluzba)

Narudzbenica (#BrojNarudzbenice, #PIB, Datum, Napomena, JMBG)

StavkeNarudzbenice (#RedniBroj, #BrojNarudzbenice, #PIB, Kolicina, SifraArtikla)

Otpremnica (#BrojOtpremnice, Datum, Napomena, BrojNarudzbenice, JMBG)

StavkeOtpremnice (#RedniBroj, #BrojOtpremnice, Kolicina, SifraArtikla)

Faktura (#BrojFakture, Datum, Napomena, Popust, BrojOtpremnice, JMBG)

StavkeFakture (#RedniBroj, #BrojFakture, Kolicina, SifraArtikla)

NalogZaPrenos (#BrojNaloga, Datum, Svrha, Iznos, PIB, BrojFakture)

Reklamacija (#BrojReklamacije, #PIB, Napomena, Datum)

StavkeReklamacije (#RedniBroj, #BrojReklamacije, #PIB, Kolicina)

Artikal (#SifraArtikla, NazivArtikal, Cena)
















10

3. Denormalizacija


Denormalizacija 3NF: Pre - joining

- Dodavanje atributa NazivKupac iz tabele Kupac u tabelu NalogZaPrenos.

NalogZaPrenos (#BrojNaloga, Datum, Svrha, Iznos, PIB, BrojFakture)

NalogZaPrenos 2 (#BrojNaloga, Datum, Svrha, Iznos, PIB, BrojFakture, NazivKupac (Kupac))

Tabela Tip trigera Atribut Potreban Akcija
Kupac Insert Ne
Update NazivKupac Da
Prilikom izmene vrednosti
NazivKupac u tabeli Kupac,
azurira se vrednost i u
tabeli NalogZaPrenos.
Delete Ne
NalogZaPrenos Insert Da
Triger azurira vrednost
NazivKupac na osnovu
vrednosti PIB.
Update
PIB Da
Triger azurira vrednost
NazivKupac na osnovu
izmenjene vrednosti
kolone PIB.
NazivKupac Da
Zabranjuje direktno
auriranje ovog atributa.
Delete Ne













11

Denormalizacija 2NF: Pre - joining

- Dodavanje atributa Datum iz tabele Otpremnica u tabelu Stavke otpremnice.

StavkeOtpremnice (#RedniBroj, #BrojOtpremnice, Kolicina, SifraArtikla)

StavkeOtpremnice 2 (#RedniBroj, #BrojOtpremnice, Kolicina, SifraArtikla, Datum (Otpremnica))

Tabela Tip trigera Atribut Potreban Akcija
Otpremnica Insert Ne
Update Datum Da
Prilikom izmene vrednosti
Datum u tabeli
Otpremnica, aurira se
vrednost i u tabeli Stavke
otpremnice.
Delete
Stavke
otpremnice
Insert Da
Triger azurira vrednost
Datum na osnovu unete
vrednosti Broj otpremnice.
Update
Broj otpremnice Da
Zabranjuje direktno
auriranje ovog atributa.
Datum Da
Zabranjuje direktno
auriranje ovog atributa.
Delete Ne

















12

4. Korisnicki definisani tipovi

- Struktuirani tip (Telefon)

create or replace
type Telefon as object
(prefiks VARCHAR2 (3),
broj VARCHAR2 (7),
member function GET_PREFIKS return VARCHAR2,
member function GET_BROJ return VARCHAR2)
instantiable final;

create or replace
type body Telefon as
member function GET_PREFIKS return VARCHAR2 is
begin
return self.prefiks;
end;
member function GET_BROJ return VARCHAR2 is
begin
return self.broj;
end;
end;


- Distinkt tip (Email)

create or replace
type Email as object
(mail varchar2 (50),
MEMBER FUNCTION get_mail RETURN varchar2)
instantiable not final;

create or replace
type body Email as
member function get_mail RETURN varchar2 IS BEGIN
return self.mail;
end;
end;


- Naredbe sa korisniki definisanim tipovima
13


INSERT INTO radnik (jmbg, ime, prezime, telefon, email, sluzba)
VALUES (1234567890111, 'pera', 'peric', telefon_obj ('065','1234567'), email_obj ('primer@mail.com'),
'prodaja');

SELECT
r.jmbg,
r.ime,
r.prezime,
r.telefon.prefiks,
r.telefon.broj,
r.email.mail,
r.sluzba
FROM
radnik r;



5. Implementacija trigera

- Denormalizacija 3NF: Pre - joining

Kupac - Update - Naziv

create or replace
TRIGGER KUPAC_UPD_NAZIV
AFTER UPDATE OF NAZIVKUPAC ON KUPAC
FOR EACH ROW
declare
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
execute IMMEDIATE 'alter trigger NALOGZAPRENOS_UPD_NAZIV disable';
update NALOGZAPRENOS set nazivkupac = :new.Nazivkupac where pib = :new.pib;
begin
execute IMMEDIATE 'alter trigger NALOGZAPRENOS_UPD_NAZIV enable'; END;
END;




14

NalogZaPrenos - Insert - Naziv

CREATE OR REPLACE TRIGGER NALOGZAPRENOS_INS_NAZIV
BEFORE INSERT ON NALOGZAPRENOS
FOR EACH ROW
declare
i_naziv_kupac varchar2 (100);
BEGIN
select nazivkupac
into i_naziv_kupac
from KUPAC
where pib = :new.pib;
:new.nazivkupac := i_naziv_kupac;
END;


NalogZaPrenos - Update - PIB

CREATE OR REPLACE TRIGGER NALOGZAPRENOS_UPD_PIB
BEFORE UPDATE OF PIB ON NALOGZAPRENOS
FOR EACH ROW
declare
i_naziv_kupac varchar2 (100);
BEGIN
select nazivkupac
into i_naziv_kupac
from KUPAC
where pib = :new.pib;
:new.nazivkupac := i_naziv_kupac;
END;



NalogZaPrenos - Update - Naziv

CREATE OR REPLACE TRIGGER NALOGZAPRENOS_UPD_NAZIV
BEFORE UPDATE OF NAZIVKUPAC ON NALOGZAPRENOS
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!');
END;

15

- Denormalizacija 2NF: Pre - joining

Otpremnica - Update - Datum

create or replace
trigger otpremnica_upd_datum
after update of datum on otpremnica
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
execute IMMEDIATE 'alter trigger stavke_otp_upd_datum disable';
update STAVKEOTPREMNICE set datum = :new.datum where brojotpremnice = :new.brojotpremnice;
begin
execute IMMEDIATE 'alter trigger stavke_otp_upd_datum enable';
end;
end;



Stavke otpremnice - Insert - Datum

create or replace trigger stavke_otp_ins_datum
before insert on STAVKEOTPREMNICE
for each row
declare
i_datum date;
BEGIN
select datum
into i_datum
from OTPREMNICA
where brojotpremnice = :new.brojotpremnice;
:new.datum := i_datum;
end;








16

Stavke otpremnice - Update - Broj otpremnice

create or replace trigger stavke_otp_upd_broj_opt
before update of brojotpremnice on STAVKEOTPREMNICE
for each row
begin
RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!');
end;



Stavke otpremnice - Update - Datum

create or replace trigger stavke_otp_upd_datum
before update of datum on STAVKEOTPREMNICE
for each row
begin
RAISE_APPLICATION_ERROR (-20000, 'Zabranjeno direktno auriranje!');
end;























17

6. Optimizacija

- Tehnika optimizacije: Repeating Single Detail with Master

Artikal (#SifraArtikla, Naziv, AktuelnaCena)
CenaArtikla (#SifraArtikla, #Datum, Cena)

Tabela Tip trigera Atribut Potreban Akcija
Artikal Insert Ne
Update AktuelnaCena Da
Zabrana direktnog azuriranja atributa
AktuelnaCena u tabeli Artikal
Delete Ne
CenaArtikla Insert Da
Prilikom unosa nove cene artikla,
okida se triger koji poziva proceduru
za auriranje atributa AktuelnaCena
na Artiklu
Update Cena Da
Prilikom azuriranja cene artikla, okida
se triger koji poziva proceduru za
auriranje atributa AktuelnaCena na
Artiklu
Delete Da
Prilikom brisanja Cene artikla, okida
se triger koji poziva proceduru za
auriranje atributa AktuelnaCena na
Artiklu



- Paket i globalna promenljiva:
create or replace
package paket
as
prom number(30):=0;
end;










18

- Triger odreuje sifru artikla i postavlja u globalnu promenljivu:
CREATE OR REPLACE
TRIGGER aktuelna_cena1
BEFORE INSERT OR UPDATE OR DELETE ON CENAARTIKLA
FOR EACH ROW
BEGIN
IF (INSERTING OR UPDATING)
THEN
BEGIN paket.prom:= :NEW.SIFRAARTIKLA; END;
ELSE
BEGIN paket.prom:= :OLD.SIFRAARTIKLA; END;
END IF;
END;

- Triger za pozivanje procedure:
CREATE OR REPLACE
TRIGGER aktuelna_cena2
AFTER INSERT OR UPDATE OR DELETE ON CENAARTIKLA
DECLARE
s NUMBER := paket.prom;
BEGIN
aktuelnacena (s);
END;

- Procedura za odreivanje aktuelne cene:
CREATE OR REPLACE
PROCEDURE aktuelnacena (SifraPro IN NUMBER) AS
aktCena artikal.aktuelnacena%type;
BEGIN aktCena:=0;
SELECT cena INTO aktCena
FROM cenaartikla
WHERE sifraartikla=SifraPro and datum=
(select max(datum)
from cenaartikla
where sifraartikla = SifraPro and datum<=sysdate);
UPDATE artikal
SET aktuelnacena = aktCena
WHERE sifraartikla = SifraPro;
END;



19

- Tehnika optimizacije: Storing Derivable Values

Faktura (#BrojFakture, Datum, Napomena, Popust, BrojOtpremnice, JMBG, UkupnoZaUplatu)
StavkeFakture (#RedniBroj, #BrojFakture, Kolicina, SifraArtikla)
Artikal (#SifraArtikla, NazivArtikal, SifraJM, AktuelnaCena)

Tabela Tip trigera Atribut Potreban Akcija
Faktura Insert Ne
Update UkupnoZaUplatu Da
Zabrana direktnog azuriranja
atributa UkupnoZaUplatu
Delete Ne
StavkeFakture Insert Da
Prilikom unosa nove Stavke
fakture, okida se triger koji
poziva proceduru za azuriranje
atributa UkupnoZaUplatu na
Fakturi
Update Kolicina Da
Prilikom azuriranja nove
Stavke fakture, okida se triger
koji poziva proceduru za
auriranje atributa
UkupnoZaUplatu na Fakturi
Delete Da
Prilikom brisanja Stavke
fakture, okida se triger koji
poziva proceduru za azuriranje
atributa UkupnoZaUplatu na
Fakturi


















20

- Triger koji odreuje ifru fakture i postavlja je u promenljivu:
CREATE OR REPLACE
TRIGGER ukupno_1
BEFORE INSERT OR UPDATE OR DELETE ON stavkefakture
FOR EACH ROW
BEGIN
IF (INSERTING OR UPDATING)
THEN
BEGIN paket.prom:=:NEW.brojfakture;END;
ELSE
BEGIN paket.prom:=:OLD.brojfakture;END;
END IF;
END;

- Triger za pozivanje procedure:
CREATE OR REPLACE
TRIGGER ukupno_2
AFTER INSERT OR UPDATE OR DELETE ON stavkefakture
DECLARE
s NUMBER:=paket.prom;
BEGIN
ukupna_suma_za_uplatu(s);
END;

- Procedura za odreivanje ukupne sume za uplatu:
CREATE OR REPLACE
PROCEDURE ukupna_suma_za_uplatu (sifDok IN NUMBER) AS
suma NUMBER:=0;
BEGIN
SELECT SUM(p.aktuelnacena*sp.kolicina) INTO suma
FROM artikal p join stavkefakture sp on (p.sifraartikla=sp.sifraartikla)
WHERE brojfakture=SifDok;
UPDATE faktura
SET ukupnozauplatu=suma
WHERE brojfakture=SifDok;
END;






21

7. Vertikalno particionisanje i index

Pre particionisanja
Radnik (#JMBG, Ime, Prezime, Telefon, Email, Sluzba)

Posle particionisanja:
Radnik (#JMBG, Ime, Prezime)
RadnikDetalji (#JMBG, Telefon, Email, Sluzba)


create or replace view radnikpogled as select
r.jmbg, r.ime, r.prezime, rd.telefon, rd.email, rd.sluzba
from
radnik r, radnikdetalji rd
where
r.jmbg = rd.jmbg



create or replace
trigger pogled_radnik_trg
instead of insert on radnikpogled
for each row
begin
insert into radnik (jmbg, ime, prezime) values (:new.jmbg, :new.ime, :new.prezime);
insert into radnikdetalji (jmbg, telefon, email, sluzba) values (:new.jmbg, :new.telefon, :new.email,
:new.sluzba);
end;


CREATE INDEX RADNIK_IND ON radnik (ime);

You might also like