SCUOLA INTERUNIVERSITARIA SICILIANA
DI SPECIALIZZAZIONE PER
L’INSEGNAMENTO SECONDARIO
Classe di Concorso: 42A
Michele Brischetto
Unità didattica 3: Normalizzazione delle relazioni e
Gestione dei database
Docente: Prof. Cantone
Prerequisiti
Gli studenti devono conoscere:
1. Nozioni
associazione
di
entità,
attributo,
chiave,
2. Il modello E/R e le regole di derivazione del
modello logico
Competenze
1. Definire relazioni normalizzate a partire da
relazioni non in forma normale
2. Applicare le regole di integrità referenziale
3. Sapere cosa è un software di gestione di database
(DBMS)
4. Conoscere le caratteristiche principali di un
DBMS
Contenuti
1. Cosa è la normalizzazione
2. Le varie forme normali
3. L’integrità referenziale
4. Cosa è, e cosa fa un
DBMS
5. I linguaggi per database
Metodologie
Lezione frontale
Lezione dialogata
“Brainstorming”
Spazi
Aula
Laboratorio
Strumenti
Libro di testo e dispense
Computer
Proiettore
Verifiche
Periodiche e costanti, tese sia alla valutazione
globale del percorso formativo che ad una sua parte.
Vengono usate le seguenti tipologie:

Colloqui individuali

Interventi di vario genere

Questionari e Test

Prove in laboratorio
Valutazione
La valutazione sarà di due tipi:

Di tipo formativo (in relazione all’applicazione,
all’impegno, all’attenzione, al metodo di lavoro
dimostrato da ogni studente durante l’attività
didattica, e alla capacità di lavorare assieme agli
altri)

Di tipo sommativo (ricavata dalla misurazione delle
varie prove), in cui gli studenti dovranno dimostrare
di:
 avere acquisito conoscenze e informazioni
circa i contenuti
 avere maturato abilità e competenze specifiche
alla disciplina
Tempi
Lezione in
aula
Laboratorio
Verifica
Recupero e/o
Potenziamento
12 ore
8 ore
4 ore
6 ore
La normalizzazione
Obiettivi della normalizzazione:
evitare la ripetizione e la ridondanza dei dati, durante la fase di
definizione della struttura di una tabella, al fine di evitare futuri
problemi nelle successive fasi di trattamento della tabella stessa,
tramite operazioni di modifica o cancellazione di record in essa
contenuti.
In pratica:
Si tratta di un insieme di operazioni, tramite le quali, a partire da
una data tabella (non normalizzata), vengono create nuove tabelle,
seguendo opportune regole, che trasformano la tabella originaria,
in altre tabelle.
In ogni caso deve essere garantito che la trasformazione di una
tabella in altre tabelle di forma normale superiore non provochi
la perdita di informazioni.
Concetti chiave:
• chiave o chiave primaria : è un insieme di uno o più attributi che
identificano in modo univoco un record della tabella.
• Chiave candidata : è un in insieme di uno o più attributi che
possono svolgere la funzione di chiave (ci possono essere diverse
chiavi candidate, ma una sola chiave primaria).
• Attributo non chiave : è un campo della tabella che non fa parte
della chiave primaria.
• Dipendenza funzionale : indica il fatto che il valore di un attributo
A1 determina il valore di un altro attributo A2, e si indica con
A1
A2 (A1è un determinante per A2)
• Dipendenza transitiva : si ha quando un attributo A2 dipende da
un attributo A1, e l’attributo A3 dipende da A2, cioè:
se A1
A2 e A2
A3 allora A1
A3 in modo transitivo.
Prima forma normale
Una tabella è in 1FN se rispetta i requisiti fondamentali del modello
relazionale cioè:
• Tutte le righe della tabella contengono lo stesso numero di colonne
• Gli attributi rappresentano informazioni elementari
• I valori che compaiono in una colonna sono dello stesso tipo, cioè
appartengono allo stesso dominio
• Non ci devono essere due righe con gli stessi valori nelle colonne
Esempio di entità non normalizzata
Dipendenti
Matricola
Nome
Indirizzo
Familiari a carico
L’attributo Familiari a carico non è elementare in quanto è
costituito da un gruppo di attributi ripetuti dello stesso tipo
(i nomi dei familiari dell’ i- esimo dipendente).
Tabelle normalizzate in 1FN
Soluzione: la tabella precedente viene scissa nella seguenti due tabelle
Dipendenti
Matricola
Nome
Familiari
Indirizzo
CodiceFam
NomeFam
MatricolaDip
Vantaggi: * Abbiamo 2 elementi distinti che rappresentano meglio
la realtà. Inoltre è più facile aggiungere nuovi attributi.
* Risultano semplificate le operazioni di inserimento,
cancellazione e modifica.
Seconda forma normale
Una tabella è in 2FN quando è in 1FN e tutti i suoi attributi
non chiave dipendono unicamente dall’ intera chiave, cioè
non possiede attributi che dipendono soltanto da una parte
della chiave.
La seconda forma normale elimina la dipendenza parziale degli
attributi dalla chiave e riguarda il caso di tabelle con chiavi
composte, cioè formate da più attributi.
Es: si abbia un inventario di merci, le quali si trovano in
alcuni magazzini dislocati in località diverse. Le informazioni
essenziali possono essere rappresentate con la seguente tabella:
Merci
Codice
Magazzino
Quantità
LocalitàMagazzino
Osservazioni:
• la chiave è composta, in quanto il solo codice non basta per identificare
la merce, la quale può essere presente in magazzini diversi.
• l’indirizzo del magazzino riguarda solo l’attributo Magazzino, quindi l’attributo
“LocalitàMagazzino” dipende solo da una parte della chiave.
La tabella non è quindi in 2FN
La tabella vista prima non è in seconda forma normale
e ciò può provocare problemi di questo genere:
 La località del magazzino è ripetuta per tutte le righe della tabella
