Database

 

SQL è un linguaggio usato per gestire, ma soprattutto consultare i database relazionali.

Un Database relazionale è un modello di database che consiste di diversi file che sono collegati l'un l'altro attraverso campi chiave. Si può accedere alle informazioni memorizzate in un file attraverso uno o più degli altri file, grazie alle relazioni stabilite tra questi. Ad esempio, un database relazionale vede il collegamento fra un database anagrafico degli impiegati in una società ed il database delle retribuzioni, tramite un codice univoco che identifica il singolo impiegato.

La chiave nella relazione (sinonimo di tabella) è un attributo o un insieme di attributi (sinonimo di campo) che identificano unicamente i record (n-uple, tuple) all’interno di una relazione.

La chiave esterna: nell’associazione uno a molti bisogna aggiungere agli attributi dell’entità che svolge il ruolo molti (squadra) una chiave esterna che identifichi unicamente i record dell’entità che svolge il ruolo ‘a uno’ nell’associazione (calciatori).

Le operazioni relazionali

Gli operatori relazionali consentono di effettuare le interrogazioni, essi agiscono su una o più relazioni (o tabelle) per estrarre/ottenere una nuova relazione (o tabella) che fornisca le informazioni richieste. Le principali operazioni del modello relazionale sono:

La selezione: crea una nuova relazione (tabella) costituita dai record (n-uple, tuple) della relazione di partenza che soddisfano una determinata condizione. Il grado (numero dei campi/ attributi) sarà lo stesso della relazione di partenza (in quanto avrà le medesime colonne/campi) e la cardinalità (numero di record/n-uple) sarà minore o uguale alla tabella di partenza. Es: Ricercare quei record che soddisfano la proprietà Provincia = “VR”.

La proiezione: crea una nuova relazione (tabella) che estrae dalla tabella principale solo alcune colonne. Il grado sarà minore o uguale alla relazione di partenza, uguale solo quando si riordinano le colonne. La cardinalità generalmente sarà uguale a quella di partenza. Quando la proiezione avviene su un solo campo/attributo o pochi può avvenire che vi sia l’eliminazione delle righe dupplicate.

La congiunzione (join) tra due tabelle combina due relazioni aventi uno o più attributi in comune e genera una nuova relazione (tabella) che contiene le sole righe delle tabelle che hanno valori identici negli attributi comuni. Il grado è dato dalla somma dei campi delle tabelle (relazioni) meno le chiavi esterne. La cardinalità non è prevedibile a priori, perché dipende dai valori in entrambe le relazioni (tabelle). Oltre al join naturale descritto prima ci sono altri tipi di join:

Join esterno: può essere left o right e include tutti i record di una tabella e solo i record dell’altra tabella che hanno campi comuni con la prima. Il full join include tutte le righe (record, n-uple) di entrambe le relazioni.

Self join: vengono combinate le righe di una tabella con le righe della tabella stessa, corrisponde all’associazione ricorsiva, un esempio è dato da una tabella che contiene gli impiegati e i loro superiori per cui viene assegnato a ogni impiegato un superiore, presente nella stessa tabella.

 

Normalizzazione delle relazioni

Quando in una tabella ci sono dei dati ripetuti questo può provocare delle anomalie e si dice che i dati sono rindondanti. Le anomalie posso essere:

Anomalie di aggiornamento: se l’aggiornamento avviene solo in alcune righe e non in tutte quelle interessate si può verificare l’inconsistenza dei dati.

Anomalie di cancellazione: se un record viene cancellato vengono perse anche altre informazioni.

Anomalie d’inserimento.

Per evitare questi problemi di inconsistenza e ridondanza bisogna creare delle tabelle distinte collegate tramite relazioni. La normalizzazione consente di creare tabelle ben definite, che facilitano le operazioni di aggiunta, modifica e cancellazione delle informazioni. La normalizzazione è un procedimento volto all'eliminazione della ridondanza e del rischio di inconsistenza dal database. Esistono vari livelli di normalizzazione (forme normali) che certificano la qualità dello schema del database. Questo processo si fonda su un semplice criterio: se una relazione presenta più concetti tra loro indipendenti, la si decompone in relazioni più piccole, una per ogni concetto. Questo tipo di processo non è purtroppo sempre applicabile in tutte le tabelle, dato che in taluni casi potrebbe comportare una perdita d'informazioni.

Inconsistenza: si ha quando lo stesso campo ha valori diversi in tabelle diverse. Ciò si può verificare quando le tabelle non sono aggiornate o quando l'aggiornamento non è stato effettuato correttamente.

Ridondanza: Si ha ridondanza dei dati ogni volta che vengono memorizzati inutilmente dei dati ripetuti.

Chiave candidata: l’attributo o l’insieme di attributi che permettono di individuare univocamente la tupla all’interno della relazione.

Chiave esterna: l’attributo, o l’insieme di attributi, che può essere usata come chiave primaria per un'altra relazione.

Prima forma normale (1FN): quando gli attributi non sono scomponibili. La relazione rispetta i requisiti fondamentali del modello relazionale:

Seconda forma normale (2FN): quando oltre a soddisfare la 1FN (gli attributi non sono scomponibili), nella relazione ci sono solo attributi non-chiave dipendenti dall’intera chiave. Nel caso un attributo dipendesse solo da una parte della chiave (quando questa è formata da più campi) bisogna creare una nuova relazione dove la parte della chiave primaria sarà chiave primaria e l’attributo non chiave sarà associato solo a questa. Per esempio la relazione Inventario (Prodotto, Magazzino, Quantità, IndirizzoMagazzino) verrà scomposta in due relazioni R1 (Prodotto, Magazzino, Quantità) e R2(Magazzino, IndirizzoMagazzino), infatti l’attributo IndirizzoMagazzino dipende solo dalla chiave Magazzino che era parte della chiave nella relazione Inventario.

Terza forma normale (3FN): quando oltre a soddisfare la 2FN (quindi anche la 1FN) tutti gli attributi non-chiave dipendono direttamente dalla chiave e non ci sono altri attributi non-chiave che dipendono da altri attributi non-chiave. La relazione Studenti (Cognome, scuola, TelefonoScuola) non è in terza forma perché l’attributo TelefonoScuola non dipende dalla chiave ma da un attributo non–chiave (scuola), e quindi la relazione Studenti va divisa in due nuove relazioni Studenti(Cognome, Scuola) e Istituti(Scuola, TelefonoScuola).

L’integrità referenziale è un insieme di regole che garantiscono l’integrità dei dati quando si hanno delle relazioni associate tra loro tramite chiavi esterne, l’integrità referenziale è rispettata quando a ogni valore (non nullo) della chiave esterna corrisponde un valore della chiave primaria nella tabella associata. Quindi applicare l’integrità referenziale significa garantire che un valore presente nella chiave esterna di una tabella corrisponda a un valore di chiave primaria in un’altra tabella associata.

 

SQL i comandi principali

Esercizio 1

Esercizio 2