En aplicacions reals,
una base de dades està formada per diverses taules relacionades
entre elles.
Les relacions
entre taules serveixen per evitar introduir informació duplicada,
estalviar temps i evitar errades i inconsistències a la base de
dades.
Posem un exemple concret.
Ens han encarregat el disseny d'una base de dades per gestionar els préstecs
d'una biblioteca.
Suposarem que només hi ha un exemplar de cada llibre i que cada
persona pot demanar tants llibres com vulgui (sempre que no estiguin ja
prestats, evidentment).
A més de les dades del llibre (codi, títol i autor) necessitarem
saber com a mínim el DNI, nom i telèfon de la persona a
qui hem prestat el llibre. Per simplificar, no tindrem en compte la data
de préstec i/o de retorn.
Per no complicar-nos
la vida, decidim (incorrectament) fer-ho amb una sola taula.
La taula podria quedar més o menys així:

Quin problemes ens
podem trobar si ho fem així?
- Cada cop que deixem un llibre cal introduir totes les dades de la persona.
Això suposa una pèrdua de temps ja que cal escriure dades
que ja teníem introduïdes i augmenta la possibilitat de què
ens equivoquem en alguna lletra o número. A més, només
que canviem alguna lletra del nom (minúscules per majúscules,
accents, espais...) resultarà difícil (si no impossible)
trobar tots els llibres que té, quedant la base de dades inconsistent.
- Si la persona canvia de domicili o de telèfon cal canviar-ho
a tots els llibres que té en préstec (dades duplicades).
Haurem de buscar tots els llibres que té i canviar-ho a tots (més
pérdua de temps). Al fer tants de canvis és fàcil
equivocar-se (més errors). Si el nom de la persona no està
escrit exactament igual a tot arreu, és possible que no trobem
tots els llibres que té i per tant en alguns llibres hi haurà
l'adreça o telèfon nou i en d'altres l'antic (més
inconsistència a la base de dades).
Ara que hem vist els
problemes decidim fer el disseny utilitzant dues taules, una pels socis
i una altra pels llibres.
Les taules quedaran més o menys així (els camps clau són
el Codi del llibre i el DNI del soci):

Amb aquest sistema
evitem els inconvenients anteriors:
- Quan deixem un llibre només caldrà introduir el codi del
soci. Evitem haver d'escriure cada cop totes les dades de la persona,
per tant estalviarem temps i evitarem errades i inconsistències
a la base de dades.
Evidentment, sempre podem equivocar-nos al escriure el codi però
és menys probable i es podria evitar utilitzant un lector de codis
de barres.
- Si hem de canviar alguna de les dades del soci només cal fer-ho
una vegada a la taula de socis. No caldrà fer-ho repetidament,
per tant estalviarem temps i evitarem errors i inconsistències.
Tal com estan ara
aquestes taules no es pot saber a qui s'ha prestat cada llibre, però
això ho solucionarem relacionant les dues taules.

El cas més
habitual de relació entre taules és quan un element d'una
de les taules pot estar relacionat amb diversos elements de l'altra. D'això
se'n diu una relació 1 a N.
Per exemple, en el
cas de la biblioteca, si tenim les dues taules anteriors, es pot veure
que un soci pot tenir més d'un llibre, però cada llibre
només pot estar prestat a un soci (per simplificar hem suposat
que només tenim un exemplar de cada llibre).

Ara bé, per
poder relacionar dues taules cal que tinguin al menys un camp en comú.
El problema és: quin camp hem d'afegir i en quina taula?
Per crear relacions
1 a N hem d'afegir en una de les taules un camp que sigui igual que el
camp clau de l'altra taula, per tant tenim dues possibilitats:
1 - Afegir el camp Codi del llibre a la taula Socis (incorrecte)
2 - Afegir el camp DNI del soci a la taula Llibres (correcte)
La forma més
fàcil de saber quina és l'opció correcta és
buscar com és la relació 1 a N.
L'enunciat del problema diu que un soci pot tenir més d'un llibre,
per tant la relació és:
1 soci --> N llibres
Un cop hem trobat
aquesta relació, la taula on hem d'afegir el camp sempre és
la taula que té la N, la taula Llibres, i el camp
ja hem dit que havia de ser el camp clau de l'altra taula, per tant serà
el camp DNI del soci.
Aquest camp comú és el que permetrà relacionar les
dues taules.
ATENCIÓ: el camp que hem d'afegir ha de ser del mateix tipus,
mida i format que el camp clau de l'altra taula, però si el camp
clau de l'altra taula és de tipus Autonumérico, el
camp afegit ha de ser de tipus Numérico amb el format Entero
largo.
Un cop afegit aquest
camp, les taules quedaran així:


Ja només ens
falta indicar a l'Access que aquestes dues taules estan relacionades a
traves del camp DNI del soci.
Per fer-ho, primer
clicarem al botó
(només apareix si seleccionem la finestra principal de la base
de dades).
Apareixerà
una finestra amb un diàleg on haurem de seleccionar les taules,
fer clic al botó Agregar i tancar el diàleg.
Ara
tindrem totes les taules però sense cap relació. Per relacionar-les
haurem d'arrossegar el camp afegit fins al camp clau relacionat, com mostra
la imatge.
Apareixerà
un diàleg en el que convé marcar la casella Exigir integridad
referencial i també Actualizar en cascada. Això
evitarà que la base de dades quedi inconsistent:
- Exigir integridad
referencial serveix per evitar que a la taula Llibres s'introdueixin
DNIs inexistents a la taula de Socis.
- Actualizar en
cascada serveix perquè si es canvia un DNI a la taula Socis,
també es canviï automàticament a la taula Llibres.
- Eliminar en
cascada serveix per eliminar registres relacionats. Si eliminem
un soci, també eliminarà automàticament els llibres
que tingui prestats. En la majoria de casos aquesta opció no
s'ha de marcar. Si no està marcada, quan intentem esborrar un
soci que té llibres prestats ens avisarà que no és
possible.
Si tenim més
de dues taules, cal repetir aquesta operació amb totes les relacions
que necessitem.
En una base
de dades ben dissenyada totes les taules haurien de tenir com a mínim
una relació.
Quan tanquem la finestra
de relacions ens demanarà si volem guardar els canvis i li haurem
de dir que sí.
ATENCIÓ: és molt recomanable no introduir dades a les
taules abans de relacionar-les, especialment en els camps que hem afegit
per poder-les relacionar.
|