che si riferiscono a prodotti presenti in quel magazzino;
 se la località del magazzino cambia, ogni riga contenente merci
presenti in quel magazzino dovrà essere aggiornata;
 La ridondanza può provocare l'inconsistenza delle informazioni
perche la località potrebbe essere scritta in modo differente in
righe diverse per lo stesso magazzino, oppure perché potrebbe
accadere che alcuni record vengano aggiornati ed altri no;
 Se in un certo periodo non ci fossero merci presenti in un
magazzino, non avremmo alcuna informazione sulla località del
magazzino. La cancellazione di righe potrebbe quindi determinare
una perdita complessiva di informazioni nella base di dati.
Risoluzione del problema:
La soluzione consiste nel costruire nuove tabelle, a partire dalla
tabella non normalizzata, togliendo dalla tabella di partenza
gli attributi che dipendono solo parzialmente dalla chiave primaria.
Es: nel caso precedente otterremo:
Merci
Codice
Depositi
Magazzino
Quantità
Magazzino
Queste due tabelle sono in 2FN
LocalitàMagazzino
Formalizzazione del passaggio in 2FN
Data la tabella R1 (A1,A2,A3,A4,A5)
in cui (A1,A2)
A3 , A1
A4, A2
A5
essa non è in 2FN. ma può essere trasformata nelle seguenti tabelle
in 2FN:
R21(A1,A2,A3)
R22(A1,A4)
R23(A2,A5)
Osservazioni:
Il processo di normalizzazione diminuisce la ridondanza dei dati
e la possibilità di inconsistenze, ma rende più complesse le operazioni di
ritrovamento dei dati.
Es: supponiamo di volere conoscere la località del magazzino
dove è presente una merce di cui si conosce il codice.
Nella tabella non normalizzata basterà esaminare solo le sue righe, mentre
nella tabella in seconda forma normale occorre congiungere le righe delle
due tabelle ottenute dal processo di normalizzazione, secondo l'attributo
comune Magazzino.
La normalizzazione quindi è importante nel modello di un database perché
l'integrità e la consistenza dei dati sono prioritarie rispetto alla velocità di
ritrovamento dei dati, che rimane comunque un fattore essenziale.
Terza forma normale
Una relazione è in terza forma normale (3FN) quando è in
seconda forma normale e tutti gli attributi non-chiave dipendono
direttamente dalla chiave, cioè non possiede attributi non-chiave
che dipendono da altri attributi non-chiave. La terza forma normale
elimina quindi la dipendenza transitiva degli attributi dalla chiave.
Es: si consideri la gestione anagrafica di un'associazione
di studenti di scuole diverse. Le informazioni più importanti siano
rappresentate con la seguente tabella:
Studenti
Nome
Scuola
TelefonoScuola
Osservazioni:
Il nome è l'attributo chiave, e il telefono della scuola, pur essendo un’informazione
che riguarda lo studente, dipende però dalla scuola cui lo studente è iscritto.
Nella tabella è quindi presente un attributo non-chiave (TelefonoScuola) che dipende
da un altro attributo non-chiave (Scuola). La tabella non è in terza forma normale
in quanto l'attributo TelefonoScuola dipende solo transitivamente dalla chiave (Nome).
Possibili anomalie
 il telefono di una scuola sarà ripetuto per ogni studente
