Università degli Studi di Cagliari Corso di Laurea Magistrale in Ingegneria per l Ambiente ed il Territorio LABORATORIO di INFORMATICA A.A. 2010/2011 Prof. Giorgio Giacinto IL MODELLO RELAZIONALE http://www.diee.unica.it/giacinto/lab Perché studiare il Modello Relazionale?! È il modello più largamente usato! Produttori: IBM, Informix, Microsoft, Oracle, Sybase, MySQL, PostgreSQL, etc.! Sistemi proprietari nei modelli più vecchi! ad esempio IMS dell IBM! Modelli recenti: modello orientato agli oggetti! ObjectStore, Versant, Ontos! Una sintesi emergente: il modello relazionale ad oggetti! Informix Universal Server, UniSQL, O2, Oracle, PostgreSQL
Basi di dati relazionali: definizioni! Base di dati relazionale: un insieme di relazioni! Relazione: consiste di due parti:! schema: specifica il nome della relazione, più il nome e il tipo di ciascuna colonna (chiamata campo o attributo)! ad esempio: Studenti(sid:string, nome:string, login:string, età:integer, media:real)! istanza: una tabella, con righe e colonne. #righe = cardinalità, #campi = grado/arità! Possiamo pensare a una relazione come a un insieme di righe di t-uple (cioè tutte le righe sono distinte e l ordinamento è casuale) Esempio di istanza della relazione Studenti sid nome login età media 53666 Jones jones@cs 18 25.6 53688 Smith smith@eecs 18 24.1 53650 Smith smith@math 19 27.4! Cardinalità = 3, grado = 5, tutte le righe sono distinte! L ordinamento delle righe è irrilevante! Devono essere anche distinte tutte le colonne nell istanza di una relazione?
Campi di una relazione! Nel modello relazionale i campi di una relazione sono identificati dal nome! L ordine delle colonne è irrilevante! In SQL in alcuni casi ci si riferisce alle colonne in base alla loro posizione! Ad esempio, per inserire una nuova tupla nella relazione! Vincoli di dominio! I valori di ciascun campo di una tupla devono appartenere ai domini associati in fase di definizione dello schema Base di dati relazionale! Base di dati relazionale! Collezione di relazioni con nomi di relazione distinti! Schema di base di dati relazionale! Collezione degli schemi per le relazioni nella base di dati! Istanza di una base di dati relazionale! Collezione di istanze di relazione, una per ogni schema di relazione nella BD
CREARE E MODIFICARE RELAZIONI CON SQL Introduzione In SQL la relazione è indicata con il nome di TABLE (tabella) Il sottoinsieme di SQL che consente di creare, cancellare e modificare le tabelle è chiamato DDL (Data Definition Language) SQL contiene domini predefiniti, e consente di definirne di nuovi
Introduzione! Vedremo nel seguito i comandi SQL per! definire, modificare, cancellare una tabella! Inserire, modificare, cancellare dati in una tabella! Di solito queste operazioni vengono effettuate mediante moduli in interfacce grafiche! il sistema invierà al DBMS i comandi SQL corrispondenti CREATE TABLE CREATE TABLE Studenti ( sid CHAR(20), nome CHAR(30), login CHAR(20), età INTEGER, media REAL)
Inserimento di valori in una tabella INSERT INTO Studenti(sid,nome,login,età,media) VALUES (52688, Smith, smith@ce, 18, 28.1)! I nomi delle colonne possono essere omessi se si devono inserire valori per tutti i campi! in questo caso la lista dei valori deve rispettare l ordinamento dei campi come definito nello schema Cancellazione di tuple DELETE FROM Studenti S WHERE S.nome = Smith La clausola WHERE specifica le tuple che vogliamo cancellare
Modifica dei valori di una tabella UPDATE Studenti S SET S.età = S.età + 1, S.media = 0.95*S.media WHERE S.sid = 53688 UPDATE Studenti S SET S.media = 0.95*S.media WHERE S.media <= 24.5 VINCOLI D INTEGRITÁ SULLE RELAZIONI
Vincoli di integrità (VI)! VI: condizione che deve essere vera per qualunque istanza della base di dati; ad esempio vincoli di dominio! I VI sono specificati quando si definisce lo schema! I VI sono controllati quando si modificano le relazioni! Una istanza legale di una relazione è una istanza che soddisfa tutti i VI specificati! I DBMS non dovrebbero permettere istanze illegali! Se il DBMS controlla i VI, i dati memorizzati sono più fedeli al significato nel mondo reale! Si evitano anche gli errori di inserimento! Vincoli di chiave primaria! Un insieme di campi è una chiave per una relazione se! due tuple distinte non possono avere gli stessi valori in tutti i campi chiave, e! ciò non è vero per qualunque sottoinsieme della chiave! La condizione 2 è falsa? Si ha una superchiave! Se c è più di una chiave, il DBA sceglie una delle chiavi come chiave primaria! Esempio sid è una chiave per Studenti (e nome?). L insieme {sid, media} è una superchiave
Chiavi primarie e candidate! Sono possibili molte chiavi candidate, una delle quali viene scelta come chiave primaria Per un dato studente e un dato corso, c è una singola classe oppure Gli studenti possono seguire solo un corso, e ricevere un singolo voto per quel corso; inoltre, nessuna coppia di studenti in un corso riceve lo stesso voto! Usato a sproposito, un VI può impedire la memorizzazione di istanze della base di dati che si presentano nella pratica! Specifica dei vincoli di chiave in SQL CREATE TABLE Studenti( sid CHAR(20), nome CHAR(30), login CHAR(20), età INTEGER, media REAL, UNIQUE(nome,età), CONSTRAINT ChiaveStudenti PRIMARY KEY (sid))
Chiavi esterne, integrità referenziale! Chiave esterna: insieme di campi in una relazione che viene usato per riferirsi a una tupla in un altra relazione (deve corrispondere alla chiave primaria della seconda relazione).! Simile a un puntatore logico! Se tutti i vincoli di chiave esterna sono garantiti, si raggiunge l integrità referenziale (nessuna referenza irrisolta)! HTML è un modello di dati senza integrità referenziale! Integrità referenziale Ad esempio, studid è una chiave esterna che fa riferimento a Studenti Iscritto(studid: string, cid: string voto: string)
Garantire l integrità referenziale! Che cosa si dovrebbe fare se viene inserita in Iscritti una tupla con un ID studente che non esiste? (Rifiutarla!)! Cosa fare se viene cancellata una tupla di Studenti?! Cancellare anche le tuple di Iscritti che vi fanno riferimento! Non permettere la cancellazione di tuple di Studenti cui si fa riferimento da Iscritti! Impostare a un sid predefinito il sid delle tuple di Iscritti che puntano a Studenti! In SQL, anche: impostare al valore speciale NULL (denota sconosciuto o inapplicabile ) il sid delle tuple di Iscritti che si riferiscono a Studenti (ma il sid in Studenti non può mai essere NULL) Specifica dei vincoli di chiave esterna in SQL CREATE TABLE Iscrizioni ( studid cid voto CHAR(20), CHAR(20), CHAR(10), PRIMARY KEY(studid,cid), FOREIGN KEY(studid) REFERENCES Studenti)
Da dove vengono i VI?! I VI sono basati sulla semantica dell organizzazione del mondo reale che viene descritta nelle relazioni della base di dati! Possiamo controllare l istanza di una base di dati per vedere se un VI viene violato, ma non possiamo MAI inferire che un VI è vero solo esaminando un istanza! Un VI è una asserzione su tutte le possibili istanze!! Analizzando l esempio si può scoprire che nome non è una chiave, ma è necessario ci sia un asserzione per stabilire che sid è una chiave! VI su chiavi e su chiavi esterne sono i più comuni; sono supportati anche VI più generali APPLICAZIONE DEI VINCOLI D INTEGRITÁ
Vincolo di chiave INSERT INTO Studenti(sid,nome,login,età,media) VALUES (53688, Mike, mike@ee, 17, 22.1) Questo inserimento viola il vincolo di chiave primaria, e pertanto il DBMS rifiuterà la richiesta INSERT INTO Studenti(sid,nome,login,età,media) VALUES (NULL, Mike, mike@ee, 17, 22.1) Questo inserimento viola il vincolo per cui la chiave primaria non può contenere NULL Considerazioni analoghe nel caso di operazioni di aggiornamento Vincoli di dominio! Le operazioni di inserimento e di aggiornamento sono accettate solo se i valori dei campi appartengono al dominio di definizione! Le operazioni di cancellazione non causano violazione dei vincoli di chiave primaria, unicità e di dominio
Vincoli di chiave esterna! Consideriamo le tabelle Studenti e Iscrizioni! La cancellazione di tuple in Iscrizioni non viola l integrità referenziale! Gli inserimenti di tuple in Iscrizioni possono violare l integrità referenziale d altra parte! La cancellazione di tuple in Studenti potrebbe violare l integrità referenziale! Gli inserimenti di tuple in Studenti non violano l integrità referenziale Vincoli di chiave esterna e SQL! Come gestire l inserimento in Iscrizioni di una riga con un valore di studid che non compare in Studenti?! Il comando INSERT viene ignorato
Vincoli di chiave esterna e SQL! Come gestire la cancellazione di una riga di Studenti? 1. Cancellare tutte le righe di Iscrizioni che la referenziano 2. Non consentire la cancellazione se vi sono righe di Iscrizioni che la referenziano 3. Impostare il valore di studid delle righe di Iscrizioni che la referenziano con un qualche valore predefinito 4. Impostare il valore di studid delle righe di Iscrizioni che la referenziano a NULL! Questa opzione è però in contrasto con il vincolo di chiave primaria per Iscrizioni Vincoli di chiave esterna e SQL! Come gestire la modifica dei valori di chiave primaria nella tabella Studenti?! Opzioni analoghe al caso di cancellazione
Vincoli di chiave esterna e SQL! SQL consente di scegliere separatamente una delle quattro opzioni per operazioni di cancellazione (DELETE) e aggiornamento (UPDATE) 1. CASCADE 2. NO ACTION (operazione predefinita) 3. SET DEFAULT Il valore di default è specificato in fase di definizione del dominio del campo 4. SET NULL Esempio CREATE TABLE Iscrizioni ( studid CHAR(20), cid CHAR(20), voto CHAR(10), PRIMARY KEY(studid,cid), FOREIGN KEY(studid) REFERENCES Studenti ON DELETE CASCADE ON UPDATE NO ACTION)
ELIMINAZIONE E MODIFICA DI TABELLE Eliminazione di tabelle DROP TABLE Studenti Elimina la tabella Studenti DROP TABLE Studenti RESTRICT Elimina la tabella solo se nessuna vista è definita a partire da Studenti
Modifica di tabelle ALTER TABLE Studenti ADD COLUMN NomeTutore CHAR(10) Aggiunge una colonna alla tabella Studenti. Il comando ALTER consente anche di cancellare e modificare colonne aggiungere e cancellare vincoli di integrità INTERROGARE BASI DI DATI RELAZIONALI
Interrogazione (query)! Può essere definita come una domanda sui dati e la risposta consiste in una nuova relazione! Un linguaggio di interrogazione è un linguaggio specializzato per scrivere interrogazioni Linguaggi di Interrogazione Relazionali! Uno dei punti di forza del modello relazionale: supporta un semplice ma potente linguaggio di interrogazione dei dati.! Le interrogazioni possono essere scritte in maniera intuitiva, e il DBMS è responsabile di una valutazione efficiente! Fattore chiave: semantica precisa per le interrogazioni relazionali.! Permette all ottimizzatore di riordinare estensivamente le operazioni, garantendo che la risposta non cambi
Esempio SQL SELECT * FROM Studenti S WHERE S.età < 18 È la formulazione in SQL della domanda: Quali sono i dati degli studenti che hanno meno di 18 anni? Esempio SQL SELECT S.nome, I.cid FROM Studenti S, Iscrizioni I WHERE S.sid = I.studid AND I.voto=30 È la formulazione in SQL della richiesta: Mostrare il nome degli studenti e il corso nel quale hanno ottenuto un voto pari a 30
Modello relazionale: sommario! Una rappresentazione tabellare dei dati! Semplice e intuitivo, attualmente il più usato! Il DBA può specificare vincoli di integrità basati sulla semantica dell applicazione. Il DBMS controlla eventuali violazioni! Due VI importanti: chiavi primarie e chiavi esterne! Inoltre abbiamo sempre vincoli di dominio! Esistono linguaggi di interrogazione potenti e naturali