Il wiki della programmazione - Corso di Access: creare un database per una videoteca

Home :: Pagine che puntano a questa :: Login/Register

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:
  1. Brainstorming
  2. Individuare oggetti e attributi
  3. Individuare relazioni tra gli oggetti
  4. Individuare le caratteristiche degli attributi
  5. 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:
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:
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
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
tabelle noleggi e tessere
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:
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?"
tabelle noleggi, tessere e registi
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:
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:
tabelle noleggi, tessere, registi, attori, film, tipi di supporto, supporti
"Film che ha già noleggiato" porta dritti dritti alla domanda "chi?". Si individua la figura del cliente, che ha come attributi:
tabelle noleggi, tessere, registi, attori, film, tipi di supporto, supporti, clienti

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:
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:
Indicizzato => si, duplicati non ammessi

relazione tessere-clienti
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.
relazione supporti-tipi supporto
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.
relazione supporti-tipi supporto
Altre relazioni:
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:
tutte le relazioni (in ordine)
È giunto il momento di fare alcune riflessioni:

È arrivata la meritata pausa per il caffè
Espresso - trovato su wikipedia.org
dopo la quale di solito facciamo un gioco di relazioni: per esempio, come facciamo a sapere quali registi hanno collaborato con quali attori?
registi - attori
E se volessimo sapere chi ha noleggiato in un determinato giorno un determinato supporto (magari perché è stato danneggiato)? Dovremmo anche applicare dei filtri:
chi ha danneggiato il film
E se volessimo sapere qual è il regista preferito di un cliente? Dovremmo applicare un filtro sul cliente e un conteggio sul regista:
regista preferito
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.

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.
Linguetta Ricerca
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".
Linguetta Ricerca
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.
dropdown
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
tasto relazioni
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:
schermata relazioni
Altrimenti vedrai questo messaggio di errore:
La relazione deve interessare lo stesso numero di campi contenenti lo stesso tipo di dati
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:
Schema entità / relazioni
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]

Valid XHTML 1.0 Strict :: Valid CSS :: Realizzato con Wikka Wakka Wiki 1.1.6.3
Page was generated in 1.2081 seconds