appartenente a quella scuola;
 se il telefono di una scuola cambia, occorrerà modificare tutte le
righe contenenti studenti di quella scuola;
 la ridondanza può provocare inconsistenza, in quanto ci
potrebbero essere numeri di telefono differenti, in righe diverse,
per la stessa scuola, nel caso in cui questi siano stati scritti in
modo diverso, oppure l'aggiornamento non sia stato fatto su tutte
le righe;
 se una scuola non ha nessuno studente appartenente
all'associazione, oppure gli studenti iscritti di una scuola escono
tutti dall'associazione, non potremmo avere alcuna informazione
sul telefono della scuola, con una conseguente perdita di
informazioni.
Risoluzione del problema:
La normalizzazione in 3FN si ottiene scomponendo la tabella
di partenza in nuove tabelle, nelle quali tutti gli attributi
dipendono unicamente e direttamente dalla chiave, togliendo gli
attributi non-chiave che dipendono da un altro attributo non-chiave.
Es: nel caso precedente otterremo:
Studenti
Nome
Istituti
Scuola
Scuola
Queste due tabelle sono in 3FN
TelefonoScuola
Formalizzazione del passaggio in 3FN
Data la tabella R1 (A1,A2,A3,A4)
in cui:
A1
A2 e A2
A4
essa non è in 3FN. ma può essere trasformata nelle seguenti tabelle
in 3FN:
R21(A1,A2,A3)
R22(A2,A4)
Osservazioni : anche qui la tabella iniziale è stata scomposta in più tabelle che,
complessivamente, forniscono le stesse informazioni di partenza e mantengono le
dipendenze tra gli attributi, ma in maniera che, in ciascuna di esse, ogni attributo
dipenda direttamente dalla chiave. Vengono così evitati problemi di ridondanza e
di inconsistenza dei dati.
Nella scomposizione non si dovrà però avere perdita di informazioni.
I dati possono poi essere ritrovati attraverso operazioni di congiunzione tra le
tabelle tramite gli attributi comuni.
Forma normale di Boyce-Codd
Una tabella è in forma normale di Boyce-Codd (BCNF) quando è
in seconda forma normale e in essa, ogni attributo dal quale
dipendono altri attributi può svolgere la funzione di chiave.
Es1: si prenda in considerazione la gestione degli esami specialistici
svolti in una clinica e si supponga che nella clinica più specialisti
possano svolgere lo stesso tipo di esame. Gli esami siano identificati
attraverso un Codice Esame che è diverso per ogni specialista, in
modo da distinguere tra loro i medici specialisti che svolgono lo
stesso tipo di esame.
Le informazioni essenziali sono rappresentate nella seguente tabella:
Esami
CodiceEsame
Descrizione
MedicoSpecialista
Osservazioni
Codice Esame è un determinante per Descrizione e per MedicoSpecialista;
Descrizione è però anche un determinante per MedicoSpecialista, infatti
ad una Descrizione possiamo associare il medico che effettua quel tipo di esame,
ma non è una chiave candidata. Infatti consideriamo le seguenti tabelle:
Esami
CodiceEsame
Medici
Descrizione
Descrizione
MedicoSpecialista
Nella seconda tabella potremmo avere più righe con lo stesso valore per l'attributo
Descrizione che non può quindi diventare chiave.
Con ciò possiamo concludere dicendo che la tabella di partenza è in terza forma
normale, ma non è in forma normale di Boyce-Codd.
Esempio di tabella in forma normale di Boyce-Codd:
si consideri la tabella che descrive il prezzo degli esami svolti nella clinica:
Pagamenti
CodiceEsame
Descrizione
Ticket
CodiceEsame è determinante per Descrizione e Ticket; Descrizione è determinante per
Ticket. Descrizione inoltre è una chiave candidata: infatti ad una stessa descrizione
corrisponde lo stesso ticket. La relazione è in forma normale di Boyce-Codd e si
possono ottenere due nuove relazioni:
Esami
CodiceEsame
Descrizione
Pagamenti
Descrizione
Ticket
Stavolta nella seconda tabella Descrizione è un campo chiave ed elimina problemi in
fase di aggiornamento: quando varia il valore del ticket di un esame basta modificare
una sola riga nella tabella Pagamenti, anziché molte righe nella tabelle originaria.
L’esempio presentato dimostra che una relazione in forma normale di Boyce-Codd è
anche in terza forma normale, ma non è vero il viceversa.
L’integrità referenziale
Nella definizione dei concetti fondamentali del modello relazionale,
oltre alla regola di “integrità sull'entità”, che non consente valori nulli
per la chiave, esiste una seconda regola di integrità, detta
di “integrità referenziale”.
L’integrità referenziale è un insieme di regole del modello relazionale
che garantiscono l'integrità dei dati quando si hanno relazioni associate
tra loro attraverso la chiave esterna: queste regole servono per rendere
valide le associazioni tra le tabelle e per eliminare gli errori di
inserimento, cancellazione o modifica di dati collegati tra loro.
L’integrità referenziale viene rispettata quando per ogni valore non
nullo della chiave esterna, esiste un valore corrispondente della chiave
primaria nella tabella associata.
Es: si consideri un database relazionale che contiene una tabella dei
clienti e una tabella degli ordini, in cui il codice del cliente della tabella
Ordini è associato alla chiave della tabella Clienti:
Clienti
Codice
Ordini
Nome
Indirizzo
NumOrdine
Data
CodCliente
Applicare l'integrità referenziale al database significa garantire che un valore
presente nella tabella Ordini per la chiave esterna CodCliente abbia un
corrispondente valoredi Codice in una delle righe della tabella Clienti. Inoltre non
si deve consentire la cancellazione di un cliente dalla tabella Clienti se ci sono
righe nella tabella Ordini che siriferiscono ad esso.
Formulazione generale del concetto di integrità
referenziale
In generale data una tabella R1 avente come chiave l'attributo Kl e una tabella R2
avente come chiave esterna KE2 associata a Kl, le regole dell'integrità referenziale
impongono che ogni valore di KE2 deve avere un valore uguale di Kl in una delle righe
della tabella Rl, oppure il valore di KE2 deve essere nullo.
K1
A1
A2
A3
K2
B1
B2
B3
KE2
Quando viene applicata l'integrità referenziale, è necessario osservare
le seguenti regole pratiche:
 non è possibile immettere un valore nella chiave esterna della tabella associata,
