Table of Contents
Alcune definizioni
Schema di relazione
Coppia formata da un nome di relazione R e da un tipo relazione definito come segue:
- int, real, boolean, string... sono tipi primitivi
- se T1...Tn sono tipi primitivi e A1...An sono etichette distinte, dette attributi, allora (A1:T1...AnTn) è un tipo ennupla di grado n. Due tipi ennupla sono uguali se hanno uguale il grado, gli attributi e il tipo degli attributi con lo stesso nome. (l'ordine non è significativo)
- se T è un tipo ennupla, allora {T} è un tipo insieme di ennuple o tipo relazione. Due tipi relazione sono uguali se hanno lo stesso tipo ennupla.
Schema relazionale
Uno schema relazionale è costituito da un insieme di schemi di relazione e da un insieme di vincoli di integrità relativi a tali schemi.
Ennupla
Un'ennupla è un insieme di coppie (Ai,Vi) di attributi e valori con Vi di tipo Ti.
Un'istanza dello schema è un insieme finito di ennuple.
La cardinalità di uno schema è il numero delle sue ennuple.
Un'istanza di uno schema relazionale è formata da un'istanza di ciascuno dei suoi schemi di relazione.
Infine, si denota dom(Ai) l'insieme dei valori che può assumere un attributo Ai e adom(Ai) l'insieme dei valori presenti per Ai nello schema.
Vincoli di integrità
I tre vincoli di integrità principali sono:
- NULL
- PK
- FK
Il valore NULL, applicabile a qualunque attributo indipendentemente dal tipo, indica che non è possibile consocere il valore dell'attributo nell'ennupla.
Il valore NULL non ha significato di valore presente e nullo, ma proprio di valore assente (NULL è diverso da una stringa vuota o dal numero zero!)
La superchiave è un insieme di attributi il cui valore individua univocamente un'ennupla.
Una chiave è una superchiave minimale, nel senso che eliminando uno degli attributi la chiave non è più superchiave e non identifica più un'ennupla univocamente.
La chiave primaria è una delle superchiavi (di solito quella con il numero minore di attributi), i cui attributi non possono essere NULL.
La chiave esterna è un insieme di attributi che si riferisce a una chiave primaria di uno schema di relazione. L'uso di chiavi esterne riferite a chiavi primarie sta alla base della definizione delle relazioni uno a molti.
La rappresentazione grafica di una relazione tra una FK (foreign key, chiave esterna) e una PK (primary key, chiave primaria) è denotata da una freccia che punta alla chiave primaria ed è etichettata con il noem della chiave esterna.
Trasformazione di un modello a oggetti in un modello relazionale
La trasformazione avviene tramite sei passi, tre sulle relazioni, tre sugli attributi, eseguibili meccanicamente:
- R Rappresentare le relazioni 1-n e 1-1
- R Rappresentare le relazioni n-m e non binarie
- R Rappresentare le gerarchie di inclusione
- A Identificare le PK
- A Rappresentare gli attributi multivalore
- A Appiattire gli attributi composti
In questo contesto NON è considerato alcun aspetto relativo all'ottimizzazione delle prestazioni.
Rappresentazione delle relazioni 1-n e 1-1
Per esprimere una relazione 1-1 o 1-n aggiungere una chiave esterna a una delle relazioni.
Graficamente, la relazione ←→ e la relazione ↞→ sono espresse come -→ (la doppia freccia è rivolta verso il "molti" della relazione).
Quando la relazione include degli attributi propri, questi sono spostati dentro la tabella "molti", cioè quella dotata di FK.
Se è aggiunto alla FK un vincolo «not null» si impone un vincolo di totalità dell'inversa: non è possibile inserire ennuple che per quell'attributo abbiano un valore NULL o non compreso tra adom della PK della relazione a cui si riferisce.
Se è aggiunto anche un vincolo di «PK» alla FK, la relazione si intende 1-1 (univocità dell'inversa e totalità della diretta).
Rappresentazione delle relazioni n-m
Per rappresentare una relazione n-m, ↞↠, è necessario introdurre una nuova relazione contenente una coppia di FK, la cui PK è costituita dall'insieme di tutti gli attributi che costituiscono le FK.
Gerarchie tra classi
Per rappresentare una gerarchia tra classi è possibile optare per uno tra:
- Relazione unica: tutti gli attributi, anche quelli specializzati, sono racchiusi in un'unica relazione e possono assumere valori NULL
- Partizionamento verticale: sono definite tre relazioni; la prima contiene tutti gli elementi con tutti gli attributi in comune, la seconda e la terza contengono solo gli attributi specializzati e un riferimento tramite FK all'elemento della prima corrispondente.
- Partizionamento orizzontale: sono definite solo due relazioni specializzate, con l'eventuale duplicazione degli attributi comuni.
Esempio:
A = Relazione Veicoli, con attributo Targa: String «NOT NULL»
B = Relazione Auto, con attributo Colore: String
C = Relazione Camion, con attributo Peso: int
Con Relazione Unica si crea una relazione Veicoli con attributi Targa, Colore, Peso.
So già che è valorizzato O l'attributo colore O l'attributo Peso, mai entrambi.
Con Partizionamento Verticale si creano tre relazioni e si aggiunge un attributo Targa «FK(Veicoli)»«NOT NULL»
Con Partizionamento Orizzontale si creano due relazioni e in ciascuna è presente l'attributo Targa.
Chiavi primarie
A meno che non sia definito in maniera esplicita (es. "...attributo nome univoco...") o semi-implicita (es. codice fiscale, targa o altri attributi che nel mondo reale nascono per fare da PK) la chiave primaria è definita come un ulteriore attributo, solitamente con nome ID, di tipo numerico, ovviamente con il vincolo di «PK» e - anche se non va indicato nello schema - assegnato dal sistema (vari sistemi lo chiamano auto_increment, sequence, identity, contatore...).
Nelle gerarchie con partizionamento la PK deve essere identica tra le varie relazioni.
Nelle relazioni che corrispondono ad associazioni molti a molti la PK è l'insieme delle FK.
Proprietà multivalore
La proprietà multivalore è trasformata in una relazione dotata di chiave esterna e valore.
Attributi composti
Un attributo composto si traduce in un elenco di attributi.