Corso di Access: creare un database per una videoteca
Creare un database di Access per una videoteca non è come fare una tabella in Excel.
Il processo è più complesso, e richiede una preparazione maggiore (preparazione che si può acquisire anche tramite questi esercizi guidati), ma in cambio si ottiene una maggiore flessibilità, personalizzazione e a volte anche la possibilità di far fare al computer cose che di solito si facevano a mano.
In questo mini-corso gli attori sono due: lo sviluppatore e il committente, che è quello che utilizzerà il programma.
I passaggi da compiere per creare un database sono cinque:
- Brainstorming
- Individuare oggetti e attributi
- Individuare relazioni tra gli oggetti
- Individuare le caratteristiche degli attributi
- Creare tabelle e relazioni
Parte uno: il brainstorming
Il primo passaggio è davvero alla portata di tutti, per farlo servono solo carta, penna e chili di cervello. Infatti il nome (brainstorming) significa proprio - letteralmente - "tempesta di cervello". Impressionante.
La domanda a cui rispondere è:
cosa viene in mente se dico "gestione videoteca"?
Curiosamente nella mia esperienza capita molto di rado che la prima cosa che viene in mente sia "film". Di solito le parole chiave individuate sono:
- noleggio
- tessera
- restituzione
- tempo per cui tieni il film
- ritardo
- regista
- attori
- durata
- genere
- se è piaciuto
- se è vietato ai minori
In questa fase si mescolano elementi fondamentali con altri di secondaria importanza o marginali. Inoltre la forma ("se è piaciuto" invece che "gradimento") è grezza e vicina al parlato.
Si può anche notare una vicinanza al punto di vista dell'utente, che si concentra sul fatto che è obbligato a restituire il film e paga una multa se ritarda, e sugli elementi che caratterizzano il film, senza essere in grado di identificare l'elemento "film" in sé.
Gli elementi successivi a una riflessione su questo sono:
- film
- costo
- penale per il ritardo
- film che ha già noleggiato
- nome del cliente
- documento del cliente
- numero della tessera
- riporta il dvd strisciato
A questo punto abbiamo abbastanza elementi per cercare di formalizzare un po' quello che si è detto. In questo momento non sono presenti tutti gli elementi (come vedremo), ma nei passaggi successivi riusciremo ad estrapolare tutti gli aspetti di questo "blocco logico".
Parte due: Individuare oggetti e attributi
Il secondo passaggio può essere sintetizzato in una domanda:
cosa è un oggetto e cosa può essere considerato solo attributo di un oggetto?
Noleggio: il noleggio è un oggetto a sé stante. È l'atto di noleggiare un film, e può avere come attributi
- restituzione
- ritardo
- penale per il ritardo
- data e ora del noleggio
- data e ora restituzione o tempo per cui il cliente ha tenuto il supporto
- identificativo del cliente o numero di tessera
- guasti / danni procurati
Il gradimento è una caratteristica che farebbe parte del noleggio, ma che esula dagli interessi del programma (è molto difficile ottenere sistematicamente un giudizio su un film da chi li noleggia!). Nulla vieta di personalizzare comunque il proprio database inserendo caratteristiche per tenere sotto osservazione il gradimento!
In questa fase si individuano anche due attributi abbastanza importanti:
chi è l'utente che noleggia il film e
qual è il film noleggiato.
Non tutto quello che si dice nel brainstorming va tenuto, anzi spesso va buttato via molto; questo fa parte del "gioco", e va accettato!
Tessera: la tessera è un oggetto a sé stante, e ha come attributi
- numero della tessera
- data emissione
- durata / data di scadenza