se tale valore non esiste tra le chiavi della tabella primaria. È possibile, comunque,
immettere un valore nullo nella chiave esterna, per rappresentare il fatto che le
righe non sono correlate. Per esempio un ordine non può essere assegnato ad un
cliente che non esiste nella tabella Clienti.
 non è possibile eliminare una riga dalla tabella primaria, se esistono righe legate ad
essa attraverso la chiave esterna nella tabella correlata. Per esempio non è possibile
eliminare un cliente dalla tabella Clienti se ci sono ordini assegnati a quel cliente
nella tabella Ordini.
 inoltre non si può modificare, come è ovvio, il valore alla chiave nella tabella
primaria, se ad essa corrispondono righe nella tabella correlata. Per esempio non
è possibile modificare il valore alla chiave di un cliente se ci sono ordini per quel
cliente già registrati nella tabella Ordini.
Osservazioni sul modello relazionale I/II
 Il modello relazionale risulta essere più intuitivo e più espressivo per la strutturazione
dei dati, rispetto ai modelli gerarchico e reticolare.
 La teoria dei database relazionali è costruita a partire da sicuri fondamenti matematici
e utilizza un linguaggio rigoroso: questo consente di sviluppare definizioni, teoremi e
dimostrazioni.
 Dal punto di vista informatico presenta una grande semplicità nell'uso e nell’ implementazione, anche se è 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.
 Il trattamento dei dati avviene per gruppi di record, anziché per singoli record, come
avviene nelle organizzazioni convenzionali degli archivi.
 Il ritrovamento delle informazioni viene realizzato operando sulle righe e sulle
