Modelli logici di data base
A partire dallo schema concettuale E/R, un database può essere progettato e realizzato passando al modello
logico, cioè alle strutture di dati che consentono di organizzare questi ultimi per poter effettuare le
operazioni di manipolazione e di interrogazione.
Nello sviluppo della teoria dei database, dal 1960 in poi, sono emersi principalmente tre tipi diversi di modelli per
le basi di dati:
Modello Gerarchico
E’ particolarmente adatto per rappresentare situazioni nelle quali è possibile fornire all’insieme dei dati una
struttura nella quale ci sono entità che stanno in alto ed entità che stanno in basso, secondo uno schema ad albero,
nel quale i nodi rappresentano le entità e gli archi rappresentano le associazioni. Nella pratica l’entità è un
file, l’istanza è un record e gli attributi sono i campi del record. E’ particolarmente adatto a
rappresentare le associazioni 1:N. Presenta dei limiti soprattutto nella rigidità della struttura di dati creata, che
talvolta non riesce ad evitare ridondanze.
La struttura ad albero che caratterizza il modello gerarchico si basa sulla possibilità di individuare un record ( o
segmento principale), il padre o la radice, dal quale dipendono n record figli, che a loro volta si trasformano in
padri per altri figli e così via. A questi, in virtù della totale dipendenza dal padre, è possibile fare riferimento solo
attraverso il passaggio dal nodo principale. Non è possibile dal figlio risalire al padre.
padre o radice
figlio
Esiste tutta una teoria sulla gestione degli alberi e in particolare degli alberi binari di ricerca. Fate riferimento alle
slides power-point sugli alberi.
Questa architettura mal si adatta ad una gestione moderna e dinamica delle basi di dati.
Prof.ssa A. Mancini Informatica VC
Modello Reticolare
In questo modello le entità rappresentano i nodi e le associazioni rappresentano gli archi di uno schema a grafo
orientato: si tratta cioè di una estensione del modello gerarchico. Non esiste quindi una gerarchia predefinita tra le
entità, un record figlio può avere un numero qualsiasi di padri: in questo modo vengono evitate situazioni di
ripetizione di dati uguali. Fate riferimento al file i grafi.
Risulta però più difficile l’implementazione e la costruzione del software applicativo. Ha avuto una discreta
diffusione negli anni ’70 soprattutto nei sistemi di grandi dimensioni.
Modello Relazionale
Rappresenta il database come un insieme di tabelle. Esso viene considerato attualmente il modello più semplice ed
efficace, perché è più vicino al modo consueto di pensare i dati, e si adatta in modo naturale alla classificazione e
alla strutturazione dei dati.
Il modello relazionale nasce nel 1970, proposto da Edward F. Codd, ricercatore dell’IBM come idea
di un modello logico molto semplice e nello stesso tempo in grado di superare i limiti degli altri modelli utilizzati.
Entra a far parte di sistemi commerciali a partire dal 1978. Esso si basa su alcuni concetti fondamentali
tipicamente matematici e assegna grande importanza all’uso rigoroso del linguaggio matematico, con due obiettivi
importanti:
1.
utilizzare un linguaggio conosciuto a livello universale, qual’è il linguaggio matematico
2.
eliminare i problemi di ambiguità nella terminologia e nella simbologia
Con questo modello i modelli gerarchico e reticolare sono presto diventati obsoleti per il mercato e per la ricerca.
Questo perché le operazioni sui database gerarchici sono complesse, agiscono sui singoli record e non su gruppi di
record. I modelli non relazionali sono fondamentalmente basati sulla programmazione di applicazioni, l’utente
deve specificare i percorsi per ritrovare i dati e la velocità nel ritrovare le informazioni dipende dal software di
gestione; nel modello relazionale invece i percorsi per le interrogazioni sono a carico del sistema.
Il modello relazionale è più intuitivo e più espressivo per la strutturazione dei dati, rispetto agli altri modelli però è
relativamente più lento, nella ricerca e occupa più spazio su memoria di massa rispetto ai database creati e gestiti
da DBMS basati sugli altri modelli.
Vediamo in dettaglio il Modello Relazionale.
Esso si chiama così perché è fondato sul concetto matematico di relazione tra insiemi di oggetti.
Dal punto di vista matematico, dati n insiemi A1, ……, An, si dice relazione un sottoinsieme dell’insieme di tutte
le n-uple a1,……,an che si possono costruire prendendo nell’ordine un elemento a1 dal primo insieme A1, a2 dal
secondo insieme A2 e così via.
Il numero n si chiama grado della relazione, gli insiemi Ai si chiamano domini della relazione, e il numero delle
n-uple (indicate con il termine tuple) si chiamano cardinalità della relazione.
Prof.ssa A. Mancini Informatica VC
La relazione viene comunemente rappresentata con una tabella, avente tante colonne quanti sono i domini (grado
della relazione) e tante righe quante sono le n-uple (cardinalità della relazione). I nomi dei domini sono i nomi
delle colonne, i valori che compaiono in una colonna sono omogenei tra loro, cioè appartengono a uno stesso
dominio. La relazione è quindi una collezione di n-uple, ciascuna delle quali contiene i valori di un numero
prefissato di colonne. La relazione rappresenta un’entità, ogni n-upla rappresenta un’istanza dell’entità, le colonne
contengono gli attributi dell’entità, il dominio è l’insieme dei valori che possono essere assunti da un attributo.
La chiave della relazione è un attributo o una combinazione di attributi che identificano univocamente le n-uple
all’interno della relazione, cioè ogni riga della tabella possiede valori diversi per l’attributo (o gli attributi) chiave.
Modello orientato ad oggetti
Modello dei dati Tipi di dato – le proprietà di un oggetto vengono definite attraverso un elenco di dati a cui è
associato un tipo e un nome. I dati possono essere di tipo atomico cioè i tipi di base messi a disposizione dalla
maggior parte dei linguaggi di programmazione come ad esempio interi, reali, Stringhe, booleani ecc. Inoltre si
possono definire proprietà (attributi) di un oggetto che hanno per valore un altro oggetto. Oggetti dello stesso tipo
appartengono ad una classe all’interno della quale viene data la definizione delle proprietà del tipo, i metodi con i
loro parametri di ingresso ed uscita, e la loro implementazione. I metodi possono essere usati per non permettere
l’accesso diretto alle proprietà dell’oggetto, che vengono definite private, ma consentendo solo l’uso di metodi
appositi per la lettura e la modifica delle proprietà stesse esponendo così all’esterno dell’oggetto solo la segnatura
dei metodi con i parametri di ingresso e uscita. L’insieme dei valori assunti dalle proprietà di un oggetto è il suo
stato. Incapsulamento – è una caratteristica della programmazione ad oggetti per cui si cerca di nascondere
all’esterno dell’oggetto l’implementazione dei suoi metodi e delle sue proprietà. L’oggetto è costituito da
un’interfaccia che definisce i metodi utilizzabili sull’oggetto e i loro parametri, e dall’implementazione che contiene
il codice vero e proprio che esegue le operazioni. Nelle basi di dati ad oggetti tuttavia 15 la struttura dei dati
dell’oggetto può essere resa visibile all’esterno attraverso i linguaggi di interrogazione.
Ereditarietà – A partire da una classe definita super-classe è possibile definire una sotto-classe che eredita tutte
le proprietà i metodi e la loro l’implementazione dalla super-classe, e può inoltre definire attributi e metodi
aggiuntivi che la specializzano. In una gerarchia, tutti gli oggetti delle sottoclassi appartengono anche alla
superclasse. Un oggetto si dice istanza di una classe se essa è la classe più specifica che lo rappresenta, mentre esso
si dice membro di tutte le sue super-classi. In un ODBMS è possibile creare un’istanza di una classe e assegnarle a
runtime il tipo di una superclasse. Le sue proprietà specifiche vengono comunque conservate e memorizzate
permanentemente del database. Se si cercano nel database tutte le istanze di una super-classe verranno ritornate
anche tutte le istanze delle sottoclassi.
Polimorfismo – All’interno di una gerarchia è possibile nelle sotto-classi ridefinire l’implementazione dei metodi
ereditati in modo da avere sui dati un comportamento più specifico e diversificato per la sotto-classe. Quando
viene eseguito il programma, il sistema determina automaticamente quale metodo usare, scegliendo quello più
adatto secondo il tipo dell’oggetto. Si possono così definire diverse versioni di un metodo mantenendo la stessa
interfaccia per tutti gli oggetti della gerarchia ottenendo quello che viene chiamato overloading dei metodi. È
possibile anche ridefnire metodi e proprietà modificando l’interfaccia. IN questo modo si introducono dei sottotipi, in cui le proprietà possono avere come tipo un sotto-tipo di quello che avevano nell’interfaccia della superclase. Allo stesso modo i metodi possono avere come parametri di ingresso e di uscita dei sotto-tipi dei parametri
che avevano nell’interfaccia della super-classe.
Prof.ssa A. Mancini Informatica VC
Relazioni tra oggetti – Possono essere definite delle relazioni tra gli oggetti assegnando ad un campo di un
oggetto un altro oggetto cioè il suo identificatore, che nella basi di dati rappresenta univocamente ciascun oggetto
creato e salvato nel database. Se un oggetto fa riferimento ad un altro, terrà il riferimento all’oggetto di
destinazione ed altre istanze potranno fare riferimenti a quello stesso oggetto.
Utilizzando dei costrutti come le Collezioni, gli Array ecc è possibile stabilire relazioni fra un oggetto e un insieme
di altri oggetti mantenendone i riferimenti. Alcuni DBMS supportano una modalità per cui è possibile inglobare un
oggetto referenziato all’interno sorgente della relazione, così che i due oggetti siano salvati insieme e l’oggetto
destinazione non risulta avere un proprio identificativo ma esiste soltanto come proprietà dell’oggetto che lo
contiene. Questo permette di salvare spazio nella memorizzazione dei dati nel database, ma tuttavia non rende
possibile accedere direttamente all’oggetto contenuto con le query, ma solo raggiungendolo dall’oggetto sorgente.
(Si faccia riferimento a bluej (data base people)
USO DI ArrayList
Nella classe data base viene generato un ArrayList, vettore che contiene oggetti, riferimenti alle persone del data
base.
Gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento
della creazione e rimane immutato. Per superare questa limitazione Java mette a disposizione la classe ArrayList,
contenuta nel package java.util che permette di rappresentare sequenze di oggetti di lunghezza variabile. Ciascun
oggetto in un’istanza di ArrayList viene identificato da un numero intero, detto indice, che ne indica la posizione.
L'accesso ad una posizione inesistente provoca un errore (viene lanciata un'eccezione). L’ArrayList è quindi simile
ad un array. Le differenze principali sono due: La dimensione può variare durante l'esecuzione di un programma .
Gli elementi contenuti sono di un solo tipo: Object. ArrayList è una classe come tutte le altre, non ha alcuna
sintassi particolare.
Prof.ssa A. Mancini Informatica VC
Restituisce il numero di elementi contenuti: int size()
Restituisce l'elemento di indice index: Object get(int index)
Aggiunge obj dopo l'ultimo elemento (restituisce true): boolean add (Object obj)
Restituisce una stringa "[el1, el2,… eln]“: String toString ()
import java.util.ArrayList;
import java.util.Iterator;
public class Database {
private ArrayList persons;
public Database()
{
persons = new ArrayList();
}
/**
* Add a person to the database.
*/
public void addPerson(Person p)
{
persons.add(p);
}
/**
* List all the persons currently in the database on standard out.
*/
public void listAll ()
{
for (Iterator i = persons.iterator(); i.hasNext();) {
System.out.println(i.next()); } } }
Prof.ssa A. Mancini Informatica VC