# Modelli di Database (superiori)
## Modelli di Database

In questa pagina vedremo i vari modelli di database.

### File-Records

In questo caso tutto il database risiede su un unico file che è organizzato a "record", la velocità di ricerca è molto elevata, la flessibilità nella ricerca è bassa, la programmazione del database è semplice. Per capire come e' fatto e per imparare la terminologia tecnica da usarsi quando si parla di database pensiamo a come possiamo registrare i dati anagrafici degli studenti di questa classe usando un foglio di calcolo .La prima cosa e' quella di creare una tabella, vogliamo ad esempio registrare per ciascun alunno il nome, il cognome e l'età, per motivi organizzativi diamo a ciascun alunno un numero progressivo partendo da 0,1,2 ... etc (la scelta di partire da 0 invece che da 1 e' per ora inconsueta ma ci consente qualche vantaggio che vedremo successivamente).Ora per preparare la tabella nella prima riga mettiamo i titoli delle colonne ID,Nome,Cognome,Eta e poi nelle righe successive inseriamo i dati di ciascun alunno come in figura.
I dati di ciascuna riga , esclusa la riga dei titoli, prendono il nome di record , un record e' un insieme di informazioni unite logicamente fra di loro ed hanno la stessa dimensione quindi è più facile ricercare, nel nostro caso su una certa riga troviamo un ID,un nome e un cognome e una età che appartengono alla stessa persona(ecco il legame logico). I titoli di ciascuna colonna vengono chiamati campi, e l'insieme di tutti i campi con in più informazioni sul tipo di dato contenuto in quella colonna vengono chiamati tracciato del record. Ad esempio si dice che nome e' un campo della tabella o un campo del record, mentre se fornisco le seguenti informazioni
| NomeCampo | TipoDato | Dimensione in Byte |
| ID | intero | 4 |
| Nome | stringa di 25 caratteri | 25 |
| Cognome | stringa di 35 caratteri | 35 |
| Età | intero | 4 |
queste esplicitano il tracciato del record, cioe' la sua struttura, ricordo che una stringa e' una sequenza di caratteri che nel caso di codifica ASCII occupano ciascuno un byte, in questo caso pensiamo che le stringhe utilizzate siano a lunghezza fissa, cioè se scrivo MARCO viene registrato il nome seguito da tanti caratteri spazio fino ad arrivare a 25 caratteri complessivi, quindi scrive MARCO o GIANLUCA per strano possa apparire richiede sempre 25 caratteri.Il campo ID e' detto chiave primaria , una chiave primaria è un campo che identifica univocamente ciascun record della tabella.Generalmente in ambito fiscale per identificare una specifica persona si usa il suo codice fiscale. La chiave primaria può essere anche composta da 2 o più campi ad esempio se non ci sono casi di omonimia potevo prendere assieme i campi Nome e Cognome e utilizzarli come chiave primaria, la scelta però di un indice progressivo come in questo caso mi permette di superare anche il problema di eventuali omonimie ed e' per questo preferibile.L'insieme di tutti i record e' detto tabella e l'insieme di tutte le tabelle costituiscono il nostro database
Ora pensiamo di registrare sequenzialmente le informazioni di ciascun record su un file (file di records), ogni record occupa sempre (con questo esempio) 68 byte , ricordo che un byte=8bit, un file e' una lunghissima sequenza di bit 0000101010101001010 .... in cui i primi 68byte rappresentano il record zero, i successivi 68byte il record 1 etc. Per poter leggere un particolare record di cui conosco l'ID basta allora posizionarsi all'inizio del file e spostarsi da li della quantita 68*numeroID (ecco il motivo per cui sono partito da zero con i valori dell'ID), senza dover leggere tutti i dati dei records che lo precedono, se devo leggere il record 3237 devo allora
Ripetendo In un file di record, il computer, per trovarne uno specifico record all'interno del file di records, moltiplica il numero della sua chiave primaria per il numero di byte che compongono ciascun record. Ad esempio, nella seguente tabella formata da records di 68 byte, per trovare il record che come chiave primaria ha il numero 3237, il computer moltiplica questa cifra per 68 (il numero di byte sopra scritto), e di conseguenza risale al record richiesto.Questo rende estremamente veloce l'accesso/ricerca di singoli record.

### Modello Gerarchico (Hierarchical database model)

