Documente Academic
Documente Profesional
Documente Cultură
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"
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)
-- 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;
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; /
- Constrangeri chei externe si chei primare pentru tabelele locale se afla in scriptul de insert tabele