Il modello relazione è un modello logico dei dati, direttamente supportato dai DBMS commerciali.
Si basa su un unico costrutto chiamato *relazione* (tabella).
Nella progettazione di una BD, lo *schema relazionale* si ottiene per trasformazione dello schema concettuale ER.
Una relazione ha uno **}{schema** e una **estensione**.
Lo *schema* si può spiegare matematicamente con *R(X)*, dove *R* è il nome della relazione e *X = \{A1, ..., An\*} è l'insieme dei valori che può assumere.
Ogni attributo $A_i$ ha associato un dominio $D_i$ che è l'insieme dei valori che può assumere.
L'estensione di *R(A1, ..., An)* è:
$
R \subseteq D1 * ... * Dn
$
Ogni elemento *(n-pla)* di *R* è detto **tupla**.
Per spiegare i prossimi argomenti utilizziamo l'esempio di *Professore* e *Dipartimento*.
**Schemi di relazione:**
- Professore(CodP, Nome, Età, Dip)
- Dipartimento(CodD, Nome, Univ, Dir)
**Estensioni di relazione**(o solo *relazioni*):
![[estensioniRelazioni.png]]
**Schemi BD relazionale:**
\{Prof(CodP, Nome, Età, Dip), Dip(CodD, Nome, Univ, Dir)\}
**Base di dati:**
![[estensioniRelazioni.png]]
## Chiavi primarie e secondarie
Gli attributi *CodP* e *CodD* sono **chiavi primarie** cioè non possono esistere due tuple con gli stessi valori di questi attributi.
Gli attributi *Dip* e *Dir* sono **chiavi secondarie**:
- *Dip* assume valori della chiave primaria *CodD* presenti nella relazione *Dipartimento*;
- *Dir* assume valori della chiave primaria *CodP* presenti nella relazione *Professore*.
Le chiavi secondarie consentono di rappresentare le relazioni *Afferenza* e *Direzione*.
![[primarieSecondarie.PNG]]
Quindi, una **chiave secondaria (o esterna)** è un attributo (o insieme di attributi) che assumono come valori i valori della chiave primaria presenti in qualche relazione e consente di rappresentare associazioni tra relazioni.
## Vincolo di integrità referenziale
Se una chiave secondaria *X* assume un valore *x*, allora *x* deve apparire come valore della chiave primaria cui *X* è riferita.
![[vincoliIntegritaReferenziale1.png]]
Supponiamo che modifichiamo una chiave esterna con una chiave primaria che non esiste:
![[vincoliIntegritaReferenziale2.png]]
## Valori nulli
Può succedere che il valore di un attributo sia **}{sconosciuto**, **inesistente** o **senza informazione**.
Per spiegare i vari tipi di valori nulli, utilizziamo un esempio:
![[valoriNulli1.PNG]]
- Mario non possiede il telefono (valore *inesistente*);
- di Gianni non conosciamo il numero telefonico (valore *sconosciuto*);
- di Chiara non sappiamo se abbia o meno il telefono (valore *senza informazione*).
Una chiave primaria non può assumere valori nulli! Un esempio di seguito:
![[valoriNulli2.PNG]]