7. Elementi di teoria dei database relazionali Lezioni di web attivo 7. Elementi di teoria dei database relazionali MySQL è un sistema di gestione di database (DBMS). Un database è una raccolta strutturata di dati. Si può trattare di qualunque insieme di dati da una semplice lista della spesa a una galleria di quadri o all’enorme quantità di informazioni di una rete aziendale. Per aggiungere, accedere, elaborare i dati memorizzati in un database è necessario un sistema di gestione di database come ad esempio MySQL Server. Poiché i computer sono in grado di manipolare grandi quantità di informazione, i sistemi di gestione di database svolgono un ruolo centrale nella elaborazione sia come applicazioni a se stanti che come parti di altre applicazioni. MySQL è un sistema di gestione per database relazionali. Un database relazionale memorizza i dati in tabelle separate piuttosto che mettere i dati tutti insieme in un unico archivio per motivi di velocità e flessibilità. La parte SQL della sigla sta per “Structured Query Language”. SQL è il più comune linguaggio standardizzato usato per accedere ai database. MySQL è un software Open Source. Open Source significa che è possibile per chiunque usare e modificare il software. Chiunque può scaricare il software MySQL da Internet e usarlo senza pagare. Si può studiare il codice sorgente e cambiarlo per adattarlo alle proprie esigenze. Se però si inserisce il software MySQL in una applicazione commerciale è necessario acquistare una licenza commerciale. 7.1 Elementi di teoria dei database relazionali Informazioni e dati non sono la stessa cosa. Le informazioni sono comprese dalle persone. I dati sono sequenze di bit memorizzate in un disco. Lo scopo dei sistemi di gestione di database è di colmare la differenza fra informazione e dato cioè convertire i dati memorizzati in un disco in informazioni utilizzabili dalle persone. Un database è un modello di un sistema del mondo reale. I contenuti di un database rappresentano lo stato di ciò che il modello rappresenta. Cambiamenti nei contenuti del database rappresentano eventi che avvengono nell’ambiente e che cambiano lo stato del sistema modellato. Il database deve quindi essere strutturato in modo da rispecchiare la realtà che vuole rappresentare. 7.2 Modello concettuale La modellazione concettuale permette di modellare il sistema in termini indipendenti dal particolare tecnologia scelta per memorizzare i dati. I metodi di modellazione concettuale consentono di far evolvere la struttura di un database nel tempo al variare delle necessità degli utenti. Un modello concettuale molto diffuso è il modello entità-associazioni. 7.3 Modello Entità-Associazioni Il modello entità-associazioni è uno strumento per l’analisi delle caratteristiche di una applicazione indipendentemente dagli eventi. Il modello entità-associazioni aiuta a ridurre la ridondanza dei dati e ad aumentare l’affidabilità e l’efficienza della applicazione. Questo approccio include una rappresentazione grafica che rappresenta le entità come rettangoli e le associazioni come rombi. Il modello entità associazioni fornisce un metodo per visualizzare le relazioni che intercorrono tra entità in una applicazione facilitando il passaggio dalla descrizione delle informazioni di una applicazione allo schema formale dei dati di un database. Il modello entità associazioni viene successivamente convertito in un altro modello, ad esempio il modello relazionale, in cui il database è effettivamente realizzato. ITIS “O.Belluzzi” – Laboratorio di Sistemi 1-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Definizione di alcuni termini fondamentali che sono usati nella descrizione del modello entità associazioni: Entità: un entità è una cosa astratta o concreta che esiste nell’ambiente che viene modellato ed è distinguibile dalle altre. Ad esempio: sole, luna, Mario, Giovanni, amore, odio. Istanza di Entità: Una istanza di entità è una particolare occorrenza di una entità. Ad esempio una ogni persona è una occorrenza di una entità, ogni automobile è una occorrenza di entità … Insieme di Entità: Un gruppo di entità simili costituisce un insieme di entità o tipo di entità o anche classe di entità. Un insieme di entità ha proprietà comuni che sono condivise da tutte le istanze che la compongono. Ad esempio: l’insieme di entità astri comprende sole e luna, la classe di entità persone comprende Mario e Giovanni, la classe di entità sentimenti comprende amore e odio. Attributo: Un attributo descrive una proprietà di un insieme di entità (e anche di una associazione) comune a tutte le istanze. Ad esempio: possibili attributi dell’insieme di entità persone sono nome, cognome, data_di_nascita … Attributo semplice: proprietà costituita da una singola unità di informazione indivisibile. Ad esempio: un possibile attributo semplice dell’insieme di entità automobili è marca. Attributo composto: gruppo di attributi che possono essere considerati sia insieme che separatamente. Ad esempio: nell’insieme di entità persone l’attributo indirizzo è composto dagli attributi via,numero,città,provincia,cap Attributo multiplo: gruppo di attributi che sono presenti in quantità variabile sotto forma di una sequenza di attributi simili. Ad esempio: una sequenza di misurazioni di temperatura, i libri scritti da un autore … Sebbene le realtà che devono essere modellate presentino spesso attributi in questa forma la necessità di eliminare ridondanza di dati nelle banche dati non consente rappresentazioni di questo tipo che devono essere risolte modificando lo schema (prima forma normale) Dominio di un attributo: insieme dei valori che un attributo può assumere. Associazione: Una associazione è una connessione tra insiemi di entità. Ad esempio: una associazione tra persone e automobili potrebbe essere possiede cioè l’indicazione di quale istanza di entità persone possiede una certa istanza di entità automobili. Associazione uno-a-uno (1:1): per ogni istanza di entità in un insieme di entità c’è al massimo una istanza di entità associata in un altro insieme di entità. Per esempio: per ogni marito c’è la massimo una solo moglie e viceversa. Associazione uno-a-molti (1:N): Una istanza di entità in un insieme di entità E2 è associato con zero o più istanze di entità dell’insieme di entità E1 ma ogni istanza di entità dell’insieme E1 è associato al massimo con una istanza del insieme E2. Per esempio: una donna può avere molti figli ma un figlio può avere solo una madre. Associazione molti-a-molti (N:M): Non ci sono restrizioni su quante istanze di entità sono associa con ciascuna istanza dell’altro insieme di entità. Un esempio di associazione molti-a-molti la associazione tra classi e professori. Ogni classe ha molti professori ma ogni professore ha molte classi. Associazione gerarchica (IS-A): E’ una speciale associazione che consente ad un insieme che dipende gerarchicamente da un altro di ereditarne le proprietà. Per esempio se si dice che un autocarro è un veicolo e un veicolo ha gli attributi marca e modello questo implica che anche l’entità autocarro ha gli attributo marca e modello più gli altri che lo caratterizzano. Chiave: La chiave distingue in modo univoco una istanza dalle altre in un insieme. Chiave primaria: identificatore usato per identificare univocamente una particolare istanza di un insieme. Può essere composta da uno o più attributi. Deve essere unica nel dominio. Deve essere sempre presente e non può cambiare nel tempo. Se non ITIS “O.Belluzzi” – Laboratorio di Sistemi 2-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo esiste un attributo o un insieme di attributi che soddisfano alle condizioni precedenti deve essere creata artificialmente. Chiave esterna: Una chiave esterna collega una istanza ad una istanza di un’altra entità attraverso la chiave primaria di quest’ultima. Le chiavi esterne devono rispettare le condizioni integrità referenziale cioè se esiste una chiave esterna in un insieme di entità deve esistere una corrispondente chiave primaria nell’insieme di entità associato. 7.4 Diagramma entità-associazioni Simboli usati nel modello grafico: Entità: Proprietari Associazione: Possiede Nel rettangolo è inserito un identificatore che descrive sinteticamente il significato dell’insieme di entità. (In genere un sostantivo) Nel rombo è inserito un identificatore che descrive sinteticamente il significato della associazione. (in genere un verbo) Archi: Gli archi collegano le entità con le associazioni e gli attributi con le entità e associazioni. Gli archi che collegano entità con associazioni sono orientati con una singola freccia in caso di associazione di tipo 1 e doppia freccia in caso di associazione di tipo molti. La associazione gerarchica è indicata con un arco orientato tra due entità di grande spessore. Sottolineatura: Gli attributi chiave sono sottolineati. Associazione 1:1 Presidi Dirige Scuole Un preside dirige una sola scuola e una scuola è diretta da un solo preside Associazione 1:N Classi Appartiene Studenti Uno studente appartiene ad una sola classe e una classe è formata da molti studenti Associazione N:M Classi Insegna Prof. Un professore insegna in più classi e in una classe insegnano più professori. Associazione IS-A Docente Personale Amministativo Non Docente Tecnico Ausiliario Il personale di una scuola costituisce un insieme di entità che può essere suddiviso in due sottoinsiemi del personale docente e non-docente. Il personale non-docente può a sua volta essere suddiviso in amministrativo, tecnico e ausiliario. L’insieme di entità Personale ha proprietà comuni a tutti i sottoinsiemi ITIS “O.Belluzzi” – Laboratorio di Sistemi 3-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali (nome, cognome, indirizzo …) che tutti i sottoinsiemi ereditano. Inoltre ogni sottoinsieme ha proprietà specifiche non possedute dagli altri. Attributi: Negli esempi precedenti non sono stati messi in evidenza per semplicità gli attributi posseduti dalle entità o dalle associazioni. Ecco alcuni esempi che consentono di completare lo schema: Presidi ID Dirige Scuole cognome nome CODMPI descrizione indirizzo Note: 1. Sono inserititi solo alcuni degli attributi che descrivono le entità. 2. La presenza di un attributo chiave per le entità è obbligatoria 3. Nel caso di Presidi la chiave è artificiale (ID) per evitare omonimie 4. Nel caso di Scuole la chiave è un codice parlante fornito direttamente dal Ministero. A tutti gli effetti è anch’essa una chiave artificiale che però contiene al suo interno alcuni elementi decrittivi dell’istanza. Ad esempio il codice del Belluzzi è: BOTF030006 dove BO indica la provincia in cui si trova, T indica che è un istituto tecnico, F indica che è industriale e 030006 è un numero progressivo. 5. Indirizzo è un attributo composito che andrà ulteriormente scomposto in una successiva analisi Classi Studenti Appartiene Num Sez Spec Aula Matricola Cognome Nome DataDiNascita Note: 1. Anche in questo caso sono stati inseriti solo alcuni attributi oltre alle chiavi. 2. Nel caso di Classi la chiave è naturale composta da più attributi. Ad esempio nel caso del Belluzzi esistono più istanze con il valore Num=5 (quinta), più istanze con il valore Sez=B (sezione B) e più istanze con il valore Spec=5 (informatica) ma solo una ha contemporaneamente i valori: 5,B e 5 3. Nel caso di Studenti la chiave è artificiale per il solito problema dell’omonimia . 4. La chiave primaria di Classi è chiave esterna per Studenti quindi deve rispettare il vincolo di integrità referenziale (cioè se esiste uno studente appartenente a una classe deve esistere la classe. 5. Una degli attributi di Studenti è ‘DataDiNascita’ e non ‘Età’ per garantire la indipendenza dal tempo. Classi Num Sez Spec Aula Insegna Prof. Materia ID Cognome Nome Note: 1. Anche in questo caso sono stati inseriti solo alcuni attributi oltre alle chiavi. 2. Nel caso di Prof. la chiave è artificiale per il solito problema dell’omonimia . 3. Le chiavi primarie di Classi e Prof. sono chiavi esterne per l’associazione Insegna e quindi devono rispettare il vincolo di integrità referenziale (cioè se esiste un insegnamento devono esistere la classe e il professore coinvolti) 4. Una associazione molti-a-molti (N:M) può avere attributi come in questo caso la materia insegnata. Negli altri casi un attributo non appartiene alla associazione ma alla entità a cui l’associazione è collegata. ITIS “O.Belluzzi” – Laboratorio di Sistemi 4-16 7. Elementi di teoria dei database relazionali ITIS “O.Belluzzi” – Laboratorio di Sistemi Lezioni di web attivo 5-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali 7.5 Conversione del modello Entità-Associazioni in un database relazionale. Un database relazionale è un insieme di relazioni. Può essere pensato come un insieme di tabelle associate tra loro. Ogni tabella ha uno specifico formato. Gli attributi possono essere pensati come le intestazioni di colonna della tabella, le istanze di entità come le righe della tabella. A partire dal modello entità- associazioni una tabella è richiesta per ogni: Insieme di entità Associazione molti-a-molti (N:M) Le associazioni uno-a-uno (1:1), uno-a-molti (1:N) e gerarchiche (IS-A) non richiedono una tabella specifica ma possono essere realizzate nella tabelle a cui si riferiscono. Creazione di una tabella da un insieme di entità o da una associazione N:M Nome: ogni tabella deve avere un nome descrittivo. Il nome usato per l’insieme di entità o per la associazione in genere è soddisfacente. Chiave: Ogni tabella deve avere un attributo o un insieme di attributi designati come chiave primaria. Affinché un attributo o insieme di attributi possa essere designato come chiave primaria e necessario che le occorrenze dei valori dell’attributo o la loro combinazione nel caso di un insieme deve essere univoca. Attributi: Sono consentiti solo gli attributi semplici (intestazioni di colonna). Gli attributi composti vanno spezzati in una sequenza di attributi semplici. Gli attributi multipli vanno estratti dalla tabella e portati in una associazione N:M esterna (prima forma normale) 7.6 Il modello relazionale Nel modello relazionale il database è rappresentato come un gruppo di tabelle correlate. Introdotto negli anni ’70 è attualmente il modello più popolare per la sua semplicità concettuale e di realizzazione. Il modello relazionale è basato sulla teoria matematica degli insiemi. 7.7 Definizioni Relazione: Tabella a due dimensioni La relazione corriponde alla nostra familiare nozione di tabella: una relazione è una collezione di righe di tabella (tuple) ognuna delle quali contiene i valori per un numero fissato di attributi. Da un punto di vista fisico una relazione assomiglia ad un file a tracciato record fisso (flat file).Ogni tupla in una relazione deve essere unica cioeè non ci possono essere righe duplicate. Attibuto: Colonna di tabella Altri termini comunemente usati per indicare un attributo sono ‘proprietà’ o ‘campo’. L’insieme dei valori ammessi per un attributo è chiamato dominio. Tupla: Riga di tabella Una tupla è una istanza di una entità o di una associazione rappresentata da una relazione. Chiave: Un singolo attributo o una combinazione di attributi i cui valori identificano univocamente le tuple della relazione. Questo vuole dire che ogni riga ha differenti valori per l’attributo(i) chiave. Il modello relazionale richiede che ogni relazione abbia una chiave e che: Due tuple non possono avere lo stesso valore di chiave ITIS “O.Belluzzi” – Laboratorio di Sistemi 6-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo Ogni tupla deve avere un valore di chiave non nullo. Note: 1. Se non è possibile individuare un gruppo di attributi che godano della proprietà di univocità si ricorre alla chiave artificiale che è un attributo numerico aggiunto alla relazione. Ad esempio: una relazione che contiene gli ordini ricevuti da una azienda commerciale potrebbe non avere alcuna colonna che consenta la distinzione tra due istanze (cioè sono identiche); in questo caso è opportuno aggiungere un campo numerico univoco detto ID (identificatore). Un altro esempio è costituito da una relazione contenente l’entità ‘persone’. Se la relazione è grande (cioè ci sono molte istanze) la probabilità di una omonimia è elevata. In questo caso il codice fisclae (nato proprio per questo scopo) risolve il problema. 2. Non esiste alcun ordinamento delle tuple all’interno della relazione cioè si trovano fisicamente nell’ordine in cui sono state inserite. Esistono però risorse che consentono di mantenenere logicamente ordinate le tuple secondo vari criteri attrevarso tabelle aggiuntive (indici) 7.8 Schema ed estensione di una relazione E’ necessario distinguere lo schema di una relazione dalla sua estensione Lo schema è la struttura che definisce la relazione ed è composto da: Nome della relazione (Nome della tabella) Nomi degli attributi e loro dominio (Nome delle intestazioni di colonna e tipo dei dati contenuti Chiave primaria composta da uno più attributi L’estensione di una relazione è il contenuto della relazione, cioè l’insieme di tuple (righe di tabella) che compongono la relazione. L’estensione di una relazione può cambiare molto nel tempo a causa dell’inserimento, rimozione o modifica di righe mentre lo schema di una relazione è normalmente stabile e viene generato in fase di progettazione (o modificato in fase di revisione del progetto). Facendo riferimento alla tabella ‘clienti’ sottostante le intestazioni di colonna possono essere pensate come parte dello schema mentre le righe sotto l’intestazione formano l’estensione. clienti id_cliente 19238 35895 12993 nome ABC spa XYZ srl QWERTY indirizzo max_credito Via Roma, 9 30000 Piazza Verdi, 1 15000 Casella postale 99 45000 Dal punto di vista concettuale, una relazione è una struttura per la memorizzazione di valori degli attributi di particolari insiemi di entità o associazioni. L’esempio è una relazione che descrive e contiene i membri di un insieme di entità chiamato ‘clienti’. In questo caso la relazione descrive una entità ma una relazione può essere anche usata per descrive una associazione. (Attenzione in inglese i due termini sono molto simili ‘Associazione’=’Relationship’, ‘Relazione’=’Relation’). Nella relazione ‘clienti’, la chiave per ogni istanza di cliente è memorizzata sotto l’attributo id_cliente. E’ possibile che però che la chiave sia composta da più attributi. Regole per una buona trasformazione dal modello entità-associazioni allo schema relazionale: Sono necessarie relazioni separate (tabelle) per ogni insieme di entità e per ogni associazione molti-a-molti. Non sono necessarie relazione separate (tabelle) per rappresentare le associazioni uno-a-molti ma la relazione lato N deve contenere come attributo la chiave primaria della relazione lato 1 Quando si construisce una relazione (tabella) per rappresentare una associazione molti-a-molti, la chiave primaria della relazione deve contenere tutte le chiavi delle relazioni che rappresentano le entità che l’associazione collega. ITIS “O.Belluzzi” – Laboratorio di Sistemi 7-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Nel caso di associazioni 1:1 e gerarchiche entrambe le soluzioni sono possibili. ITIS “O.Belluzzi” – Laboratorio di Sistemi 8-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo 7.9 Esempio di una modellazione relazionale L’esempio descrive in modo elementare il sistema di fatturazione di una aziende commerciale che vende ad altre aziende. Analisi: I clienti devono essere registrati per potere acquistare. I clienti possono acquistare i prodotti disponibili nel magazzino dell’azienda. Ogni cliente registrato può effettuare acquisti di un insieme qualsiasi di prodotti in una quantità qualsiasi. Tutti gli acquisti fatti con una unica operazione vengono raccolti in una fattura che può essere pagata in un secondo tempo. Quando i clienti saldano una o più fatture i pagamenti vengono registrati in modo da potere verificare il bilancio. Sintesi: I clienti costituiscono un insieme di entità dotato di chiave primaria artificiale, attributi anagrafici e massimo credito. I prodotti costituiscono un insieme di entità dotato di chiave primaria artificiale e di attributi come descrizione e prezzo Le fatture costituiscono un insieme di entità dotato di chiave primaria artificiale, attributi come data di emissione e termini di scadenza. I dati dei clienti non devono essere ripetuti in ogni fattura per evitare ridondanza dell’informazione (un cliente può richiedere tante fatture e in questo modo i suoi dati sarebbero ripetuti uguali più volte) quindi deve esistere una associazione 1:N tra clienti e fatture (un cliente può richiedere più fatture, una fattura può essere stata richiesta da un solo cliente) I prodotti acquistati con una stessa fattura costituiscono un attributo multiplo della fattura (il numero di prodotti diversi è indeterminato) è quindi necessario scomporre il contenuto della fattura in una associazione N:M tra fatture e prodotti. Uno stesso prodotto può essere inserito in più fatture e una fattura può contenere più prodotti. Ogni prodotto può comparire in una fattura in diverse quantità quindi la quantità è un attributo dell’associazione, inoltre anche il prezzo di acquisto deve essere un attributo dell’associazione perché l’attributo prezzo contenuto nell’entità prodotti cambia nel tempo mentre il prezzo di acquisto di una determinata fattura deve rimanere inalterato. I pagamenti costituiscono un insieme di entità dotato di chiave primaria artificiale, e attributi come la data di pagamento e l’importo pagato. I pagamenti, effettuati dai clienti, non devono contenere i dati dei clienti per evitare ridondanza quindi deve esistere una associazione 1:N tra clienti e pagamenti (un cliente può effettuare più pagamenti, un pagamento può essere effettuato da un solo cliente) Non esiste un collegamento diretto tra fatture e pagamenti, ma esiste un collegamento indiretto tramite l’entità clienti. Questo collegamento consente di calcolare il bilancio per ciascun cliente (differenza fra fatture emesse e pagamenti effettuati). Il modello entità-associazioni che nasce da questo studio è: richiede fatture prodotti dett_fat clienti scadenza max_cred data indirizzo id_fattura nome id_cliente effettua quantità prezzo prezzo descr Id_prod pagamenti importo data id_pagam ITIS “O.Belluzzi” – Laboratorio di Sistemi 9-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Dal modello entità-associazioni si deriva il modello relazionale: L’entità ‘clienti’ diventa la tabella ‘clienti’ con chiave primaria artificiale per evitare omonimie: Clienti id_cliente 19238 35895 12993 Nome ABC spa XYZ srl QWERTY Indirizzo Max_credito Via Roma, 9 30000 Piazza Verdi, 1 15000 Casella postale 99 45000 L’entità ‘prodotti’ diventa la tabella ‘prodotti’ con chiave primaria artificiale eventualmente a codice parlante: Prodotti id_prodotto MV001 MD039 MR900 Descrizione Vite Dado Rondella Prezzo 1.25 0.75 0.25 L’entità ‘fatture’ diventa la tabella ‘fatture’ con chiave primaria artificiale e con chiave esterna id_cliente che coicide con la chiave primaria della tabella clienti per realizzare l’associazione 1:N ‘richiede’: Fatture id_fattura 997/02 001/03 002/03 id_cliente 19238 35895 19238 Data_fattura 31/12/2002 31/09/2003 01/10/2003 Scadenza 30 60 30 L’associazione ‘dettaglio_fatture diventa la tabella ‘dettaglio_fatture’ con chiave primaria costituita dalla combinazione delle chiavi primare delle due tabelle che associa (notare che il prezzo nella prima riga è diverso dal prezzo attuale perché si riferisce ad una fattura molto vecchia): Dettaglio_fatture Id_fattura Id_prodotto 997/02 MV001 001/03 MV001 001/03 MD039 Quantità 10 10 100 Costo 1.00 1.25 0.75 L’entità ‘pagamenti’ diventa la tabella ‘pagamenti’ con chiave primaria artificiale e con chiave esterna id_cliente che coicide con la chiave primaria della tabella ‘clienti’ per realizzare l’associazione 1:N ‘effettua’: Pagamenti Id_pagamento 00350 00351 Id_cliente 19328 35895 Data 01/02/2003 31/12/2003 ITIS “O.Belluzzi” – Laboratorio di Sistemi Importo 10.00 5.00 10-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo 7.10 Normalizzazione Dipendenza funzionale: l’attributo Y è funzionalmente dipendente dall’attributo X se e solo se ogni ogni valore di X ha associato ad esso un perciso valore di Y. Si dice che X determina Y (XY) o in altre parole che Y dipende univocamente da X. Le associazioni uno-a-uno hanno due dipendenze funzionali (esiste dipendenza in entrambe le direzioni). Le associazioni uno-a-molti hanno una dipendenza funzionale (solo dal lato uno verso il lato molti e non viceversa) Le associazioni molti-a-molti non hanno dipendenze funzionali. Decomposizione: il termine decomposizione significa che le informazioni contenute in una relazione vengono separate in in due o più relazioni ciascuna con meno attributi della relazione originale. In altre parole gli attributi sono assegnati a tabelle separate. Le tuple nelle nuove relazioni sono determinate dagli attributi che sono inclusi nella relazione. Gli obiettivi delal decomposizione sono: Ridurre la ridondanza dei dati. Mantenere la capacità di ricostruire la relazione originaria. Join: Il processo che consente di ricreare la relazione originaria si chiama giunzione (‘join’) Se si hanno due relazioni T1 e T2 con un attributo comune A, il risultato del join tra T1 e T2 è una nuova relazione. Ogni riga della nuova relazione è formata concatenando una riga da T1 con una riga da T2 solo per le tuple che hanno lo stesso valore di A in entrambe le tabelle. (Si potrebbe immaginare di combinare le tuple di T1 e T2 in tutti i modi possibili e poi scartare tutte le combinazioni in cui i valori di A sono diversi tra T1 e T2). Esempio di join:Nell’esempio dell’azienda commerciale non esiste materialmente una tabella che che contenga una intera fattura. Questa tabella però può essere generata da un join tra le tabelle ‘prodotti’ e ‘dettaglio_fatture’ Dettaglio_fatture Id_fat Id_prod Qt Cost 997/02 MV001 10 1.00 001/03 MV001 10 1.25 001/03 MD039 100 0.75 La tabella dettaglio_fatture contiene tutte le voci di tutte le fatture specificando il codice del prodotto, la quantità effettivamente acquistata e il costo effettivo al momento dell’acquisto. Join Prodotti id_prod Descr Prz MV001 Vite 1.25 MD039 Dado 0.75 MR900 Rondella 0.25 La tabella prodotti per ogni prodotto contiene la descrizione e il prezzo corrente. Produce Join di dettaglio fatture con prodotti Id_fat Id_prod Qt Cost Descr Prz 997/02 MV001 10 1.00 Vite 1.25 001/03 MV001 10 1.25 Vite 1.25 001/03 MD039 100 0.75 Dado 0.75 Il join tra le due tabelle collegate dall’attributo id_prod produce una tabella che è la combinazione di tutte le righe di entrambe le tabelle che hanno lo stesso valore di attributo ITIS “O.Belluzzi” – Laboratorio di Sistemi 11-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Note: L’istanza di prodotti di codice MR900 non compare nel join perché non trova nessun adattamento nell’altra tabella (cioè non è inserita in alcuna fattura). Tutte le istanze di dettaglio_fatture compaiono nel join. Poiché il campo comune del join è per questa tabella chiave esterna di una relazione N:M le regole di integrità referenziale (se un valore di chiave esterna compare in una associazione N:M deve essere presente come chiave primaria nella tabella che collegata dall’associazione. Tutte le righe celesti formano la fattura 997/2 mentre tutte le righe verdi formanao la fattura 001/03 L’attributo prezzo attuale (Prz) è irrilevante in questa relazione e quindi può essere eliminato Normalizzazione: Per iniziare lo studio della normalizzazione, osserviamo che le associazioni tra i dati di due domini, A e B, possono essere suddivise in tre categorie: Associazioni uno-a-uno Associazioni uno-a-molti Associazioni molti-a-molti Le associazioni uno-a-uno sono quelle in cui ogni elemeento in A è accoppiato con un unico elemento in B, e viceversa. Per esempio, ad ogni studente iscritto ad una scuola potrebbe essere assegnato un numero di matricola. Ogni numero di matricola è d’altraparte associato ad un singolo studente. Esempio di associazione uno-a-uno Matricola 19801 20112 21345 Studente Rossi Bianchi Verdi Matricola(uno-a-uno)Studente In una associazione uno-a-molti, ogni membro del dominio B è assegnato ad un unico elemento del domino A, ma ogni elemento del dominio A può essere assegnato a mlti elementi del dominio B. Per esempio, ogni studente frequenta una sola classe, mentre ogni classe è formata da molti studenti. Si crea una associazioni uno-a-molti tra classi e studenti (o una associazione molti-a-uno tra studenti e classi). ich may be written as: Esempio di associazione uno-a-molti Matricola 19801 20112 21345 Classe 3B5 3B5 4B5 Matricola(uno-a-uno)Studente Le associazioni molti-a-molti sono quelle in cui nessun membro di un dominio dell’associazione è associato ad un unico membro dell’altra associazione. Ad esempio l’associazione tra classi e professori è molti-a-molti. Una classe può avere molti professori e un professore può avere molte classi. Classe 3B5 3B5 4B5 ID_prof I03 M12 R01 ITIS “O.Belluzzi” – Laboratorio di Sistemi 12-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo Classi(molti-a-molti)professori Forme normali: Si dice che un database è in forma normale se rispetta un certo insieme di regole. Qundi uno scjema relazione che rispetta queste regole è definito schema in forma normale. Sebbene non esista nessun vincolo nella progettazione di uno schema relazionale ad eccezione dell’obbligo della chiave primaria è’ opportuno che il progettista disegni lo schema in forma normale in modo da evistare ridondanze ed anomalie che comprometterebbo il buon funzionamento del database. Ecco alcuni esempi di forme non normalizzate ASSOLUTAMENTE DA EVITARE: Matricola 19801 20112 21345 Studente Mario Rossi Anna Bianchi Giuseppe Verdi L’attributo Studente è un attributo composito. Questa situazione impedisce un corretto impiego del databese (ad esempio rende difficile un ordinamento per cognome). In questo caso è opportuno separare gli attributi. Classe ID_prof 3B5 I03 M12 R02 4B5 I03 M12 5B4 I03 M11 R01 S01 L’attributo ID_prof è un attributo multiplo.Oltre a presentare gli stessi problemi di un attributo composito presenta anche il problema che il numero di elementi che lo compongono è variabile quindi il problema non si risolve neppure separando gli attributo ma è necessario ricorrere ad una associazione molti-a-molti. Prima forma normale: una relazione è in prima forma normale se ogni campo non è scomponibile in più campi e ogni tupla è unica. Ci sono due comuni tipi di campi non-atomici (scomponibili). Il primo tipo di campo nonatomico è il campo strutturato (ad esempio il nome-cognome oppure un indirizzo). Se l’intero indirizzo è posto in un signolo campo la relazione non è in prima forma normale perché un indirizzo è composto di via,comune,provincia e cap. Mettere tutti i dati insieme in uno stesso campo pregiudica la possibilità di ordinare o filtrare (=scegliere solo alcune righe) per comune o per provincia. Un secondo tipo è la lista o “gruppo ripetuto”. Ad esempio una classe ha un numero imprecisato di insegnati (la quantità dipende dal tipo di corso). Se gli insegnanti sono semplicemente elencati in una lista (attibuto multiplo) la relazione non è in prima forma normale. Mettere tutti gli insegnanti in una lista porta a severe limitazioni, oltre alla difficoltà di ordinamennto e filtro, che non si risolvono convertendo l’attributo multiplo in attributo composito (cioè numero fisso di campi). Infatti in questo caso potrebbe capitare che il numero di campi previsto non basti oppure, se ci si tiene larghi (prevedendo molti campi), si lascia tabella largamente inutilizzata con un degrado delle prestazioni. In conclusione i gruppi ripetuti o strutturati distruggono la naturale struttura rettagolare di una relazione. E’ particolarmente difficile estrarre un particolare elemento da un gruppo ripetuto o strutturato perché bisogna in qualche modo specificare la sua posizione all’interno del gruppo. Le regole della prima forma normale rappresentano la ovvia considerazione che ogni attributo deve avere un proprio nome. Il passaggio alla prima forma normale consiste nel verificare che ogni attributo abbia un proprio nome e nella estrazione degli attributi multipli in una tabella esterna. Forme normali superiori sono motivate dalla individuazione di anomalie nel trattamento dei dati della relazione con possibili inconsistenze o perdite di dati. Seconda forma normale: una relazione è in seconda forma normale se è in prima forma normale e se tutti i suoi attributi sono dipendenti dall’intera chiave priamria. Una relazione in seconda forma normale Per costruire una relazione in seconda forma normale si può procedere con la tecnica della decomposizione cotruendo una relazione separata che incorpora la dipendenza parziale e rimuovendo l’attributo dalla relazione originale. ITIS “O.Belluzzi” – Laboratorio di Sistemi 13-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Esempio: Una azienda di trasporti gestisce le corse di alcune linee identificate dai due capolinea mediante un certo numero di autobus (ogni autobus indentificato da un numero è catatterizzato da un certo numero di posti). Una possibile relazione ‘Corse’ è: Ora 7.00 7.00 7.30 8.00 8.00 8.30 Linea 25 19 25 19 21 25 Origine Roveri S.Lazzaro Roveri S.Lazzaro Casalecchio Roveri Destinazione Dozza P.Maggiore Dozza P.Maggiore Stazione Dozza Bus 30144 25251 19154 30144 25328 25251 Posti 50 30 70 50 30 30 La chiave primaria è determinata dalla combinazione dell’ora di partenza e della linea. La relazione tuttavia non è in seconda forma normale infatti gli attributi Origine e Destinazione dipendono solo parzialmente dalla chiave (dipendono solo da Linea e non da Ora). La consegnuenza di questa anomalia è che i dati di origine e destinazione sono ripetuti più volte nella stessa tabella. Il problema non è solo di ridondanza (eccesso di dati) ma è anche di consistenza (validità dei dati). Infatti se si cambia un capolinea la modifica va fatta in tutte le righe in cui compare altrimenti il capolinea può cambiare in funzione della riga visitata. Per passare in seconda forma normale devono essere estratti dalla relazione tutti gli attributi che dipendono parzialmente dalla chiave e spostati in una nuova relazione in cui dipendono totalmente dalla chiave. Ora 7.00 7.00 7.30 8.00 8.00 8.30 Linea 25 19 21 Linea 25 19 25 19 21 25 Bus 30144 25251 19154 30144 25328 25251 Origine Roveri S.Lazzaro Casalecchio Posti 50 30 70 50 30 30 Destinazione Dozza P.Maggiore Stazione Terza forma normale: Una relazione è in terza forma normale se è in seconda forma normale e se non ci sono dipendenze transitive dalla chiave primaria cioè nessuno degli attributi nonchiave è dipendente da un altro attributo che a sua volta dipende dalla chiave. Una decomposizione che genera una terza forma normale consiste nell’estrarre gli attributi che non dipendono direttamente dalla chiave in una relazione separata in cui la chiave primaria è formata dall’attributo da cui dipendono direttamente. Nell’ esempio precedente si vede che la prima delle due relazioni ottenute nel passaggio in seconda forma normale non è in terza forma normale. Infatti l’attributo posti non dipende direttamente dalla chiave (Ora+Linea) ma solo indirettamente attraverso l’attributo non-chiave Bus. L’anomalia che si determina è la ripetizione del valore di Posti ad ongi ripetizione di un valore di Bus. La trasformazione in terza forma normale porta a questa situazione: Ora 7.00 7.00 Linea 25 19 Bus 30144 25251 Linea 25 19 Origine Roveri S.Lazzaro Destinazione Dozza P.Maggiore 7.30 8.00 25 19 19154 30144 21 Casalecchio Stazione 8.00 21 25328 8.30 25 25251 ITIS “O.Belluzzi” – Laboratorio di Sistemi Bus 30144 25251 Posti 50 30 19154 25328 70 30 14-16 7. Elementi di teoria dei database relazionali Lezioni di web attivo 7.11 Linguaggi di descrizione e manipolazione dei dati Per realizzare una banca dati relazionale è necessario disporre di un programma di gestione delle tabelle (normalmente chiamato motore di banca dati) in grado di interpretare i comandi di descrizione e manipolazione della banca dati. In attuazione ai comandi di descrizione, detti DDL (Data Description Language), il motore genera banche dati e strutture delle tabelle in essi contenuti, modifica la struttura delle tabelle ed elimina banche dati e tabelle. In attuazione ai comandi di manipolazione, detti DML (Data Manipolation Language), il motore inserisce dati nelle tabelle, li modifica, li cancelle oppure restituisce i dati contenuti nelle tabelle. Non si deve confondere il motore di banca dati con l’interfaccia utente usata per il comando. Ad esempio il programma Microsoft Access non è un motore di banca dati ma una interfaccia utente (il suo motore è una DLL (Dynamic Link Library) interna di Windows chiamata Jet). Nel nostro caso invece il motore è un server TCP (in ascolto sulla porta 3306) in esecuzione su un host di rete in grado di ricevere comandi attraverso una connessione e l’interfaccia è costituita da pagine di web attivo. Esiste uno standard che consente di utilizzare lo stesso linguaggio indipendentemente dal motore utilizzato. Questo standard si chiama SQL (Structured Query Language). Il linguaggio SQL è un linguaggio non procedurale nel senso che per ottenere un risultato non si deve descrivere l’azione da svolgere ma il risultato desiderato. Il linguaggio contiene sia istruzioni DDL che instruzioni DML. Le istruzioni SQL a causa della loro natura non procedurale vengono chiamate query (richiesta) Istruzioni DDL: CREATE DATABASE nomedb crea un nuovo database vuoto (nel senso che non contiene tabelle). Esempio: CREATE DATABASE miodb DROP DATABASE nomedb cancella un nuovo database esistente (cancella anche le sue tabelle ed il relativo contenuto). Esempio: DROP DATABASE miodb USE nomedb: seleziona un database dall’insieme dei db gestiti dal motore. Esempio: USE miodb CREATE TABLE nometab ... crea una nuova tabella vuota nel database selezionato database vuoto (devono essere specificati i campi con i loro tipo cioè lo schema della tabella). Esempio: CREATE TABLE prodotti(idprod INT PRIMARY KEY,descr CHAR(20)) Crea una tabella con una chiave primaria artificiale numerica ed un campo di testo di descrizione ALTER TABLE nometab ... Modifica lo schema di una tabella esistente aggiungendo, togliendo, modificando i suoi campi. Esempio: ALTER TABLE prezzo ADD prezzo DECIMAL(10,2) Aggiunge alla tabella precedente un campo prezzo in virgola fissa con due decimali (€) DROP TABLE nometab. Cancella una tabella esistente rimuovendo anche tutti i dati in essa contenuti.. Esempio: DROP TABLE miatab ITIS “O.Belluzzi” – Laboratorio di Sistemi 15-16 Lezioni di web attivo 7. Elementi di teoria dei database relazionali Istruzioni DML: SELECT campi FROM tabelle WHERE condizioni crea una tabella dinamica avente lo schema definito da campi, ricavata dal join di tabelle con le restrizioni imposte da condizioni. Esempi: SELECT * FROM prodotti Estrae tutti gli elementi di prodotti (l’intera estensione) mostrando l’intero schema SELECT t1.idfat,t1.idprod,t1.qt,t2.descr FROM dett_fatt AS t1,prodotti AS t2 WHERE t1.idprod =t2.idprod Crea una nuova tabella dinamica che mostra il dettaglio ordini con anche l’indicazione della descrizione del prodotto Modificando nella query precedente la condizione where: WHERE t1.idprod =t2.idprod AND t1.idfat=numerofattura Si ottiene una estensione limitata ad una singola fattura (è in pratica il documento di fattura da stampare). INSERT INTO tabella(campi) VALUES (valori) Inserisce in una tabella una nuova riga Esempi: INSERT INTO prodotti VALUES(1,’prodotto1’,1.55) Inserisce un nuovo prodotto nella tabella specificandone i tutti i valori. (potrebbe fallire per duplicazione di chiave primaria) INSERT INTO prodotti(descr,prezzo) VALUES(’prodotto1’,1.55) Se la chiave è ad autoincremento il fatto di non specificare la chiave ne fa generare una nuova che sicuramente non è duplicata. UPDATE tabella SET campo=valore, … WHERE condizione Aggiorna i campi specificati con i valori specificati solo per le righe che rispettano la condizione nella tabella specificata Esempio: UPDATE prodotti SET prezzo=2.0 WHERE idprod=1 Aumenta il prezzo del prodotto di codice 1 da 1.55 a 2.00 € DELETE FROM tabella WHERE condizione Cancella dalla tabella tutte le righe che soddisfano la condizione Esempio: DELETE FROM prodotti WHERE prezzo<2.00 Cancella dalla tabelle tutti i prodotti che costano meno di 2.00 € Questi sono solo alcuni esempi elementari di query; la sintassi delle query può essere anche molto più complessa. Per ulteriori dettagli consultare l’unità 8 (database mysql) ed il manuale ufficiale di mysql. ITIS “O.Belluzzi” – Laboratorio di Sistemi 16-16