Archivio mensile:Ottobre 2021

Le basi di dati – Modelli Logici

Basi di Dati – Lezione 1 – Modelli Logici e Fasi della progettazione

Indice dei contenuti

1 – Modelli Logico

In informatica quando è necessario gestire una grande quantità di informazioni omogenee ovvero della stessa tipologia, come elenco delle persone di un comune, elenco dei libri di una biblioteca, ecc due sono le possibili modalità di gestione o con i file o con i database. La differenza nella realizzazione e risoluzione di problemi connessi alla gestione di enormi quanttià di dati risiede nel fatto che con la gestione con i file la velocità di esecuzione e di consultazione delle operazioni sui file sono molto più rapide che nella gestione con i database in quanto si sfruttano attraverso un linguaggio di programmazione istruzioni che agisocono direttamente sui dati, mentre con i database si passa attraverso un gestore chiamato DBMS. Per poter gestire le grandi quantità di dati nella prima modalità gli utenti devono saper programmare e realizzare quindi le procedure che gestiscono i dati. Invece nella gestione a livello di database l’utente deve conoscere al più ma non in modo obbligatorio un linguaggio semantico e informativo ovvero che svolge delle semplici operazioni sulle informazioni. Parlano di informazione e dati si deve però precisare una differenza.
Per dato si intende un fatto raccolto mediante osservazione diretta misurazione. Per informazione si intende una raccolta di dati che si riferiscono in modo univoco e non ambiguo ad un oggetto o ad un soggetto. Un aggregato di dati relativi ad un’informazione si chiama record logico e le sue componenti che possono essere di tipo diverso si chiamano campi. Un insieme di record logici possono essere memorizzate in una tabella che risiede in memoria centrale (vettore di record) oppure essere memorizzati su una memoria permanente come un’unità a disco e in questo caso si parla di file. Nella gestione a livello di programmazione il programma si deve interessare della memorizzazione dei dati sui supporti e quindi del passaggio da una struttura logica ad una fisica. Nella gestione mediante Database l’utente si disinteressa di questo passaggio occupandosi solo del livello logico del problema da risolvere. Inoltre nel primo caso l’utente si deve interessare anche dei meccanismo di accesso ai file da parte di più applicazioni e utenti andando incontro alle problematiche di condivisione dei file. Tutto questo se gestito dai database viene automaticamente soddisfatto dal DBMS.
La definizione di Database è pertanto una collezione di dati strutturati e organizzati alla quale accedono diversi utenti da differenti applicazioni.
Nella gestione a database la situazione che si presenta schematicamente può essere rappresentata dal diagramma sottostante.

Nello schema si evidenzia il fatto che ogni utente interagisce con la base di dati tramite un’applicazione e tale applicazione passa le richieste dell’utente al DBMS che trasforma le richieste delle applicazioni di tipo logiche in operazioni di i/o tramite il sistema operativo sull’archivio fisico. In questo modo l’utente si disinteressa del tutto di quest’ultima gestione. Lo schema proposto non è l’unico possibile anche perché le applicazioni possono interagire fra di loro per scambiarsi dati. Tale scambio però avviene sempre passando attraverso il DBMS. Lo svantaggio di questo approccio risiede nel fatto che sull’elaboratore su cui girano le applicazioni deve essere presente il software di DBMS. Nella realizzazione invece di programmi diretti per la gestione degli archivi invece viene garantita una buona portabilità da elaboratori differenti a sistemi differenti mentre però la flessibilità ovvero la possibilità di modificare parte del programma comporta un grosso sforzo in termini d tempo e di ridefinizione delle strutture dati. Le peculiarità principali di un DBMS e quindi dei database che essi gestiscono sono:

  1. Garantisce l’integrità dei dati, la consistenza, e elimina la ridondanza degli stessi
  2. Gestisce in modo sicuro gli accessi contemporanei ai dati
  3. Gestisce le utenze in livelli di credenziali
  4. Permette all’utente di eliminare le ridondanze
  5. Facilità la gestione di archivi distribuiti
  6. Permette la realizzazione di basi dati relazionali

