Sunteți pe pagina 1din 6

Proiect Baze de Date Distribuite

In acest proiect se vor demonstra principiile bazelor de date distribuite, crearea fragmentarilor, transparentei si constrangerilor. 1. Descrierea proiectului. Proiectul presupune creearea interfetei de administrare a promotiilor realizate de Coca Cola si a celor realizate de concurenta intr-un sistem distribuit de baze de date. Pentru acesta a fost aleasa o restrictie a entitatilor si relatiilor din acest sistem. Entitatile utilizate in cadrul proiectului sunt urmatoarele: Magazin contine multimea punctelor unde se vind bauturi nealcoolice si unde au loc promotiile care ne intereseaza. Acesta entitate va fi replicata. Produse contine multimea produselor bauturi nealcoolice care sunt urmarite si analizate. Aceasta entitate va fi fragmentata orizontal derivat. Saptamana contine lista saptamanilor supuse analizei, unde saptamana este unitatea minima de timp in care se urmaresc vanzarile si promotiile. Aceasta entitate va fi fragmentata vertical. Vanzari contine datele din vanzari pentru fiecare magazin, saptamana si produs. Aceasta entitate va fi fragmentata orizontal derivat. Brand contine multimea brandurilor de bauturi nealcoolice ale tuturor producatorilor care sunt supusi studiului. Aceasta entitate va fi fragmentata orizontal primar dupa codul producatorului, interesandu-ne separat promotiile Coca-Cola fata de cele ale concurentei. Nu fragmentam direct entitatea PRODUCATOR intru-cat contine elemente de tip .gif care nu pot fi vizualizate de pe un alt server. Producator contine multimea producatorilor supusi studiului. Aceasta entitate va fi replicate, intru-cat contine elemente de tip .gif care nu pot fi vizualizate de pe un alt server.

PRODUSE "Prod_ID" "Brand_ID" "Name" "Volume "Pack" MAGAZIN "CHAIN_ID" "CHAINNAME" VANZARI "PROD_ID" "CHAIN_ID" "WEEK" "VOLUM" SAPTAMANA "WEEK" "YEAR" "QUARTER" "STARTWEEKDATE"

"VALOARE" BRAND "BRAND_ID" "MANUF_ID" "BRAND"

PRODUCATOR "MANUF_ID" "MANUFACTURER" "IMAGINE"

2. Crearea fragmentelor orizontale si a fragmentelor verticale

Tabela BRAND va fi fragmentata orizontal dupa predicatele : p1: MANUF_ID =1 CREATE TABLE PRODUCATOR_COKE AS SELECT * FROM PRODUCATOR@DODPROD WHERE MANUFACTURER='Coca-Cola'; p2: MANUF_ID <> 1 CREATE TABLE PRODUCATOR_COMPETITIE AS SELECT * FROM PRODUCATOR WHERE MANUFACTURER NOT IN 'Coca-Cola'; Tabela SAPTAMANA va fi fragmentata vertical, astfel: - pe DODPROD atributele ei vor fi (Week, Year)

- pe DODSTAGE atributele vor fi (Week, Quarter, StartWeekDate)

3. Furnizarea formelor de transparenta pentru modelul ales.

- Transparenta pentru fragmentele verticale si cele orizontale.


CREATE OR REPLACE VIEW ViewBrand AS SELECT * from BRAND_COKE UNION ALL SELECT * from BRAND_COMPETITIE@DODSTAGE; / CREATE OR REPLACE VIEW ViewProduse AS SELECT * from Produse_COKE UNION ALL SELECT * from Produse_COMPETITIE@DODSTAGE; / CREATE OR REPLACE VIEW Viewvanzari AS SELECT * from vanzari_COKE UNION ALL SELECT * from vanzari_COMPETITIE@DODSTAGE; / CREATE OR REPLACE VIEW ViewSaptamana AS select coke.week, year, quarter, startweekdate from saptamana_coke coke, saptamana_competitie@dodstage competitie where coke.week=competitie.week; / -- trigger de insert pentru tabel fragmentat orizontal create or replace trigger t_brand_insert instead of insert on viewbrand for each row begin if (:new.manuf_id)='1' then insert into brand_coke values(:new.brand_id, :new.manuf_id, :new.brand); else insert into brand_competitie@dodstage values(:new.brand_id, :new.manuf_id, :new.brand); end if; end; /

-- trigger complet pentru tabel fragmentat vertical create or replace trigger trig_saptamana instead of insert or delete or update on viewsaptamana for each row begin if inserting then insert into saptamana_coke values (:new.week, :new.quarter, :new.startweekdate); insert into saptamana_competitie@dodstage values (:new.week, :new.year); elsif deleting then delete from saptamana_coke where week=:old.week; delete from saptamana_competitie@dodstage where week=:old.week; elsif updating then if updating('quarter') then update saptamana_coke set quarter=:new.quarter where week=:old.week; end if; if updating('startweekdate') then update saptamana_coke set startweekdate=:new.startweekdate where week=:old.week; end if; if updating('year') then update saptamana_competitie@dodstage set year=:new.year where week=:old.week; end if; end if; end; / --trigger de insert pentru tabel replicat create or replace trigger trig_rep_magazin after insert on magazin for each row begin insert into magazin@dodstage values (:new.chain_id, :new.chainname); end; / -- trigger de delete pentru tabel fragmentat orizontal create or replace trigger trig_del_vanzari

instead of delete on viewvanzari for each row begin delete from vanzari_coke where prod_id=:old.prod_id and chain_id=:old.chain_id and week=:old.week; delete from vanzari_competitie@dodstage where prod_id=:old.prod_id and chain_id=:old.chain_id and week=:old.week; end; / --trigger complet pentru tabel fragmentat orizontal create or replace trigger trig_rep_producator after insert or delete or update on producator for each row begin if inserting then insert into producator@dodstage values (:new.manuf_id, :new.manufacturer, :new.imagine); elsif deleting then delete from producator@dodstage where manuf_id=:old.manuf_id; elsif updating then if updating('manufacturer') then update producator@dodstage set manufacturer=:new.manufacturer where manuf_id=:old.manuf_id; end if; if updating('imagine') then update producator@dodstage set imagine=:new.imagine where manuf_id=:old.manuf_id; end if; end if; end; /

- Transparenta pentru tabelele stocate in alta baza de date fata de cea la care se conecteaza aplicatia.
create synonym saptamana_competitie for saptamana_competitie@dodstage;

4. Asigurarea tuturor constrangerilor de integritate folosite in model

- unicitate globala la fragmentarea orizontala

create or replace trigger t_unique_brand_coke before insert on brand_coke for each row declare nr number; begin select count(*) into nr from brand_competitie@dodstage where brand = :new.brand; if nr<>0 then raise_application_error(-20000,'nume de brand duplicat'); end if; end; /

- Constrangere cheie primara fragmentarea orizontala


CREATE SEQUENCE seq_produse_coke INCREMENT BY 2 START WITH 7 NOCYCLE;

CREATE SEQUENCE seq_produse_competitie INCREMENT BY 2 START WITH 8 NOCYCLE;

- Constrangeri chei externe si chei primare pentru tabelele locale se afla in scriptul de insert tabele

S-ar putea să vă placă și