colonne delle tabelle, con gli operatori di selezione, proiezione e congiunzione.
 Le operazioni sulle tabelle producono nuove tabelle, alle quali si possono ulteriormente applicare gli operatori.
 Non è necessario specificare la sequenza del percorso che deve essere seguito per
accedere ai dati contenuti nel database, mentre i modelli gerarchico e reticolare sono
strettamente condizionati dal tipo di cammino insito nella struttura dei dati.
Osservazioni sul modello relazionale II/II
 L'ordine con il quale le righe compaiono nella tabella è ininfluente.
 Il modello relazionale ha portato poi benefici nel lavoro di progettazione dei
database: il progettista di un database può infatti costruire il modello dei dati
considerando con attenzione le entità, le associazioni e le dipendenze tra gli attributi
nel modello della realtà.
 Il passaggio dal modello concettuale al modello logico può essere realizzato con
semplici regole.
 Occorre cercare un livello equilibrato di normalizzazione, per evitare di appesantire
la fase di ritrovamento dei dati con un numero eccessivo di operazioni di
congiunzione tra le tabelle.
La gestione del database I/III
Il DBMS (Database Management System) è il software che consente di costruire e
gestire una base di dati, a partire da un progetto e da uno schema dei dati definiti a
livello concettuale e tradotto poi in un modello logico dei dati.
Il DBMS costituisce quindi un'interfaccia tra gli utenti di un database con le loro applicazioni e le risorse costituite dall'hardware e dagli archivi di dati presenti in un sistema
di elaborazione.Le sue funzioni principali sono:
 Implementazione del modello logico sul sistema di elaborazione, cioè:
1: la definizione dei dati e delle strutture dati derivate dallo schema logico
(tipicamente le tabelle del modello relazionale). con produzione della
documentazione sul modello;
2: definizione dei sottoschemi (viste), cioè visioni del database legate alle particolari
applicazioni dei singoli utenti e che consentono agli utenti di accedere ai dati che
servono, ottenute attraverso proiezioni o congiunzioni; Le viste sono finestre
dinamiche sulle tabelle del database, in quanto ogni modifica ai dati sulla
tabella primaria si riflette sulla vista e viceversa; )
3: organizzazione fisica dei dati sui supporti di memorizzazione, utilizzando le
tecniche che ottimizzano l'occupazione della memoria di massa e i tempi di
accesso alle registrazioni.
La gestione del database II/III
 Manipolazione e interrogazione sulla base di dati, cioè:
1: inserimento dei dati nel database e trattamento dei dati già registrati con
operazioni di modifica o cancellazione;
2: interfaccia tra i programmi degli utenti (scritti con i tradizionali linguaggi di
programmazione) e la base di dati, utilizzando le funzionalità del DBMS per
migliorare l'organizzazione dei dati e le prestazioni dei programmi nelle
operazioni di ritrovamento dei dati;
3: accesso ai dati contenuti nel database per le interrogazioni, attraverso interfacce
o comandi semplici che facilitano soprattutto l'utente finale non specialista.
 Controllo dell'integrità dei dati:
1: integrità sulle entità;
2: integrità referenziale:
3: integrità definite dall'utente. cioè vincoli che sono specifici per un particolare
database, come conseguenza di politiche commerciali dell'azienda oppure di
norne legislative e fiscali.
La gestione del database III/III
 Sicurezza e protezione:
1: garanzia di sicurezza dei dati contro i danni causati da malfunzionamenti di
componenti hardware o software o da interventi dolosi;
2: protezione dei dati da eventuali danneggiamenti per garantire l'integrità dei dati,
offrendo anche la possibilità di attivare procedure di recovery in caso di perdita
dei dati;
3: autorizzazione degli utenti che accedono alla base di dati e protezione dei dati
dagli accessi non autorizzati;
4: controllo degli accessi in modo concorrente al database da parte di più utenti.
Inoltre il DBMS si occupa della gestione del dizionario contenente le informazioni su:
• nomi delle tabelle e delle colonne.
• associazioni
• viste.
• vincoli di integrità.
• utenti e proprietari.
• autorizzazioni degli accessi.
Il dizionario contiene quindi i metadati, cioè i dati che descrivono i dati organizzati
nel database.
I linguaggi per database I/III
Le funzionalità del DBMS vengono attivate dall'utente usando appositi comandi, che
costituiscono a tutti gli effetti un linguaggio attraverso il quale l'utente può comunicare
con il sistema di elaborazione che gestisce il database.
I comandi che il DBMS mette a disposizione possono essere classificati nelle seguenti
categorie di linguaggi:
 linguaggio per la descrizione dei dati, delle tabelle e delle viste, detto DDL (Data
Definition Language).
 linguaggio detto DMCL (Device Media Control Language), cioè il linguaggio di