Va osservato che questo approccio, essendo più sistematico del primo, mette in luce anche aspetti che nella prima fase erano ignorati, come la durata e la data di scadenza, che si possono calcolare reciprocamente.
Regista: sembra un attributo del film, ma non lo è. La prova è il fatto che un regista può fare molti film!
Il regista ha i seguenti attributi:
- Nome
- Cognome
- Data di nascita
- Numero di scarpe
In questa fase si arriva al limite dell'analisi: occorre davvero conoscere TUTTI i dati di un regista? Tra le domande da fare al committente possiamo cominciare ad annotare questa: "cosa vuoi sapere di un regista? solo nome e cognome o anche altro?"
Attori: altro oggetto a sé stante, probabilmente si può utilizzare lo stesso schema dei registi.
{image src="/uploads/
CorsoAccessVideoteca/acc3.gif" alt="tabelle noleggi, tessere, registi e attori"}}
Durata: la durata è evidentemente un attributo dell'oggetto
film. Questo è uno dei casi in cui nella fase di brainstorming non è stato individuato un oggetto direttamente, ma tramite le sue caratteristiche. Quindi, gli attributi dell'oggetto film sono:
- Durata
- Genere
- Quale regista
- Quali attori
- è vietato ai minori
Il
costo del film apre un dibattito: c'è chi lo metterebbe nel noleggio, e chi contesta il fatto che un film costa una certa cifra indipendentemente da chi lo noleggia. In particolare, i DVD hanno un costo, le VHS un altro e in più ci può essere un sovrapprezzo per le novità.
Non c'è una risposta "giusta", o una "sbagliata": in questo caso ognuno fa come vuole (il suo committente).
Quindi sembra che il prezzo sia legato sia al supporto (concetto che non era ancora emerso) sia al fatto che il film sia "novità". Il supporto è un oggetto a sé stante, che non ha attributi se non il nome e il prezzo. Il fatto che un film sia "novità" spesso è dibattuto: è novità perché è presente un flag "novità" oppure perché sono passati un certo numero di mesi dall'uscita? O dall'inizio del noleggio?
Solitamente lascio decidere la questione agli studenti; anche per questo il database che alla fine è prodotto spesso è diverso da classe a classe.
Un altro aspetto non marginale che emerge è che la parola "film" ha due significati, che spesso, nel parlare comune, si accavallano.
Se dico "ho noleggiato un film" e "il regista di questo film è tizio" do un significato diverso alla parola "film".
Nel primo caso non noleggio un film, ma una videocassetta o un DVD che contiene un film, quindi "ho noleggiato un film" è un uso improprio della parola "film". Diventa tutto chiaro nel momento in cui si pensa ad uno scaffale pieno di DVD tutti con lo stesso film. Ci sono 30 DVD con un film solo!
Un concetto spesso non facile da capire è la differenza tra la forma astratta di un
oggetto e una sua
istanza. Un altro esempio può essere la differenza tra "telefono" e un'istanza di "telefono": un telefono è un modello di una marca, supporta un certo tipo di SIM e ha certe funzioni. Un'istanza dell'oggetto telefono (per es. il MIO telefono) ha una botta sul fianco sinistro, ha fatto 200 minuti di telefonate eccetera eccetera.
Quindi l'oggetto che abbiamo individuato è il
supporto.
Supporto ha i seguenti attributi:
- Tipo di supporto
- Codice a barre
- Film contenuto
- Difetti / danni

"Film che ha già noleggiato" porta dritti dritti alla domanda "chi?". Si individua la figura del
cliente, che ha come attributi:
- Nome
- Cognome
- Dati anagrafici vari
- Documento di identità
- Telefono
Passo tre: individuare relazioni tra oggetti
Di solito a questo punto sulla lavagna sono presenti sulla sinistra un elenco di voci raccolte durante il brainstorming, e a destra, in ordine sparso, una serie di rettangoli con un'intestazione che contiene il nome dell'oggetto e sotto la serie di attributi.
Il gioco ora consiste nell'unire con i bastoncini le tabelle tra loro.
Quando si individuano due oggetti che potrebbero essere in relazione, le domande da farsi sono due:
- Quanti oggetti A sono associati a ciascun oggetto B?
- Quanti oggetti B sono associati a ciascun oggetto A?
Per esempio quante tessere appartengono a una persona? Una; e quante persone sono associate a una tessera? Una.
Quindi la relazione tra tessere e persone è 1 a 1.
Per unire due tabelle in una relazione uno-a-uno bisogna associare due campi in cui ci sia il vincolo di unicità (cioè non ci possono essere due elementi con lo stesso valore per quel campo).
Per esempio si possono unire due
chiavi primarie, oppure, come faremo noi, rendere unici i campi da collegare. Il numero della tessera nella tabella tessere è già chiave primaria, mentre il numero nella tabella clienti no. È importante che una relazione sia fatta tra campi di tipo e dimensione uguali.
Una piccola anticipazione su come implementeremo in Access l'unicità del campo:

La relazione tra supporti e tipo supporto: quandi supporti possono essere di un tipo supporto (cioè quanti supporti possono essere DVD, VHS eccetera)? Molti; e di quanti tipi può essere un supporto? Uno, perché se un supporto è un DVD non può essere una VHS.
Per questo tipo di relazione (detta 1 a molti, oppure 1 a n) serve una chiave primaria nella tabella 1 e una
chiave esterna nella tabella molti.

Nota: il simbolo ∞ rappresenta l'
infinito, ed è posto vicino alla tabella "molti"
Ora tocca alla relazione tra attori e film: quanti attori possono fare un film? Molti; quanti film possono essere fatti da un attore? Molti.
Questo tipo di relazione (m-n, o molti a molti) non può essere risolta con le sole tabelle in relazione tra loro, ma necessita di una tabella di appoggio, che contiene coppie di chiavi esterne.
Nel nostro esempio la tabella deve contenere coppie film-attore. Inoltre la coppia può essere una chiave primaria, in quanto lo stesso attore non può aver fatto due volte lo stesso film (lo stesso, non un sequel!).
Creiamo quindi la nuova tabella, che può contenere solo le chiavi esterne o anche altre informazioni aggiuntive.
Quelli che durante le lezioni capiscono a fondo il concetto, suggeriscono spesso di inserire nella nuova tabella il compenso che l'attore percepisce per il film.

Altre relazioni:
- cliente - noleggio (1-n)
- un cliente può fare più noleggi
- un noleggio può essere fatto da un solo cliente (alla volta)
- film - noleggio (1-n)
- un film può essere oggetto di più noleggi
- un noleggio può riguardare un solo film (se uno vuole noleggiare due film fa due noleggi)
- film - supporto (1-n)
- un film può essere messo dentro più supporti
- un supporto contiene solo un film
- film - regista (1-n, ma potrebbe essere n-m)
- un film può essere girato solo da un regista (assumiamo questo per semplicit� )
- un regista può girare più film
- film - genere (1-n)
- un film può essere di un solo genere
- un genere può annoverare più film
La rappresentazione di tutte le relazioni ora sulla lavagna appare estremamente caotica. Se però si potessero spostare le tabelle in modo da mantenere tutti gli "1" a sinistra della relazione e tutti gli "∞" a destra, si otterrebbe questo schema:

È giunto il momento di fare alcune riflessioni:
- Ogni volta che ci sono due relazioni uno-a-molti consecutive (per esempio tra registi e film e tra film e supporti) anche la relazione "implicita" tra le due tabelle distanti è uno-a-molti (cioè un regista può essere presente in molti supporti, mentre in un supporto sta il film di un solo regista)
- Ovunque ci siano due chiavi esterne in una stessa tabella c'è una relazione molti-a-molti (per esempio un cliente può noleggiare molti film, e un film può essere noleggiato da molti clienti)
- In una relazione uno-a-molti l'"uno" è sempre una chiave primaria, mentre il "molti" è una chiave esterna
- Ogni tabella è in relazione - diretta o indiretta - con tutte le altre
È arrivata la meritata pausa per il caffè

dopo la quale di solito facciamo un gioco di relazioni: per esempio, come facciamo a sapere quali registi hanno collaborato con quali attori?

E se volessimo sapere chi ha noleggiato in un determinato giorno un determinato supporto (magari perché è stato danneggiato)? Dovremmo anche applicare dei filtri:

E se volessimo sapere qual è il regista preferito di un cliente? Dovremmo applicare un filtro sul cliente e un conteggio sul regista:

Gli esempi si sprecano, ma è ora di passare all'attività successiva.
Parte quattro: Individuare le caratteristiche degli attributi
Definire le caratteristiche di ciasacun attributo è un'attività estremamente lunga e dispersiva, per cui durante la lezione ci si concentra sulla varietà di caratteristiche definibili, per lasciare gli studenti a perfezionare il database autonomamente, ognuno secondo la propria velocità.
Un dato può essere un testo, un numero, una data, un vero/falso o un oggetto. Questo vale per tutti i database, ma ogni database utilizza tipi di dato leggermente diversi. Jet utilizza quelli presenti nella seguente tabella:
| Testo |
Testo breve, fino a 255 caratteri. |
| Memo |
Testo lungo (fino a 65536 caratteri); negli ordinamenti di campi memo sono utilizzati solo i primi 255 caratteri. |
| Numerico |
Valore numerico, con o senza la virgola (questa impostazione fa parte dei "dettagli"). |
| Data/ora |
Data (es. 01/01/2007), ora (es. 11:35:00) o entrambe (es. 01/01/2007 11:35:00). |
| Valuta |
Numerico a precisione doppia con formato valuta. È inserito come tipo per comodità, in quanto è impostabile un tipo equivalente tramite "numerico" |
| Contatore |
Intero lungo, gestito completamente da Access. Buono per fare da chiave primaria, in quanto è unico e c'è sempre. |
| Sì / no |
Può avere solo valore sì o no (o vero/falso o on/off). È anche detto campo "booleano" in onore del logico George Boole |
| Oggetto OLE |
OLE sta per "Object Linked or Embedded", cioè Oggetto collegato o incorporato. Rappresenta un oggetto (es. un file audio o un foglio di calcolo) collegato o memorizzato all'interno del database. |
| Collegamento ipertestuale |
Considera che il testo inserito è un URL valido |
Nella tabella riportata di seguito c'è una breve spiegazione di tutte le caratteristiche disponibili, che saranno discusse successivamente.
| Dimensione campo |
Per un campo testo indica il numero massimo di caratteri, mentre per i campi numerici indica quanto grandi sono i numeri gestiti |
| Nuovi valori (solo per contatore) |
Indica se il successivo valore sarà incrementale (il più alto + 1) oppure casuale |
| Formato |
Il modo in cui il dato è mostrato. Per i numeri sono disponibili scelte come la presenza del separatore delle migliaia, del simbolo di valuta, percentuale ecc; per le date è possibile mostrare solo il giorno, solo l'ora, il mese per esteso ecc. |
| Posizioni decimali (solo per numerico) |
Indica quante posizioni decimali sono visualizzate. Il valore del numero non cambia, per cui se si memorizza 3,1415926 e si visualizzano due decimali, l'utente vedrà 3,14, ma il numero memorizzato continua ad essere 3,1415926. Automatiche inserisce meno decimali possibile. |
| Etichetta |
Il nome visualizzato per il campo. Serve per inserire come nome del campo anche caratteri non permessi. Per esempio possiamo chiamare un campo PIVA e usare come etichetta P.IVA (il punto non è ammesso come nome del campo) |
| Indicizzato |
"Sì" indica che il campo è usato come indice per le ricerche. Impostare i campi giusti come indici fa andare più veloci le ricerche. Permette anche di decidere se sono ammessi valori duplicati o se i valori devono essere unici. |
| Maschera di input |
Fornisce all'utente una maschera che accetta solo un certo tipo di input. Per esempio la maschera di input per il codice fiscale è AAAAAA00A00A000A |
| Valore predefinito |
Il valore che avrà il campo se l'utente non ne specifica uno differente. Può essere un valore fisso (es. 22, "testo") o una formula (es. =date()) |
| Valido se |
Una formula applicata al valore inserito che può restituire vero o falso. Per es. >=22 restituisce errore se si inserisce un numero più basso di 22. |
| Messaggio errore |
Se è impostata una formula, è il messaggio che compare all'utente quando inserisce un valore errato. |
| Richiesto |
Indica che non è possibile inserire un nuovo record senza valorizzare questo campo |
| Consenti lunghezza zero |
Un testo di lunghezza zero e un testo nullo sono due cose differenti, anche se per l'utente non cambia niente. Ricordarsi di impostare questo valore su "no" se si richiede un valore in questo campo. |
| Compressione Unicode |
Unicode è un sistema che consente di memorizzare testo con caratteri non latini (es. arabo, cirillico, ideogrammi...). La compressione unicode risparmia spazio se i caratteri utilizzati sono standard. |
| IME mode / IME sentence mode |
Utilizzato con le lingue orientali |
Prendiamo ad esempio la tabella film, che ha i campi ID, titolo, durata, VM18, uscita, ID_genere, ID_regista.
- ID è un campo di tipo contatore, aggiunto automaticamente da Access per fare da chiave primaria. E quindi è anche chiave primaria. È naturalmente un intero lungo, e i nuovi valori sono aggiunti per incremento (cioè il prossimo valore è MAX(ID) + 1. Avrebbe potuto essere un valore casuale).
- titolo è un campo testo, che può avere come lunghezza massima 255 caratteri (per default Access definisce 50 caratteri come lunghezza massima). È richiesto (non è possibile inserire un film senza titolo), e non è consentito un titolo di lunghezza zero.
- durata è un campo numerico (durata in minuti); avrebbe potuto essere un data/ora, ma sarebbe stato più scomodo da gestire e fuori dallo standard cinematografico che prevede che la durata sia espressa in minuti. Il numero può essere un intero.
- VM18 è un campo vero/falso. La maggior parte delle volte un film non è vietato, dunque possiamo impostare come valore predefinito "falso".
- Uscita è un campo di tipo data, che può avere come formato "data in cifre". Possiamo impostare una maschera di input "data in cifre", che impone all'utente di inserire la data in formato gg/mm/aaaa, anche senza digitare le barre diagonali. Come valore predefinito possiamo inserire "=Date()" (senza virgolette). Questo inserirà la data di oggi per ogni film inserito.
- ID_genere è un campo di tipo numerico intero lungo che fa da chiave esterna verso la tabella Generi. Utilizzando la linguetta "ricerca" è possibile inserire un menu a discesa in cui scegliere il campo dai valori della tabella generi invece che inserire il numero corrispondente.
Una piccola digressione: la gestione delle chiavi esterne
La linguetta di "ricerca" permette di inserire in un campo un set di valori al posto di testo semplice.

Per esempio, se volessi inserire un elenco di generi, potrei selezionare "Casella di riepilogo", come "tipo origine riga" posso inserire "elenco valori" e poi in "origine riga" inserirei "horror;commedia;drammatico;musical".

Questo limita la scelta del valore per il campo alle sole quattro voci specificate. Ovviamente la scelta limita le eventuali aggiunte di altri generi, per cui è molto più comodo recuperare quei valori da una tabella, gestibile anche dall'utente.
Impostiamo allora "casella di riepilogo", come "tipo origine riga" usiamo "Tabella/Query", come "Origine riga" la tabella "Generi" e impostiamo - spiegherò dopo cosa significa - "Colonna associata" a 1, "Numero colonne" a 2 e "Larghezza colonne" a 0.

Vediamo più in dettaglio le varie voci di questo menu:
|
Visualizza controllo
|
Può essere testo, casella di riepilogo o casella combinata. Il primo permette di inserire testo libero, le altre due permettono una scelta da un elenco
|
|
Tipo origine riga
|
Indica se vogliamo attingere i dati da una tabella o query, da un elenco di valori fissi oppure da un elenco di campi.
|
|
Origine riga
|
Può essere il nome di una tabella o di una query, se l'origine è "Tabella/query" oppure un elenco di dati separati da un punto e virgola (es. eolo;mammolo;pisolo;dotto;brontolo;gongolo;cucciolo)
|
|
Colonna associata
|
È un numero che rappresenta quale colonna della tabella specificata come origine riga collegare con questo campo. Per esempio se il campo si chiama "ID_genere" e nella tabella generi il campo "ID" è il primo, dovremo scrivere 1.
|
|
Numero colonne
|
Il numero delle colonne visualizzate.
|
|
Intestazioni colonne
|
Mostra il nome di ciascuna delle colonne visualizzate.
|
|
Larghezza colonne
|
La larghezza di ciascuna colonna visualizzata, separate da punto e virgola. Se impostata a zero, la colonna non è visibile.
|
|
Righe in elenco (solo combinata)
|
Numero di righe visibili contemporaneamente nel menu a discesa.
|
|
Larghezza elenco
|
La larghezza dell'elenco espanso (quando ci si clicca sopra)
|
|
Solo in elenco
|
Se "no" permette di scrivere testo libero anche non presente nell'elenco del menu a discesa.
|
Di solito c'è una gran confusione quando si spiegano tutte le voci di questo menu. Il mio consiglio è di provare a cambiare questi valori e provare a capire cosa cambia. Partendo eventualmente dalle impostazioni suggerite.
Anche se può sembrare di no, questa fase è una delle più semplici, perché è costituita da una grande quantità di opzioni molto semplici da capire, che si imparano molto di più provando che con la teoria.
Parte cinque: Creare tabelle e relazioni
A questo punto creare le tabelle con inserisci => tabella o con gli appositi tasti è molto semplice.
Prima di tutto inseriamo tutti i campi che NON fanno da chiave primaria, e per ciascun campo che fa riferimento ad un'altra tabella utilizziamo ID in testa e lo inseriamo con tipo numerico. Per esempio per la tabella Film:
| Titolo |
Testo, richiesto = sì |
| Durata |
Numerico, intero, richiesto = no |
| VM18 |
Sì/no, valore predefinito = no (falso) |
| Uscita |
Data/ora, formato = data in cifre, maschera di input = 00/00/0000;0;_ |
| ID_genere |
Numerico intero lungo, indicizzato con duplicati permessi (quando si inserisce un campo che inizia con ID Access dovrebbe proporre questa opzione automaticamente) |
| ID_regista |
Numerico intero lungo, indicizzato con duplicati permessi |
Salvando la tabella, che chiameremo
film, Access ci chiede se vogliamo creare una chiave primaria, con un messaggio poco chiaro:
Anche se non è indispensabile, è consigliabile avere una chiave primaria. La chiave primaria è necessaria per definire una relazione tra questa tabella e altre tabelle nel database. Creare una chiave primaria adesso? [Sì] [No] [Annulla]
Per sapere cosa significa più in dettaglio è possibile leggere la
pagina di spiegazione relativa a questo messaggio.
Automaticamente compare un campo ID di tipo contatore e chiave primaria (si capisce dalla chiave che compare sulla sinistra).
Una volta realizzate tutte le tabelle, è possibile creare le relazioni.
Per aprire la schermata delle relazioni si può andare su strumenti => relazioni o cliccare sul tasto

Includi tutte le tabelle, poi prova a collegarle trascinando una chiave esterna (per esempio ID_regista della tabella film) sulla chiave primaria dell'altra tabella (per esempio ID della tabella registi).
A questo punto puoi vedere due popup: se tutto va bene vedrai questo:

Altrimenti vedrai questo messaggio di errore:

Se vedi il messaggio di errore, clicca sull'immagine qui sopra per capire come risolverlo.
Altrimenti, nella tabella qui sotto è riassunto il significato dei tre checkbox:
| Applica integrità referenziale |
Significa che non puoi utilizzare nella tabella "molti" (nell'esempio è la tabella film) registi che ancora non sono stati inseriti nella tabella registi. Con l'integrità referenziale, PRIMA si inserisce l'elemento della tabella "uno" (il regista) e DOPO si inserisce l'elemento della tabella "molti" associata (il film). |
| Aggiorna campi correlati a catena |
Se si modifica la chiave primaria, anche tutte le chiavi esterne si modificano di conseguenza. Per esempio, se identifico un dipendente con il codice fiscale e lego le buste paga tramite il codice fiscale (relazione uno-a-molti), se mi accorgo di aver sbagliato a digitarlo, modificando il valore nella tabella dei dipendenti si aggiorna automaticamente quello di tutte le buste paga associate a quell'utente. |
| Elimina record correlati a catena |
Se elimino un regista, si eliminano AUTOMATICAMENTE tutti i suoi film. |
Per capire il significato di "tipo join" è possibile leggere la
pagina di spiegazione "Il significato di inner left e full join", ma in questo momento non è indispensabile.
Una volta create tutte le relazioni, è una mia consuetudine mettere la tabella "uno" a sinistra della tabella "molti", in modo da ottenere un diagramma simile a questo:

Questo si chiama schema E/R (entità / relazioni), e - organizzato in questo modo - ci dice che non possiamo inserire un elemento in una tabella a destra se prima non abbiamo inserito l'elemento corrispondente in tutte le tabelle a sinistra. Per esempio, non possiamo inserire un film se prima non abbiamo opportunamente compilato le tabelle dei generi e dei registi.
Conclusioni
A questo punto abbiamo ottenuto un database da una
tempesta di cervelli∞. Quest'attività porta a riflettere molto su quello che si sta facendo, il che porta delle implicazioni nel modo di lavorare delle persone più incasinate, costrette per la prima volta a
pensare a quello che stanno facendo.
Riferimenti
Il forum su Microsoft Access∞
Categories
Access
Corsi
Ci sono 2 commenti. [Vedere commento]