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