controllo dei supporti di memorizzazione dei dati.
 linguaggio per il trattamento (o manipolazione) dei dati contenuti nel database. detto
DML (Data Manipulation Language), che consente le usuali operazioni di accesso
per inserimenti. modifiche o cancellazioni.
 linguaggio per fissare i vincoli di integrità, per stabilire le autorizzazioni agli accessi
e i tipi di permessi consentiti agli utenti (inserimento di nuovi dati. sola lettura,
modifica dei dati). detto DCL (Data Control Language).
 linguaggio per le interrogazioni alla base di dati, detto Query Language, che
consente il ritrovamento dei dati che interessano, sulla base dei criteri di ricerca
richiesti dall'utente
I linguaggi per database II/III
La diffusione del modello relazionale ha poi favorito l'uso prevalente di linguaggi non
procedurali: in questo modo l'utente non ha la necessità di conoscere ne le modalità con
le quali le informazioni sono state fisicamente registrate, ne i cammini per ritrovare le
informazioni contenute nella base di dati. Le informazioni vengono ritrovate effettuando
interrogazioni e controllando il valore di verità di determinate condizioni, senza indicare
le operazioni necessarie per arrivare alle informazioni richieste.
Si parla allora di linguaggio per basi di dati, intendendo un insieme completo di comandi che consente e facilita le operazioni di definizione del database, di manipolazione dei
dati, e di interrogazione da parte degli utenti: vengono cioè unificate in un unico linguaggio le funzioni dei linguaggi DDL, DMCL, DML, DCL e Query Language
I linguaggi per database relazionali si basano sulla visione tabellare dei dati, che facilita
l'utente in quanto non contiene nessuna informazione sul percorso per l'accesso fisico
ai dati.
I linguaggi per database III/III
La formulazione delle richieste di dati viene quindi semplificata, perche l'utente viene
liberato dagli aspetti riguardanti la navigazione all'interno della base di dati.
I comandi del linguaggio relazionale operano inoltre su gruppi di righe o sull'intera
tabella, anziché su una riga per volta: con una sola richiesta possono essere trattati o
ritrovati molti record e non solo un record per volta, come avviene con i tradizionali
linguaggi di programmazione.
Esempi di DBMS : Access, Oracle, DB2, ecc…
Gli utenti I/II
Un database viene utilizzato da persone diverse, per funzioni e per applicazioni diverse:
 L'Amministratore della Base di Dati (DBA, Database Administrator),
con i seguenti compiti:
1. Implementazione del modello logico del database nel sistema di elaborazione sui
supporti fisici delle memorie di massa;
2. Gestione e trattamento dei dati (controllo di inserimenti, modifiche, cancellazioni);
3. Autorizzazione degli accessi;
4. Definizione delle viste per accessi parziali di utenti alla base di dati;
5. Controllo dei programmi applicativi che richiedono l'uso del database;
6. Manutenzione del database nel tempo, in termini di efficienza e di ottimizzazione
delle risorse;
7. Controllo sugli interventi di recupero, nel caso di cattivi funzionamenti, e sulle copie
di salvataggio periodiche;
8. Controllo della disponibilità degli spazi su memoria di massa.
Gli utenti II/II
 I programmatori, che intendono utilizzare per le loro applicazioni i dati organizzati
in un database, utilizzano un linguaggio DML, oppure comandi che sono un'estensione dei tradizionali linguaggi di programmazione, oppure un linguaggio specifico per
basi di dati.
 Gli utenti finali possono accedere alla base di dati attraverso i comandi di un
linguaggio di interrogazione (query language), oppure, per utenti finali ancora meno
esperti,attraverso interfacce software che presentano sul video un menù o icone.
Fine
Scarica

Seconda forma normale - Dipartimento di Matematica e Informatica