Per ridondanza si intende la duplicazione di dati in più parti dell’archivio ad esempio se si deve gestire l’archivio degli elettori di un comune in questo archivio possono essere presenti i dati anagrafici degli stessi che però sono anche ripetuti nell’archivio anagrafico del comune. Eliminare le ridondanze non significa però cancellare del tutto i dati duplicati ma tenere solo quelli strettamente necessari. Per eliminare queste ridondanze nel database si ricorre alla creazione di relazioni fra le grandezze informative in gioco. La consistenza è la caratteristica che garantisce ai dati che si propagano nelle varie grandezze informative di avere lo stesso valore. L’integrità nei database garantisce che i dati che sono inseriti all’inertno degli archivi sono coerenti ad esempio nell’inserimento di campi obbligatori e nel corretto formato degli stessi.
La gestione sicura dell’accesso ai dati riguarda la protezione dei dati. In generale non è possibile effettuare delle modifiche contemporanee ai dati e quindi il DBMS implementa dei meccanismi di protezione dell’accesso in scrittura sui dati inserendo durante un operazione di scrittura il bit di locking un valore che indica ad altre applicazione che vogliono nello stesso momento accedere agli stessi dati che è possibile effettuare solo operazioni di lettura.
La gestione degli utenti attraverso un sistema di credenziali indica diversi livelli di accesso al database infatti si definiscono gli utenti amministratori che creano e modificano i permessi degli utenti del livello inferiore, modificano le strutture dei dati, dei database nello specifico, effettuano operazioni di backup (copia di sicurezza), ecc.

Fasi di progettazione di un Database (Modellazione dei Dati)

Per poter progettare e realizzare concretamente un Database si deve prima realizzare la modellazione dei dati che si vuole gestire e poi scegliere un software DBMS che consenta di tradurre in procedure e applicativi la gestione e la realizzazione del modello proposto. All’uopo si deve dire che la modellazione dei dati passa attraverso tre passi:

  • Progettazione concettuale o esterna in questa fase chi deve organizzare il database e realizzarlo esegue un’indagine sulle informazioni che dovrà contenere il database e quali saranno le funzioni richieste. In questa fase si deve avvalere della collaborazione dei lavoratori dell’azienda che decide di realizzare il database e di tutti i settori coinvolti. Il progettista organizza il modello secondo contenuti informativi e sceglie uno dei modelli concettuali, Di modelli concettuali ne esistono alcuni i più importanti sono il modello Entità-Relazioni,
  • Progettazione logica in questa fase si deve decidere la realizzazione logica del modello concettuale creato in precedenza e si realizzano e si costruiscono le tabelle che conterranno le informazioni secondo i contenuti informativi descritti nella fase concettuale; Inoltre qui si definiscono le relazioni logiche fra i dati e i vincoli di integrità a cui essi devono soddisfare.La progettazione logica può prevedere anche l’aoozione di altri modelli quali il modello gerarchico, il modello reticolare e il modello a grafi che a breve illustreremo.
  • Nella progettazione fisica si deicde la dislocazione della base di dati, la sua distribuibità e i supporti di memorizzazione richiesti.

Modelli Logici

In ogni modello è opportuno definire le grandezze informative in gioco e le relazione che intercorrono fra esse evidenziando anche il significato della relaziioe..

Modello Gerarchico

In questo modello si assegna una gerarchia alle grandezze informative in gioco organizzandola  in una struttura ad albero in cui ogni grandezza informativa che chiameremo d’ora in poi entità può accedere alle informazioni dei livelli sottostanti ma non di quelle sopra di esse. Un esempio è rappresentato dallo schema sottostante.

In questo esempio si vuole evidenziare l’organizzazione del patrimonio informativo di un’azienda. Ogni grandezza informativa ad esempio il Dipartimento Tecnico accede alle informazioni del settore Produzione e Progettazione ma non alle informazioni dell’Azienda (livello superiore potrebbero essere i dati sulle vendite, sul personale ecc.). In questo modo le applicazioni e il Database che ne scaturisce da questo modello sarà molto vincolato alla non comunicazione ( o non accesso) alle informazioni dei livelli superiori.

Modello a grafo

In questo modello logico  le informazioni sono collegate attraverso delle relazioni di dipendenza con percorso obbligato. In altri termini le informazioni sono organizzate in strutture a lista dove ciascun elemento può accedere all’elemento precedente e successivo della lista ma non a quello di altra lista. Tale modello si presta bene per la realizzazioni di viste specifiche sui dati. Un esempio è riportato nello schema sottostante.

