|
Relatii - access
Relatiile sunt al doilea obiect, care impreuna cu tabelele defineste structura(schema) unei baze de date. Ele au rolul de a permite accesarea mai multor tabele in acelasi timp.
Asa cum s-a mai aratat relatiile se realizeaza intre doua campuri care apartin la doua tabele sau cereri.(care sunt privite tot ca niste tabele, dar virtuale). Pentru ca o relatie sa fie logica, este necesar, ca in cele doua tabele, campurile intre care se stabileste relatia sa se refere la aceleasi date.
In Access se pot crea si folosi, functie de domeniul lor de valabilitate, doua tipuri de relatii, permanente si temporare.
1 Relatiile permanente. Relatiile permanente, sunt valabile pentru toate obiectele din baza de date. Ele se vor atasa definitiv la tabele sau cererile intre care se creeaza. Oriunde se vor folosi aceste obiecte, ele vor fi legate intotdeauna prin relatiile create.
Unei relatii permanente i se poate seta proprietatea de integritate referentiala, care joaca un rol major asupra structurii bazei de date.
Metoda prin care se creeaza relatiile permanente, este implementata de modulul Relationships. Acesta se poate lansa prin mai multe feluri:
- din meniul Tools
- actionand pictograma specifica relatiilor, direct de pe ToolsBar.
- din meniul contextual, lansat din fereastra Database.
De acest tip de relatii, permanente, ne vom ocupa in continuare.
O tabela sau o cerere care participa la o relatie nu va mai putea fi stearsa decat daca in prealabil sunt eliminate toate relatiile la care aceasta participa.
2 Relatiile temporare. Relatiile temporare sunt create de obicei in cereri, fiind valabile numai in obiectul in care au fost definite. Ele se folosesc numai in operatiile de extragere a informatiilor din baza de date. Prin aceste relatii nu se poate introduce proprietatea de integritate referentiala. Din aceasta cauza ele nu au nici un rol in ceea ce priveste structura bazei de date.
O relatie temporara poate inlocui intr-o cerere o relatie permanenta, prin setarea in mod diferit a proprietatii specifice folosita la extragerea datelor(Join Type).
1 Crearea unei relatii intre doua tabele
Daca avem mai multe tabele intre care vrem sa cream anumite legaturi vom apela functia Relationships. Pe ecran va apare fereastra Show Table din care vom alege tabelele intre care vom crea legatura. Vom selecta tabela dorita si vom apasa butonul Add. Vom face acest lucru pe rand cu toate tabelele dorite sau selectam mai multe tabele in acelasi timp si apasam butonul Add.
Figura 1.1 Fereastra Show Table
Pe ecran, in fereastra Relationships, vor aparea tabelele pe care vrem sa le legam. In continuare, prin tragerea(drag and drop) campurilor intre tabelele(cererile) aflate in fereastra Relationships, se construiesc relatiile dorite.
Figura 1.2 Construirea relatiilor - fereastra Relationships
Nu vom putea crea legaturi intre doua tabele dupa orice campuri ci doar dupa acele campuri care intr-o tabela sunt cheie primara si in cealalta tabela cheie externa. Cele doua campuri dupa care se face legatura trebuie sa fie de acelasi tip.
O relatia se poate sterge sau edita prin lansarea meniului contextual al acesteia(se pozitioneaza mouse-ul pe relatie si clic dreapta).
Se editeaza relatia prin intermediul ferestrei Edit Relationship. Prin aceasta operatie se stabilesc proprietatile relatiei.
Tot cu modulul Relationships se vor putea defini si relatii multiple intre doua tabele(cereri), adica relatii care se stabilesc intre mai multe campuri(nu numai doua).
Practic definirea relatiilor se face prin actiuni de selectie din liste, tragere sau setare, facute numai cu mouse-ul.
2 Tipul relatiei
Tipul relatiei reprezinta de fapt modalitatea in care se vor asocia inregistrarile din cele doua tabele(cereri), din punctul de vedere al numarului posibil de inregistrari pe care fiecare tabela(cerere) il furnizeaza in realizarea relatiei respective.
El este determinat automat functie de proprietatile campurilor care participa la relatie, fiind afisat in partea de jos a ferestrei ca in figura 1.2.
Astfel, daca un camp e cheie primara sau are proprietatea Indexed setata la Yes(No Duplication), relatia va fi in acel capat One.
Daca un camp de legatura are proprietatea Indexed setata la No sau Yes(Duplication OK), atunci relatia in acel loc va fi Many.
Daca in ambele capete relatia este No Indexed sau Indexed-Duplication OK, atunci relatia va fi nedeterminata(many to many).
Figura 2.1 Tipuri de relatii
3 Integritatea referentiala
Integritatea referentiala, are efect deosebit in ceea ce priveste pastrarea corelatiilor logice care se stabilesc intre campurile unei relatii. Ea este o proprietate, valabila numai pentru relatiile permanente.
Daca se doreste ca relatia editata sa aiba proprietatea de integritatea referentiala se va bifa caseta de validare - Enforce Referential Integrity.
Reamintim ca daca o relatie intre doua tabele are proprietatea de integritate referentiala, atunci nu pot exista in tabela copil pentru campul de relatie, valori care sa nu se gaseasca in campul corespunzator din tabela parinte.
Daca relatia este de tip one to many, intotdeauna tabela parinte va fi in partea one a relatiei. Daca relatia este de tip one to one, oricare dintre tabele poate fi parinte, aceasta fiind cea de la care se porneste 'tragerea', si care in fereastra de editare se va gasi afisata in partea stanga. Daca relatia este de tip many to many (nedeterminata), atunci proprietatea de integritate referentiala nu va putea fi setata.
Daca o relatie are setata integritate referentiala atunci se pot selecta(bifa) doua optiuni care vor permite ca actiunea de actualizare a unui camp sau stergere a unor inregistrari din tabela parinte sa se propage si in tabelele legate de aceasta. Acestea sunt:
► Cascade Update Related Fields (actualizarea in cascada a campurilor din relatie). In acest caz, daca se va modifica valoarea dintr-un camp al unei tabele parinte, atunci aceasta modificare se va efectua automat si asupra campului corespunzator din tabela copil, daca acesta e legat de tabela parinte printr-o relatie cu setarea de mai sus facuta. In felul acesta, integritatea referentiala este pastrata pentru respectiva relatie.
► Cascade Delete Related Records (stergerea in cascada a inregistrarilor din relatie). In acest caz, stergerea unei inregistrari din tabela parinte, va duce la stergerea automata din tabela copil, a tuturor inregistrarilor care vor avea in campul de relatie, aceiasi valoare cu cea din inregistrarea care a fost stearsa.
Deci, daca la o relatie, care are proprietatea de integritatea referentiala, sunt setate ambele optiuni atunci actualizari in tabela parinte care ar trebui sa fie refuzate(blocate) pentru ca produc in tabele copil "stricarea" integritatii referentiale, vor fi acceptate si efectuate, dar in acelasi timp, automat se vor face si prelucrarile necesare in tabela copil, pentru care proprietatea de care discutam sa se mentina corecta, adica sa nu existe "copil" care sa nu aiba "parinti" in tabelele din ierarhia superioara.
Exemplu: Intre tabelele PRODUSE si STOCURI este creata o relatie one to many, intre campurile Cod_P din cele doua tabele. In functie de activarea sau nu a integritatii referentiale si de setarea sau nu a celor doua optiuni, avem urmatoarele operatii permise:
PRODUSE |
|||
DenumireP |
Um |
Pret |
Cod_P |
P1 |
Kg |
10 |
1 |
P2 |
L |
15 |
2 |
P3 |
Kg |
25 |
3 |
P4 |
L |
45 |
4 |
STOCURI |
||
Cod_P |
Cod_G |
Stoc |
1 |
101 |
10 |
1 |
102 |
25 |
1 |
103 |
15 |
3 |
102 |
30 |
4 |
101 |
50 |
4 |
103 |
20 |
1. Integritatea referentiala nu este setata.
Sunt permise orice modificari de campuri sau stergeri de inregistrari in ambele tabele. Se observa ca daca, de exemplu se sterge inregistrarea 1 din PRODUSE, inregistrarile 1, 2 si 3 din STOCURI, raman fara informatiile de nivel superior(fara parinti).
2. Integritatea referentiala este setata, dar nu si stergerea si actualizarea in cascada
. Se sterge inregistrarea 1 din PRODUSE - operatia nu este acceptata
. Se sterge inregistrarea 2 din PRODUSE - operatia este acceptata
. Se modifica Cod_P din inregistrarea 1 din PRODUSE cu valoarea 10 - operatia nu este acceptata
. Se modifica Cod_P din inregistrarea 2 din PRODUSE cu valoarea 10 - operatia este acceptata
. Se sterge inregistrarea 1 din STOCURI - operatia este acceptata
. Se modifica Cod_P din inregistrarea 1 din STOCURI cu valoarea 10 - operatia nu este acceptata
3. Integritatea referentiala este setata, precum si stergerea si actualizarea in cascada.
. Se sterge inregistrarea 1 din PRODUSE - operatia este acceptata, dar se sterg automat si inregistrarile 1, 2 si 3 din STOCURI
. Se sterge inregistrarea 2 din PRODUSE - operatia este acceptata
. Se modifica Cod_P din inregistrarea 1 din PRODUSE cu valoarea 10 - operatia este acceptata , dar se modifica automat si in inregistrarile 1, 2 si 3 din STOCURI, Cod_P cu 10.
. Se modifica Cod_P din inregistrarea 2 din PRODUSE cu valoarea 10 - operatia este acceptata
. Se sterge inregistrarea 1 din STOCURI - operatia este acceptata
. Se modifica Cod_P din inregistrarea 4 din STOCURI cu valoarea 10 - operatia nu este acceptata
4 Tipul de legatura a unei relatii - Join Type
Tipul de legatura a unei relatii (Join Type), reprezinta o proprietate a relatiei care are efect in ceea ce priveste extragerea de date corelate din tabelele care participa la aceasta.
Problema pe care o rezolva aceasta proprietate este urmatoarea: daca in unul din tabele, exista inregistrari pentru care in campul de relatie contine valori care nu se regasesc in campul corespondent din cealalta tabela, care vor fi inregistrarile care se vor selectiona din ambele tabele?
Ea este o proprietate, valabila atat pentru relatiile permanente cat si pentru cele temporare(din cereri). Este o proprietate care are un rol hotarator in executia cererilor care folosesc la intrare mai multe tabele corelate.
Setarea tipului de legatura se face prin actionarea din modulul de editare a relatiei permanente a butonului de comanda Join Type, care va duce la aparitia ferestrei Join Properties, prezentata mai jos.
Figura 1 Fereastra Join Type
In cazul relatiilor temporare, fereastra Join Properties, apare direct in momentul in care se editeaza relatia.
Functie de inregistrarile care sunt selectate din cele doua tabele(cereri) care intra in relatie exista doua tipuri de legaturi:
► Inner Join. In acest tip de legatura vor fi selectionate numai acele inregistrari care au campul de legatura egal in ambele tabele (cereri).
► Outer Join. In acest tip de legatura vor fi selectionate toate inregistrarile unei tabele iar din cealalta, numai acele inregistrari care au campul de legatura egal in ambele tabele (cereri). In functie de tabela(cererea) care intra cu toate inregistrarile vom avea:
- Left Outer Join (stanga) - se considera toate inregistrarile din tabelul din stanga, iar din tabelul din dreapta numai acele inregistrari care au campul de legatura egal in ambele tabele
- Right Outer Join (dreapta) - se considera toate inregistrarile din tabelul din dreapta, iar din tabelul din stanga numai acele inregistrari care au campul de legatura egal in ambele tabele
Exemplu: Consideram doua tabele PRODUSE si STOCURI, legate printr-o relatie de tipul one to many realizata intre campurile Cod_P si care nu are setata proprietatea de integritate referentiala.
PRODUSE |
|||
DenumireP |
Um |
Pret |
Cod_P |
P1 |
Kg |
10 |
1 |
P2 |
L |
15 |
2 |
P3 |
Kg |
25 |
3 |
P4 |
L |
45 |
4 |
STOCURI |
||
Cod_P |
Cod_G |
Stoc |
1 |
101 |
10 |
1 |
102 |
25 |
1 |
103 |
15 |
3 |
102 |
30 |
4 |
101 |
50 |
4 |
103 |
20 |
5 |
103 |
50 |
1. Tipul de legatura a relatiei este Inner Join. Se vor extrage urmatoarele inregistrari:
- Din tabela PRODUSE - inregistrarile: 1; 3; 4
- Din tabela STOCURI - inregistrarile: 1; 2; 3; 4; 5; 6
1 |
101 |
10 |
1 |
102 |
25 |
1 |
103 |
15 |
3 |
102 |
30 |
4 |
101 |
50 |
4 |
103 |
20 |
P1 |
Kg |
10 |
1 |
P3 |
Kg |
25 |
3 |
P4 |
L |
45 |
4 |
2. Tipul de legatura a relatiei este Left Outer Join.
- Din tabela PRODUSE - toate inregistrarile: 1; 2; 3; 4
- Din tabela STOCURI - inregistrarile: 1; 2; 3; 4; 5; 6
1 |
101 |
10 |
1 |
102 |
25 |
1 |
103 |
15 |
3 |
102 |
30 |
4 |
101 |
50 |
4 |
103 |
20 |
P1 |
Kg |
10 |
1 |
P2 |
L |
15 |
2 |
P3 |
Kg |
25 |
3 |
P4 |
L |
45 |
4 |
3. Tipul de legatura a relatiei este Right Outer Join. Se vor extrage urmatoarele inregistrari:
- Din tabela PRODUSE - inregistrarile: 1; 3; 4
- Din tabela STOCURI - toate inregistrarile: 1; 2; 3; 4; 5; 6; 7
1 |
101 |
10 |
1 |
102 |
25 |
1 |
103 |
15 |
3 |
102 |
30 |
4 |
101 |
50 |
4 |
103 |
20 |
5 |
103 |
50 |
P1 |
Kg |
10 |
1 |
P3 |
Kg |
25 |
3 |
P4 |
L |
45 |
4 |
5 Crearea relatiilor multiple.
Intre doua tabele se pot crea relatii multiple, adica intre mai multe campuri. Metoda folosita consta in realizarea la inceput a unei relatii, dupa care, in modulul de editare al acesteia, se vor selecta in cele doua casete din partea superioara, campurile din tabelele intre care se vor stabili si celelalte relatii.
Pentru toate relatiile create intre cele doua tabele, se permite o singura proprietate pentru tipul de legatura.
Figura 5.1 Crearea relatiilor multiple