Unió relacional
Autor: Dr. Joan Nunes. Universitat Autònoma de Barcelona
Promotor: Institut Cartogràfic de Catalunya, 2013
La unió relacional (join) és una operació que permet relacionar i combinar dues o més taules d'una base de dades relacional en una sola taula per mitjà de la correspondència o comparació entre els valors de camps comuns a les taules de la base de dades.
Els sistemes de gestió de bases de dades permeten realitzar diversos tipus d'unió relacional, generalment per mitjà del llenguatge SQL a través de la clàusula where. La unió relacional compara els registres de les taules per establir la correspondència entre aquests registres d'acord amb els valors en els camps comuns i el criteri o condició de comparació (igual, no igual, menor que, etc.) i produeix un conjunt de registres amb informació combinada dels registres originals de les diverses taules participants a l'operació. En el llenguatge SQL, la unió relacional pot estar incorporada dins d'altres operacions de bases de dades, com és ara la selecció, l'actualització o la supressió, que actuaran sobre els registres que resultin de la unió relacional. El cas més senzill d'operació en què intervé la unió relacional sol ser una selecció en què s'obtenen els registres concordants i es mostra la informació combinada de les taules en forma d'una nova taula.
Els sistemes d’informació geogràfica solen proporcionar una versió simplificada d'unió relacional, que combina la informació de només dues taules per mitjà de la correspondència a través d'un sol camp comú, de forma virtual o física segons els programes.
SUMARI
- Origen
- Definició
- Tipus d'unions relacionals
- La unió relacional en els sistemes d'informació geogràfica
- Temes relacionats
- Referències
- Lectures recomanades
Origen
La unió relacional és un dels operadors de l'àlgebra relacional, que constitueix el fonament dels llenguatges d'interrogació de bases de dades en el model relacional de bases de dades formulat per E.F. Codd el 1970 (Codd, 1970; 1990).
Definició
En matemàtiques l'àlgebra relacional és una àlgebra definida sobre relacions per mitjà de sis operadors bàsics (selecció, projecció, producte cartesià, unió de conjunts, diferència de conjunts i canvi de nom), la qual constitueix un subconjunt del càlcul de predicats de primer ordre.
L'aplicació de l'àlgebra relacional a la interrogació de bases de dades opera sobre taules, en lloc del concepte matemàtic de relacions, i incorpora algunes restriccions com el fet de treballar únicament sobre relacions (taules amb un nombre finit de tuples (registres).
L'operació d'unió relacional és un operador derivat dins de l'àlgebra relacional. Concretament és un operador binari que dóna com a resultat el conjunt de totes les combinacions de registres de dues taules que tenen valors iguals en un o més atributs comuns. Aquest concepte, que correspon al d'unió relacional interna, ha estat ampliat a altres tipus d'unió relacional que utilitzen altres restriccions de combinació de registres i altres termes de comparació que la simple igualtat de valors.
La unió relacional, i en particular la unió relacional interna, és probablement un dels operadors d'interrogació de bases de dades més importants, ja que és l'equivalent relacional de l'operador lògic AND. En particular, la unió relacional interna permet la combinació de taules que estan relacionades per mitjà d'una clau forana.
En termes pràctica, en la interrogació de bases de dades la unió relacional és l'operació que combina registres de dues o més taules que continguin valors comuns en dos o més dels seus camps, d’acord amb una determinada condició de comparació entre els valors d'aquests camps comuns (generalment d'igualtat, però no necessàriament). El resultat és un conjunt de registres que es comporta com una nova taula, virtual (una vista, que és el més habitual) o física (una taula, si el resultat s'emmagatzema com a tal). L'operació d'unió relacional fa efectives les relacions de correspondència entre taules, implicades per l'existència de claus foranes o simplement de camps comuns en les taules.
En les bases de dades relacionals la unió relacional s'implementa en el llenguatge SQL, per mitjà d'operacions de consulta (SELECT) o altres (DELETE, UPDATE,...). La correspondència entre camps de les taules, i el tipus de comparació entre els respectius valors, s'estableix a la clàusula WHERE. En el llenguatge SQL, la unió relacional es realitza escrivint una sentència o predicat, com per exemple:
SELECT * FROM taulaA, taulaB WHERE taulaA.camp1 = taulaB.camp2;
Exemple d'unió relacional entre dues taules, en particular d'una unió relacional natural.
La unió relacional no és una operació commutativa. Per aquest motiu se sol distingir entre la taula de destinació, que és la aula que rep la informació d'una altra taula, i la taula a combinar que és la que conté la informació que s'afegeix a la primera taula. En les expressions per a executar l'operació, la taula de destinació és la primera taula indicada, o en termes informals la taula "de l'esquerra".
Tipus d'unions relacionals
Unió relacional interna
Unió relacional interna
La unió relacional interna (inner join) és el tipus més comú d'unió relacional en els llenguatges de consulta de bases de dades. De fet, és l'opció per defecte en llenguatges com SQL. El resultat d'una unió relacional interna és una taula que conté només els registres en què hi ha concordança de valors en els camps comuns entre les dues, o en general que satisfan la condició de la unió relacional.
En el llenguatge de consulta de bases de dades SQL hi ha dues sintaxis per a expressar la unió relacional interna: la sintaxi explícita i la la sintaxi implícita, que és la més habitual:
implícita:
SELECT * FROM taulaA, taulaB WHERE taulaA.camp1 = taulaB.camp2;
explícita:
SELECT * FROM taulaA INNER JOIN taulaB ON taulaA.camp1 = taulaB.camp2;
Exemple d'unió relacional interna: la taula resultat no conté cap dels registres de cap de les taules que no troben correspondència a l'altra taula ("Ferrol" a la taula A i "Tarragona" a la taula B). El cas de la figura és també un exemple d'unió relacional d'igualtat.
Unió relacional d'igualtat
La unió relacional d'igualtat (equijoin) és el cas particular d'unió relacional interna que utilitza únicament la igualtat com a operador de comparació de valors. En una unió relacional d'igualtat no s'admeten comparatius com per exemple < o <= (menor que, o menor o igual que). Sol ser el cas més habitual d'unió relacional interna.
Unió relacional natural
La unió relacional natural (natural join) és un cas particular de la unió relacional d'igualtat. En la unió relacional natural els camps comuns a les dues o més taules que es combinen mitjançant la unió relacional han de tenir el mateix nom i només apareixen una vegada en la taula resultat. Tècnicament en la resta d'unions relacionals els camps comuns a les diverses taules no s'ometen de la taula resultat encara que tinguin el mateix nom, i apareixen precedits del nom de taula per desfer ambigüitat. A la pràctica el llenguatge SQL mitjançant la instrucció SELECT permet decidir explícitament quins camps d'una o altra taula apareixeran a la taula resultant, de manera que la diferència pot no ser evident a simple vista, si bé internament els programes de gestió de bases de dades mantenen el nom compost (taula.camp) que permet reconèixer la procedència de cada camp.
La unió relacional natural s'expressa de forma implícita, sense esmentar els camps comuns per mitjà dels quals es farà efectiva la combinació de taules, i per tant utilitza tots els camps que tinguin el mateix nom a les dues taules:
SELECT * FROM taulaA NATURAL JOIN taulaB;
o també
SELECT * FROM taulaA INNER JOIN taulaB USING (DepartmentID);
La unió relacional natural es desaconsella pels riscos que comporta l'ambigüitat en la procedència dels camps d'unió en el resultat.
Unió relacional creuada
La unió relacional creuada (cross join) genera una taula resultat que és el producte cartesià dels registres de les dues taules. La taula resultat conté per tant un registre per a cada una de les combinacions possibles de cada registre d'una de les taules amb cada un dels registres de l'altra taula. La sintaxi corresponent en el llenguatge SQL és la següent:
implícita:
SELECT * FROM employee, department;
explícita:
SELECT * FROM employee CROSS JOIN department;
La unió relacional creuada té s'utilitza rarament en les aplicacions corrents, ja que el producte cartesià, en tant que conjunt de totes les combinacions possibles, no respon a cap correspondència o relació efectiva entre les taules.
Unió relacional externa
La unió relacional externa (outer join) no requereix que un registre d'una taula tingui correspondència en els registres de l'altra taula per estar present a la taula resultat. Hi ha tres tipus d'unió relacional esxterna: la unió relacional externa esquerra, unió relacional externa dreta i unió relacional externa completa.
Unió relacional externa esquerra
En la unió relacional externa esquerra o unió relacional esquerra (left outer join o left join), la taula resultat de la unió relacional conté tots els registres de la taula de destinació o taula "de l'esquerra". Els registres de la taula de destinació que no troben concordança en els registres de la taula a combinar, contindran en el resultat valors nuls en els camps procedents de la taula a combinar. En canvi, els registres de la taula a combinar que no tenen cap registre concordant a la taula de destinació s’ometen. La sintaxi corresponent en el llenguatge SQL és explícita:
SELECT * FROM taulaA LEFT OUTER JOIN taulaB ON taulaA.camp1 = taulaB.camp2;
Exemple d'unió relacional externa esquerra: la taula resultat conté tots els registres de la taula de destinació; els registres de la taula de destinació que no troben correspondència a la taula a combinar ("Ferrrol" a la taula A) prenen valor nul en els camps procedents de la taula a combinar.
La unió relacional externa esquerra o unió relacional esquerra és el tipus d'unió relacional més habitual en els sistemes d’informació geogràfica.
Unió relacional externa dreta
En la unió relacional externa dreta o unió relacional dreta (right outer join o right join), la taula resultat de la unió relacional conté tots els registres de la taula a combinar o taula "de la dreta" almenys una vegada: tantes vegades com registres concordants hi hagi a la taula de destinació i una vegada per a cada registre que no trobi cap registre concordant a la taula de destinació. Els registres de la taula a combinar que no troben concordança en els registres de la taula de destinació, contindran en el resultat valors nuls en els camps procedents de la taula de destinació. En canvi, els registres de la taula de destinació que no tenen cap registre concordant a la taula a combinar s’ometen. La sintaxi corresponent en el llenguatge SQL és explícita:
SELECT * FROM taulaA RIGHT OUTER JOIN taulaB ON taulaA.camp1 = taulaB.camp2;
Exemple d'unió relacional externa dreta: la taula resultat conté tots els registres de la taula a combinar almenys una vegada; els registres de la taula a combinar que no troben correspondència a la taula de destinació ("Tarragona" a la taula B) prenen valor nul en els camps procedents de la taula de destinació.
La unió relacional externa dreta o unió relacional dreta és simètrica a la unió relacional esquerra. Equival a una unió relacional esquerra invertint l’ordre de les taules (B join A, en lloc de A join B).
Unió relacional externa completa
En la unió relacional externa completa (full outer join), la taula resultat de la unió relacional conté tots els registres de les dues taules. Els registres de cada taula sense concordança a l'altra taula apareixen (una vegada) amb valors nuls en els camps procedents de l'altra taula. La sintaxi corresponent en el llenguatge SQL és explícita:
SELECT * FROM taulaA FULL OUTER JOIN taulaB ON taulaA.camp1 = taulaB.camp2;
Exemple d'unió relacional externa completa: la taula resultat conté tots els registres de les dues taules; els registres de cada taula que no troben correspondència a l'altra taula apareixen una vegada a la taula resultat amb valors nuls.
La unió relacional externa completa combina els resultats d'una unió relacional esquerra i una unió relacional dreta.
La unió relacional en els sistemes d'informació geogràfica
La finalitat principal de launió relacionalen els sistemes d’informació geogràfica és agefir atributs addicionals a la taula d’atributs dels elements per a incorporar:
- atributs individuals emmagatzemats en taules externes (generalment, relacions1:1)
- descripcions o atributs de a partir de taules diccionari (generalment, relacions M:1)
- atributs d’altres entitats relacionades amb les entitats representades pels elements (relacions 1:1 o M:1)
a fi d'elaborar mapes o realitzar consultes a partir dels elements.
Per tant el tipus d'unió relacional més apropiada en els sistemes d’informació geogràfica és la unió relacional esquerra, atès que els registres de tots els elements s'han de conservar sempre en la taula resultat de la unió relacional. Aquest és el tipus d'unió relacional que implementen molts programes de SIG i per tant només pot resoldre casos de relacions entre taules 1:1 o M:1.
Exemples d'unions relacionals de la taula d'atributs dels elements d'una capa amb taules externes (relacions 1:1 o M:1)
Les relacions 1:M no es poden resoldre amb la unió relacional en els sistemes d’informació geogràfica, ja que qualsevol unió relacional repeteix els registres de la taula del costat 1 tantes vegades com registres concordants hi ha a la taula del costat M i, encara que alguns programes de SIG ho fan (implementen una unió relacional dreta), no té sentit repetir M vegades els registres de la taula d’atributs dels elements, dins d'aquesta mateixa taula.
L'alternativa a la unió relacional que ofereixen alguns programes de SIG per a resoldre les relacions 1:M és un procediment de relació entre taules anomenat enllaç o vincle (link o relate). Un vincle, a diferència d’una unió relacional no combina les taules i per tant desapareix el problema de repetir registres. El vincle manté les taules enllaçades de manera que es puguin propagar les seleccions d’una taula a l’altra i viceversa, segons el tipus de vincle. El vincle no és exclusiu de les relacions 1:M i es pot aplicar també a relacions 1:1 i M:1 en casos en què no es desitgi combinar les taules.
Un vincle reflecteix adequadament una relació 1:M entre l'entitat representada pels elements d'una capa i una altra classe d'entitats (per exemple, els establiments comercials localitzats en una parcel·la, o els residents en un portal). El vincle només és útil per a realitzar consultes, però tampoc és lògic pretendre fer un mapa amb dades 1:M. D'altra banda, igual que la unió relacional, el vincle permet enllaçar múltiples taules, a una mateixa taula o de forma transitiva formant una cadena. El vincle és un recurs implementat en pocs programes de SIG.
Temes relacionats
Referències
Codd, E.F. (1970) "A Relational Model of Data for Large Shared Data Banks", Communications of the ACM, 13, 6, 377–387.
Codd, E.F. (1990) The Relational Model for Database Management. Boston, Massachussets: Addison-Wesley Publishing Company.
Lectures recomanades
Date, C. J. (2003) Introduction to Database Systems, 8th edition. Boston, Massachussets: Addison-Wesley Publishing Company.