In questo esempio si vogliono organizzare le informazioni relative ai cantanti e ai loro dischi con un criterio di raggruppamento dei cantanti per casa discografica. Ogni rettangolo rappresentano dati sulle case discografiche, i loro cantanti e i dischi che hanno inciso e quindi venduto. In questo modello a grafo la casa discografica consulta i dati dei cantanti e dei loro dischi secondo una struttura a lista ovvero una volta scelto un cantante potrò visualizzare solo i dati dei dischi che esso ha prodotto.

Modello Relazionale

Il modello logico più utilizzato è il modello relazionale implementato nella maggior parte dei DBMS moderni.
I concetti fondamentali sono legati ad un aspetto fondamentale che fu ideato e progettato da Edgar Cood nel 1970. Cood ha ideato un modello logico basato su tabelle. Le tabelle hanno delle caratteristiche precise derivate dal modello Entità Relazionale con delle regole rigorose.
Le regole di Cood consentono, la derivazione a partire da qualunque modello Entità Relazioni del modello logico.
Enunciamo le regole di Cood per derivare il modello relazionale:

  • Regola 0: un sistema è definito relazionale quando il
    RDBMS, la gestione delle basi di dati è relazionale.
  • Regola 1: Le informazioni sono rappresentate sotto forma di tabelle, costituite da righe e colonne che rappresentano le informazioni.
  • Regola 2:Tutti i dati devono essere accessibili senza ambiguità. Ogni riga della tabella deve essere individuata mediante un attributo o insieme di attributi che identificano univocamente un’istanza sulla tabella.
    E’ definito il concetto di chiave primaria
  • Regola 4 Trattamento dei valori NULL: il DBMS deve consentire la gestione in modo corretto dei valori NULL o vuoti nei campi. Inoltre deve gestire nello stesso modo sia le informazioni mancanti o isolate. Deve gestire i valori dei campi distinti da ogni valore consentito.
  • Regola 5 dizionario del modello relazionale: la descrizione degli oggetti che compongono il database deve avvenire a livello logico. Il linguaggio utilizzato per gestire il database deve utilizzare matadati identici per ogni utente. Il dizionario deve essere unico per tutti gli utenti, cambiano solo gli oggetti del database,
  • Regola 6 Tutti i dati devono essere accessibili mediante un linguaggio relazionale, come SQL.
    In particolare deve supportare: istruzioni di creazione e definizione delle strutture dati e della loro manipolazione. Deve essere possibile utilizzare tale linguaggio in modo interattivo che nelle applicaizoni
    Deve inoltre possedere una sintassi lineare, ovvero una semantica delle frasi che possa essere interpretata in modo unico dal DBMS.
  • Regola 7 aggiornamento delle viste di dati: le viste sono tabelle virtuali per dare ai dati una visualizzazione (vista) secondo dei criteri prefissati dal progettista. Ogni aggiornamento effettivo alle tabelle deve propagare il suo effetto anche alle viste.
  • Regola 8 manipolazione ad alto livello: Da un database deve essere possibile reperire i dati da più righe e tabelle, e le stesse informazioni devono essere poter essere inserite, modificate e cancellate.
  • Regola 9 indipendenza dalla struttura fisica: il Database a livello logico deve essere indipendente dalla struttura fisica e dall’organizzazione fisica dei dati stessi.
  • Regola 10 indipendenza della struttura logica: le componenti logiche del database dal punto di vista logico devono essere modificate in modo indipendente dalla struttura fisica dei dati e della relativa memorizzazione.
  • Regola 11 I vincoli logici dei dati devono essere memorizzati nel database: le relazioni, i vincoli di dominio, le regole di sicurezza di accesso alla base di dati devono essere definite all’interno del daatbase stesso.
  • Regola 12 indipendenza di localizzazione: il database o porzioni di essa possono essere memorizzati in locazioni diverse anche geograficamente distanti, ma devono essere invisibili all’utente.
  • Regola 13 regola di non sovversione: Gli strumenti di accesso ai dati non devono poter annullare le restrizione sul database. pur potendo aggiornare, modificare vincoli, relazioni.

    In sintesi alcune indicazioni sintetiche delle regole di Cood indicano la procedura operativa per creare a partire da un modello concettuale entità – relazioni, del modello relazionale.
    La procedura è così riassunta:
    ad ogni entità corrisponde una tabella denominata relazione che è composta da un numero di colonne pari al numerop delle colonne. Le associazioni fra le Entità sono definite mediante le chiavi esterne che devono essere inserite nella tabella che deriva da una entità che ha il ruolo N nell’associazione.
    Ogni tabella deve possedere una chiave primaria.
    Su queste semplici regole è possibile ottenere il modello relazionale.