Quando le informazioni da registrare nel database aumentano e, risulta scomodo usare un solo file si utilizzano database con molti file, la struttura organizzativa può essere a forma di albero in tal caso si parla di un modello gerarchico è un modello di database nato nel 1960 e largamente utilizzato assieme a quello reticolare per oltre un trentennio , la velocità di ricerca dei dati che procede in un modo gerarchico è elevata ma poco flessibile, l'organizzazione delle tabelle in esso contenute detta struttura ad albero (tree), esiste una tabella principale da cui dipartono delle sottotabelle, le sottotabelle possono avere a loro volta delle ulteriori sottotabelle e cosi via, quando si ricerca una informazione si parte sempre dalla tabella principale scendendo poi eventualmente in una delle sottotabelle e da questa alle sottotabelle collegate e cosi via, in pratica l'accesso dei dati e' vincolato e procede solo dall'alto al basso.
In termini informatici dove la struttura ad albero e' una struttura dati ampiamente utilizzata la terminologia impiegata e' la seguente
* ciascuna tabella e' un nodo dell'albero
* la tabella principale (che e' un nodo) e' detta radice dell'albero
* le tabelle senze ulteriori tabelle collegate direttamente sono dette foglie
* gli archi orientati che collegano le tabelle ( e che indicano il possibile verso di ricerca) sono detti rami
pensando che l'albero rappresenti un albero genealogico si parla anche di
* nodo figlio di un certo nodo (discendente diretto)
* nodo padre di un certo nodo (ascendente diretto)
Per vedere l'albero dovete guardare la figura capovolta , la radice rappresenta infatti la base dell'albero. Se invece di tabelle i nodi rappresentassero delle parole l'albero (albero binario e B-Tree) potrebbe rappresentare un dizionario e 'altezza max dell'albero e' un importante indice della velocità di ricerca, a parita di nodi sono meglio gli alberi compatti. Una struttura ad albero viene ad esempio impiegata per rappresentare il files system (organizzazione di file e cartelle) o le voci del registro di configurazione di windows. Anche l'organizzazione di dati tramite XML (1990) usa una struttura gerarchica
Ritornando al nostro database gerarchico questo e' ancora largamente utilizzato ( banche , telecomunicazioni, geografia) dove e' richiesta elevata velocità nella ricerca dati. La struttura ad albero non consente una ricerca libera (magari partendo da una tabella qualsiasi e non ci consente di risalire da un nodo figlio al nodo padre) e quindi giudicato poco flessibile nei confronti del modello reticolare e peggio ancora nei confronti del modello relazionale, richiede inoltre che alcune informazioni siano duplicate (quando si devono risolvere associazioni N:M)diventando cosi sensibile a problemi di inconsistenza.

### Modello Reticolare (Network model)

Il modello reticolare è un database che mantiene la velocità di quello gerarchico e ne aumenta la flessibilità di ricerca al prezzo di una maggiore complessità a livello di sviluppo (programmazione). La struttura è a grafo non orientato : le tabelle sono collegate da percorsi bidirezionali (cioe' percorribili in entrambi i sensi, a differenza di un arco orientato che esprime un particolare verso di percorrenza). In questo modello non esiste una tabella principale, tutte le tabelle sono ugualmenti importanti , i collegamenti fra tabelle sono percorribili quando ricerco l'informazione in entrambi i sensi ( dalla tabella A a quella B e viceversa) senza dover seguire un ordine particolare di ricerca come nel precedente modello. Il grafico è il seguente:
Un grafo e' spesso usato per descrivere delle mappe stradali per poi poterne ricavare i percorsi ottimali, questa mappa stradale a grafo assieme alla tecnologia GPS hanno dato vita ai navigatori GPS.I grafi sono usati anche per descrivere la struttura di una rete (Internet ad esempio) e assieme alle tecniche di instradamento permettono l'invio dei dati da un utente all'altro.
Ogni collegamento bidirezionale e' realizzato internamente con una tabella, con due colonne una che rappresenta la chiave primaria della prima tabella e una che rappresenta la chiave primaria della seconda. Concretamente se la prima tabella rappresenta i clienti e la seconda le fatture , pensando che il cliente con ID 7 (chiave primaria della prima tabella) abbia le fatture n.56 n. 23 e n. 345 (pensiamo che queste siano chiavi primarie della 2 tabella) allora nella tabella che rappresenta il collegamento devo trovare:
| Id Cliente | Idfattura |
| 7 | 56 |
| 7 | 23 |
| 7 | 345 |
questa tabella permette di trovare dato l'IdCliente (7) le sue fatture ( 56,23,345) e poi di ricavare i dati delle corrispondenti fatture nella tabella fatture, oppure, data una particolare fattura (23) di risalire al cliente (7) per poi leggere i dati di quel cliente presenti nella tabella Clienti (record 7)

### Modello relazionale

Il modello relazionale fu inventato da un ricercatore dell'IBM (E. F. Codd) nel 1970. Quando la velocità di elaborazione dei sistemi informatici aumento (seconda parte anni '80) il modello relazionale (meno efficiente in termini di velocità di ricerca dei database gerarchico e reticolare) si affermò per la sua maggiore flessibilità nella ricerca dei dati.Chi utilizza un database di questo tipo (RDBMS) può interrogare (query) il database mediante il linguaggio SQL, il RDBMS isolera' l'informazione richiesta e la restituirà all'utente. Database relazionali sono ad esempio Mysql (molto diffuso su Internet), Oracle , DB2 (IBM), ACCESS, Base(OpenOffice) etc. I database trattati durante l'anno saranno solamente quelli relazionali.
Il modello relazionale è descritto con un linguaggio matematico .Ad esempio le buone vecchie tabelle diventano:
* Si considerino n insiemi D1 , D2, ..., Dn
* consideriamo tutte le n-uple possibili che possiamo formare prendendo un elemento da ciascun insieme
* si definisce relazione un sottoinsieme di tutte le possibili n-uple
I moderni DBMS relazionali assicurano:
* indipendenza fisica (non bisogna modificare il programma se decido di cambiare/spostare i supporti di memorizzazione
* indipendenza logica (non bisogna modificare il programma se decido di cambiare la struttura delle tabelle(colonne) o di aggiungere rimuovere delle tabelle)
* inoltre elimina la ridondanza dell'informazione(duplicazione stessa informazione) e quindi i dati sono coerenti e il database non diventa inconsistente.( prima poteva capitare di registrare il numero di telefono del cliente su ogni fattura anche se era sempre lo stesso, se per sbaglio su una fattura scrivevo un numero diverso avevo una incoerenza (errore) e non riuscivo più a capire quale fosse il numero corretto e quindi il database diventava inconsistente)
* gestione sicurezza nei confronti utenti non autorizzati e gestione limitazione operazione di inserimento ricerca (viste)

### Modello ad oggetti

Il modello ad oggetti rappresenta la futura evoluzione dei database. Questo modello fa uso della programmazione ad oggetti e da la possibilità all'utente di definire nuovi tipi di dato (ad esempio il dato ; film,canzone,strada,contatore etc.) e trova applicazione nell'abito multimediale e cartografico o dei servizi