# Model relacional

Les dades d'una base de dades relacional estan organitzades en taules de dues dimensions; matrius formades per columnes i files, les quals s'anomenen registres o tuples (files) i camps o atributs (columnes).

## Introducció

La clau principal d'una taula, forçada per una restricció de clau principal és una columna o combinació de columnes que assegura que cada fila d'una taula està identificada.
Dues taules que tenen una columna comuna es diu que tenen una relació entre elles, la columna en comú és la clau externa (forana) d'una taula i la clau principal de l'altra.
El valor (si n'hi ha) emmagatzemat en una combinació de fila / columna és un element de dades.
L'esquema de relació es compon per un nom de la relació, i una llista d'atributs i serveix per descriure una relació.
En aquest petit exemple, els camps serien Codi, Nom i Cognom (sent Codi la clau primària), l'esquema de relació seria Alumne(Codi, Nom, Cognom), i la primera tupla seria (1234, Pere, Pi).
Alumne :
| Codi | Nom | Cognom |
| 1234 | Pere | Pi |
| 5567 | Joan | Canal |
| 7659 | Josep | Vila |

## Restriccions

* El valor de cada atribut ha d'estar dins del domini (conjunt de valors indivisibles que representa els possibles valors que pot agafar).
* Totes les tuples d'una taula han de ser diferents (com a mínim el valor del camp clau).
* Cap valor de la clau primària pot ser nul.
* Hi ha d'haver integritat: si una tupla d'una taula fa referència a una tupla d'una altra taula, aquesta haurà d'existir.
Com a exemple, podem veure que en la taula Matrícula fa referència a la taula Alumne (CodiAl fa referència a Codi de Alumne) i a Assignatura (CodiAs fa referència a Codi de Assignatura). No tindria sentit que en alguna tupla de Matrícula hi hagués un codiAl i/o codiAs que no existis en les taules de Alumne o Assignatura.
Assignatura :
| Codi | Curs | Nom |
| 1 | 1 | Matemàtiques |
| 2 | 3 | Història |
| 3 | 3 | Física |
Matrícula :
| CodiAl | CodiAs | Nota |
| 1234 | 1 | 5 |
| 1234 | 2 | 6 |
| 1234 | 3 | 8 |
| 5567 | 1 | 3 |
| 7659 | 2 | 8 |
| 7659 | 3 | 9 |

## Tipus de relacions

Les relacions poden ser de tres tipus: un a molts (1:N), un a un (1:1) i molts a molts (N:M)

### Un a molts (1:N)

Un cap maneja molts treballadors, però cada treballador només té un cap. En una relació un a molts és on una ocurrència d'una entitat es refereix a moltes ocurrències de l'altra entitat.
Aquesta també és la relació que més es fa servir.

### Molts a molts (N:M)

Un estudiant pot ser matriculat a moltes assignatures i una assignatura pot tenir molts estudiants matriculats.
En aquest tipus de relació sempre intervenen tres entitats, dos principals i una tercera que connecta les dues primàries.
Segons el tipus de notació que fem servir per exemple chen, pot ser que la taula al mig no aparegui, però a l'hora de implementa aquest tipus de relació físicament (Executar les comandes) obligatòriament hem de crear aquesta tercera taula.

### Un a un (1:1)

Una relació un a un representa només una sola ocurrència entre les dues entitats.
Un usuari té un únic compte, i un compte pot ser només d'un sol usuari
Algunes bases de dades limiten el nombre de columnes que es poden crear a dintre de la taula. Per evitar aquesta limitació es pot utilitzar la relació un a un per dividir la taula en dues taules.
Si es segueixen aquestes normes quan es crea una base de dades a més d'aconseguir una disseny funcional i elegant, la base da dades resultant compleix les normes normals, molt sovint fins a la tercera norma normal.

## Tipus de notacions

Hi ha moltes maneres de representar una bases de dades de forma gràfica, algunes de les notacions més utilitzades actualment són:
Notació chen Notació crow La majoria dels programes de disseny de bases de dades actuals com a mínim suporten la notació crow, però molt sovint també tenen la possibilitat d'utilitzar altres notacions com per exemple chen.
Algunes aplicacions que utilitzen notació crow:
* SAP PowerDesigner Arxivat 2015-10-21 a Wayback Machine.
* mysql workbench

### Notació Crow

Aquesta notació ha sigut inventada per dr. Clive Finkelstein, la seva motivació era crear una manera molt lògica i conceptual per expressar les relacions segons el seu tipus. La notació crow representa les entitat com a caixes(rectangles) i les relacions com a línies entre les caixes. Les figures al final de les línies són les cardinalitats de la relació.
Normalment les relacions no es poden anomenar, però hi ha variants diferents que permeten posar indicador al mig de la línia de la relació.

### Notació Chen

Moltes vegades quan es comença a ensenyar per primera vegada bases de dades és far servir la notació chen degut a la seva simplicitat i fàcil comprensió. Molt semblant de les altres notacions les entitats són representades per rectangles i les relacions amb línies que el mig tenen un rombe, a cada costat del rombe es posa el tipus de relació que té cada entitat. Si volem posar nom a la relació podem fer-lo indicant el seu identificador a dintre del rombe Les cardinalitat no són obligatòries, tot i això es poden posar com una opció optativa entre parèntesis al costat del rombe.

## Operacions

Les operacions en el model relacional es divideixen en fer consultes (no modifiquen les dades) i en actualitzacions (es modifiquen les dades).

### Consultes

Vocabulari de SQL:
* SELECT, per escollir quines columnes mostrar (* per mostrar-les totes)
* FROM, per esmentar la taula (poden ser més d'una).
* WHERE, per especificar un predicat que s'haurà de complir en les files de la consulta.
* ORDER BY, per ordenar els resultats en funció de la columna esmentada.
* GROUP BY, per seleccionar conjunts. -HAVING, per indicar un predicat que hauran de complir cada grup de la consulta
Alguns exemples:
ens mostraria tots els codis de la taula Alumne:
* Codi
* 1234
* 5567
* 7659
ens mostrarà totes les notes de l'assignatura de codi 1 i ordenats de major a menor (per defecte).
* Nota
* 5
* 3

### Actualitzacions

En qualsevol actualització s'han de tenir en compte les restriccions del model relacional, i violar-les implicaria el rebuig del SGBD
* Inserir: afegeix tuples noves a una relacióINSERT INTO Alumne (Codi, Nom, Cognom) VALUES (2222, 'Enric', 'Pastor');
i la taula quedarà així:
| Codi | Nom | Cognom |
| 1234 | Pere | Pi |
| 2222 | Enric | Pastor |
| 5567 | Joan | Canal |
| 7659 | Josep | Vila |
* -Eliminar: elimina tuples d'una relacióDELETE * FROM Alumne;
esborraria totes les files de la taula Alumne
| Codi | Nom | Cognom |
* Modificar: canvia els valors dels atributsUPDATE Assignatura SET Curs = 2 WHERE Codi = '1';
| Codi | Curs | Nom |
| 1 | 2 | Matemàtiques |
| 2 | 3 | Història |
| 3 | 3 | Física |