Caso di studio

Definire un modello Entità Relazioni e in seguito un modello relazionale per il seguente problema: gestione dei versamenti eseguiti da un’azienda ai dipendenti, ai fornitori, ed altri enti (agenzia fiscale, previdenziale, ecc.).
Le entità che possono essere definite sono: Azienda, Dipendente, Versamento.
Le associazioni sono: Azienda lavora Dipendente (1,N), Azienda esegue Versamento (N,M).
Graficamente il Modello Entità Relazioni è:

Questo è un primo modello Entità Relazioni, che deve essere semplificato.
In questa prima versione del modello Entità – Relazioni è evidenziata l’associazione M a N, è opportuna una semplificazione di tale modello.
Il nuovo modello E-R prevede un’entità di passaggio che decompone l’associazione M a N in modo da semplificare la gestione. La nuova Entità la chiameremo “Tipologia Versamento” e conterrà l’attributo “tiplogia_versamento” chiave primaria, la partita iva (p_iva) dell’azienda che può effettuare più versamenti della stessa tipologia. Ad esempio per ogni dipendente ogni mese l’azienda deve versare i contributi, le tasse con dati diversi ma della stessa tipologia.
Il modello E-R è sotto riportato nello schema.

Lo schema E-R sopra è completo con gli attributi; la sigla (PK) indica che l’attributo è chiave primaria, la sigla (FK) indica che l’attributo è chiave esterna.
Adottiamo ora le regole di derivazione per arrivare al modello relazionale. Ad ogni entità corrisponde una relazione (Tabella) che contiene un numero di colonne pari al numero degli attributi dell’entità, più tante colonne quante sono le chiavi esterne previste nella progettazione.
In sintesi:
Relazione (Dipendente)

Nome CampoTipoDimensioneSpeciale
codice_fiscalechar16 byte a lunghezza fissachiave primaria
nomevarchar30 byte a lunghezza variabilenon nullo
cognomevarchar30 byte a lunghezza variabilenon nullo
data_nascitadataformato gg/mm/aaaa 10 bytenon nullo
luogo_nascitavarchar50 byte a lunghezza variabilenon nullo
data_assunzionedataformato gg/mm/aaaanon nullo
p_ivachar11 byte a lunghezza fissachiave esterna

La relazione (tabella) azienda

Nome CampoTipo CampoDimensioneSpeciale
partiva_ivachar11 byte a lunghezza fissachiave primaria
ragione_socialevarchar50 byte a lunghezza variabilenon nullo
indirizzovarchar50 byte a lunghezza variabilenon nullo
settorecvarchar50 byte a lunghezza variabilenon nullo

passiamo alla relazione (tabella) tipologia_versamento

Nome CampoTipo CampoDimensioneSpeciale
p_ivachar11 byte a lunghezza fissachiave esterna
tipologia_versamnetochar5 byte a lunghezza fissachiave primaria

L’ultima relazione è lasciata per esercizio.

Esercizio con funzione che ritorna una struct

Introduzione

Problema

Realizzare un programma in C++ che dopo aver caricato un array di N elementi con N inserito da tastiera, calcoli la somma degli elementi di posto pari e di posto dispari. 
Realizzare una funzione C++ che rittorni una struct.

Le struct in C++/C sono molto utili quando occorre far tornare tipi di dati differenti da una funzione. Una funzione è un sottoprogramma che ritorna un valore, ma in senso più generalizzato può far ritornare anche una struttura un arraym una struct. 

Nell’esempio sotto riportato  è stata definita una funzione che calcola le somme come richeisto dal problema e ritorna una  struct contenente i valori calcolati nella stessa. 

La codifica C++ è:

#include <iostream>
using namespace std;
struct numeri
{
int x;
int y;
};
void carica(int x[],int l);
struct numeri calcola(int x[],int l);
int main ()
{
struct numeri num;
int n;
int a[100];
cout << "\n Inserici la dimensione del vettore\n";
cin >> n;
carica(a,n);
num=calcola(a,n);
cout << "\nLa somma dei pari è "<< num.x << endl;
cout << "La somma dei dispari è " << num.y << endl;
cout << endl;
}
void carica(int x[],int l)
{
int k;
for (k=0;k<l;k++)
{
cout << "\n Inserisci gli elementi\n";
cin >> x[k];
}
}
struct numeri calcola(int x[],int l)
{
struct numeri tmp;
int k;
tmp.x=0;
tmp.y=0;
for (k=0;k<l;k++)
{
if ((k+1)%2==0)
tmp.x=tmp.x+x[k];
else
tmp.y=tmp.y+x[k];
}
return tmp;
}

Esercitazione sugli array in C++ e le funzioni

Introduzione

Scrivere un programma che presenti  un menu a video che permetta all’utente di eseguire le operazioni su un array di interi e dimensione richiesta in input.
Le operazioni sono: caricamento  array, ricerca e verifica se un valore inserito da tastiera è presente nell’array, ordinamento per selezione, e stampa dell’array.
Attraverso il menu di scelta l’utente può interrompere  il programma.

Codifica in C++

#include <iostream>
using namespace std;
void carica(int x[],int l);
void stampa(int x[],int l);
bool cerca(int x[],int l, int y);
void ordina(int x[],int l);
int main ()
{
int a[100];
int incognito;
int n;
int scelta;
while (1)
{
cout << "\n Menù Scelta\n";
cout << "\n 1- Caricamento Vettore\n";
cout << "\n 2- Ricerca elemento nell'array\n";
cout << "\n 3- Ordina \n";
cout << "\n 4- Stampa\n";
cout << "\n 5- Fine";
do {
cout << "\nInserisci la tua scelta\n";
cin >> scelta;
if ((scelta<1)||(scelta>5))
cout << "\n Scelta errata ripeti \n";
}
while ((scelta<1)||(scelta>5));
switch (scelta) {
case 1: {
cout << "inserisci la dimensione dell'arry\n";
cin >> n;
carica(a,n);
break;
}
case 2: {
cout << "\n Inserisci l'elemento incognito\n";
cin >> incognito;
if (cerca(a,n,incognito))
cout <<"\n Elemento trovato\n";
else
cout << "\n Elemento non trovato\n";
break;
}
case 3: {
cout << "\n Ordinamento array\n";
ordina(a,n);
cout << "\n---------\n";
stampa(a,n);
break;
}
case 4:{
cout << "\n Stampa elementi dell'array\n";
stampa(a,n);
break;
}
case 5:
{
cout << "\n Fine programma arriderci\n";
return 0;
}
}
}
}
void carica(int x[],int l)
{
int k;
for (k=0;k<l;k++)
{
cout << "\n Inserisci gli elementi\n";
cin >> x[k];
}
}
void stampa(int x[],int l)
{
int k;
for (k=0;k<l;k++)
{
cout << "\n Elementi dell'array'\t";
cout << x[k];
}
cout << endl;
}
bool cerca(int x[],int l, int y)
{
// Ricerca sequenziale
bool trovato=false;
int k;
for (k=0;k<l;k++)
{
if (x[k]==y)
trovato=true;
}
return trovato;
}
void ordina(int x[],int l)
{
// Ordinamento per selezione crescente
int k,j;
int tmp;
for (k=0;k<l-1;k++)
for (j=k+1;j<l;j++)
if (x[k]>x[j])
{
tmp=x[k];
x[k]=x[j];
x[j]=tmp;
}
}

 

Esercitazione sui numeri casuali in C

Esercitazione in C sui numeri casuali

Problema 

Immaginiamo di voler simulare il lancio di  un dato e verificare se l’utente ha vinto la partita. 
Ad esempio l’utente effettua una puntata, se il numeor è <=3 ha perso, se il punteggio è 4 e 5 vince due volte la puntata, se il punteggio è 6 vince quattro volte la puntata

Ecco la semplice codifica in C

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int x;
float importo;
float vincita;
vincita=0;
printf("\n Inserisci un importo\n");
scanf("%f",&importo);
srand(time(NULL));
x= rand()%6+1;
printf("\n Numero Estratto %d\n",x);
if (x<3)
printf("\n Hai perso\n");
if ((x==4)||(x==5))
{
vincita=importo*2;
printf("\n Hai vinto %f",vincita);
}
if (x==6)
{
vincita=importo*4;
printf ("\n Hai vinto %f",vincita);
}
return 0;
}