Passa al contenuto principale

Capitolo 02

Leggere un dominio e ricavarne il modello

You see, but you do not observe.

Sherlock Holmes, Uno scandalo in Boemia (1891)

Nelle lezioni di questo capitolo il modello di Hogwarts è cresciuto una richiesta alla volta: i colori delle case, il direttore, le bacchette, i corsi. Quando si progetta un database davvero, e anche in una prova scritta di progettazione, il dominio arriva invece tutto insieme, in un testo che descrive che cosa si vuole registrare. Chi lo legge per la prima volta tende a disegnare subito i rettangoli che gli vengono in mente, e a scoprire le decisioni sbagliate quando il diagramma è già pieno di linee. In questa lezione leggiamo un testo di dominio con un metodo in quattro passi, che rimette in ordine le decisioni delle lezioni precedenti in modo che nessuna resti a metà. Alla fine il metodo lo applichi tu, su un testo nuovo.

Il testo​

Immaginiamo che la biblioteca di Hogwarts voglia un database per i suoi prestiti, e che la richiesta arrivi scritta così:

La biblioteca di Hogwarts vuole un database per i suoi prestiti. Di ogni libro la bibliotecaria registra il titolo, l’anno di pubblicazione e gli autori: un libro può avere più autori, e di ogni autore interessano nome e cognome. Di molti libri la biblioteca possiede più copie, e ogni copia ha un numero d’inventario scritto sul dorso e uno stato di conservazione. Gli studenti prendono in prestito le copie: di ogni prestito si registrano la data in cui la copia esce e la data in cui rientra, che resta vuota finché la copia non torna. Uno studente può avere più copie in prestito nello stesso momento. Alcuni libri sono riservati: si prendono in prestito solo con il permesso firmato da un professore, e la biblioteca vuole sapere quale professore ha firmato ogni permesso.

Il testo è breve, ma contiene tutto quello che il capitolo ha messo in campo: entità e attributi, un’associazione molti a molti, un’entità che sembra un’associazione, attributi opzionali e una regola che nessun rombo può disegnare.

Primo passo: i candidati​

Il primo passo lavora sui sostantivi del testo. Ogni sostantivo è un candidato: una cosa che il modello potrebbe registrare. Un candidato non è ancora un’entità; per ognuno facciamo la domanda della lezione “Entità e attributi”: interessa sapere qualcosa di lui oltre al nome, ed esiste anche senza le altre cose? La tabella qui sotto raccoglie i sostantivi del testo, il verdetto e il motivo.

CandidatoVerdettoPerché
bibliotecascartatoce n’è una sola, e il testo non chiede niente di lei
database, bibliotecariascartatiil database è lo strumento; della bibliotecaria il testo non chiede niente, ed è meglio non disturbarla
libroentitàha titolo, anno e autori, ed esiste anche senza prestiti
titolo, anno di pubblicazioneattributi di librointeressa solo il valore
autoreentitàha nome e cognome, e lo stesso autore può aver scritto più libri
nome, cognomeattributi di autoreinteressa solo il valore
copiaentitàha numero d’inventario e stato, che riguardano l’oggetto e non il libro
numero d’inventario, statoattributi di copiainteressa solo il valore
studente, professoreentitàsono già nel modello di Hogwarts
prestitoda decidereha due date; se sia un’entità o un’associazione lo decide il secondo passo
data di uscita, data di rientroattributi di prestitointeressa solo il valore; la data di rientro è opzionale
permessoda decidereil testo chiede solo chi l’ha firmato: lo decide il secondo passo
libro riservatoattributo di libroun libro è riservato oppure no: riservato vale sì o no

La decisione più delicata del primo passo è la coppia libro e copia. Nell’italiano di tutti i giorni “libro” vuol dire due cose: l’opera, quando diciamo “ho letto quel libro”, e l’oggetto, quando diciamo “ho perso il libro” o, a Hogwarts, “il libro mi ha morso”. Il testo le distingue con due parole diverse, e il modello deve fare lo stesso. Se libro e copia diventassero una sola entità, con il numero d’inventario fra gli attributi, il titolo e gli autori di un libro con tre copie sarebbero scritti tre volte: è la ridondanza del capitolo 1, travestita da comodità. Il prestito riguarda la copia, perché è la copia che esce dalla biblioteca e ci rientra; il titolo riguarda il libro.

Secondo passo: i legami​

Il secondo passo lavora sui verbi e sulle frasi che mettono in relazione due candidati: “un libro può avere più autori”, “possiede più copie”, “gli studenti prendono in prestito le copie”, “il permesso firmato da un professore”. Ogni frase così è una candidata associazione, e per ognuna facciamo le domande delle lezioni precedenti.

Fra autore e libro c’è l’associazione scrive: un autore scrive più libri, un libro ha più autori, quindi è molti a molti, e non ha attributi. Fra copia e libro c’è un’associazione uno a molti, esemplare: ogni copia è un esemplare di un libro solo.

Il prestito sembra un’associazione molti a molti fra studente e copia, con le due date come attributi. La domanda della lezione precedente decide: la stessa coppia può comparire più di una volta? Sì: Hermione può prendere in prestito la stessa copia a ottobre e di nuovo a maggio, e conoscendola anche a novembre, gennaio e marzo. Il prestito è quindi un’entità, legata alla copia dall’associazione riguarda e allo studente dall’associazione richiede.

Il permesso, invece, del testo ha una sola informazione: quale professore l’ha firmato. Un’entità permesso senza attributi propri sarebbe l’errore opposto della lezione “Entità e attributi”. Il permesso è un legame fra un prestito e un professore, cioè l’associazione firma.

Resta un legame che il testo suggerisce ma il modello non deve disegnare: il libro di un prestito. Dal prestito si arriva alla copia, e dalla copia al suo libro, sempre: un’associazione fra prestito e libro sarebbe un’associazione derivata, cioè una copia.

Terzo passo: le quantità​

Il terzo passo cerca nel testo le parole che contano: “ogni”, “più”, “alcuni”, “può”, “solo”. Ogni parola di questo tipo è un pezzo di cardinalità, e va letta partendo dall’entità di cui parla.

  • “Un libro può avere più autori”: accanto a libro in scrive il massimo è N.
  • “Di molti libri la biblioteca possiede più copie”: accanto a libro in esemplare il massimo è N. “Ogni copia ha un numero d’inventario”: accanto a copia, (1,1), perché una copia è un esemplare di un libro solo.
  • “Uno studente può avere più copie in prestito”: accanto a studente in richiede il massimo è N, e il minimo è 0, perché uno studente può non aver mai preso un libro.
  • “Di ogni prestito si registrano…”: ogni prestito riguarda una copia e un solo studente, (1,1) in riguarda e in richiede.
  • “Alcuni libri sono riservati”: solo alcuni prestiti hanno una firma, quindi accanto a prestito in firma c’è (0,1).
  • “La data in cui rientra, che resta vuota finché la copia non torna”: l’attributo rientro è opzionale, (0,1).

Alcune cardinalità il testo non le dice. Un libro registrato può non avere nessuna copia? Un autore può essere registrato senza nessun libro della biblioteca? Il testo tace, e chi progetta deve scegliere e dirlo: una scelta non scritta sembra una svista a chi legge il diagramma. Le scelte si scrivono come ipotesi, accanto al diagramma:

  1. Ogni libro registrato ha almeno una copia: accanto a libro in esemplare, (1,N).
  2. Ogni autore registrato ha scritto almeno un libro della biblioteca: accanto ad autore in scrive, (1,N).
  3. Un professore può firmare quanti permessi vuole, anche nessuno: accanto a professore in firma, (0,N).

Infine, alcune regole del testo non entrano in nessuna cardinalità. “Si prendono in prestito solo con il permesso” lega la firma a un attributo del libro, riservato, che sta due associazioni più in là: il diagramma può esprimere che un prestito ha al massimo una firma, ma non che ce l’ha se e solo se il libro è riservato. E una copia non può essere in prestito a due studenti nello stesso momento, ma le cardinalità contano le coppie, non le date. Le regole di questo tipo si chiamano vincoli non esprimibili, e si scrivono anch’esse accanto al diagramma:

  1. Un prestito ha una firma se e solo se la copia è un esemplare di un libro riservato.
  2. Una copia ha al massimo un prestito con la data di rientro vuota.

Nel capitolo 5 vedremo che alcuni di questi vincoli si possono far rispettare al DBMS; altri restano compito dei programmi che usano il database.

Quarto passo: gli identificatori​

L’ultimo passo dà a ogni entità il suo identificatore, con il criterio della lezione sulle chiavi: serve una regola che garantisca valori diversi, oggi e domani. La copia ha già un identificatore assegnato apposta, il numero d’inventario: lo scrive la biblioteca sul dorso, e non lo ripete. Il titolo non identifica un libro, perché due libri diversi possono avere lo stesso titolo, e nome e cognome non identificano un autore: a entrambi diamo un codice. Il prestito ha il suo numero progressivo, come l’assegnazione del registro dei punti; lo studente ha la matricola, e il professore un codice come l’autore.

Il diagramma qui sotto mette insieme i quattro passi. È più largo della colonna: su uno schermo stretto scorre di lato dentro la figura.

Il modello della biblioteca di HogwartsSei entità. Autore (codice, nome, cognome) e libro (codice, titolo, anno, riservato) sono collegati da scrive, (1,N) da tutti e due i lati. Copia (inventario, stato) è collegata a libro da esemplare: (1,1) accanto a copia, (1,N) accanto a libro. Prestito (id, uscita, rientro opzionale) è collegato a copia da riguarda, (1,1) accanto a prestito e (0,N) accanto a copia; a studente (matricola, nome) da richiede, (1,1) accanto a prestito e (0,N) accanto a studente; a professore (codice, nome) da firma, (0,1) accanto a prestito e (0,N) accanto a professore.autorecodicenomecognomelibrocodicetitoloannoriservatocopiainventariostatoprestitoiduscitarientro(0,1)professorecodicenomestudentematricolanomescriveesemplareriguardarichiedefirma(1,N)(1,N)(1,1)(1,N)(1,1)(0,N)(1,1)(0,N)(0,1)(0,N)

Il diagramma da solo non è il modello. Il modello completo è il diagramma con le tre ipotesi e i due vincoli non esprimibili scritti accanto: chi lo legge, che sia un collega o chi corregge una prova scritta, deve poter capire ogni scelta senza chiederla a chi l’ha fatta.

Il tuo turno​

Applica i quattro passi a questo testo. Lavora su carta: per ogni passo scrivi i candidati con il verdetto, le associazioni, le cardinalità e gli identificatori; poi disegna il diagramma, con le ipotesi e i vincoli non esprimibili accanto.

Ogni anno a Hogwarts le quattro case si contendono la Coppa di Quidditch. Ogni casa ha una squadra di sette giocatori, tutti studenti della casa, e il database registra la squadra di quest’anno. Di ogni giocatore interessa il ruolo, e uno dei sette è il capitano della squadra. Ogni partita si gioca in una data fra due case, e il database deve registrare i punti segnati da ciascuna delle due. Ogni partita è arbitrata da un professore.

Una soluzione possibile

Primo passo. Le entità sono casa, studente, partita e professore. La squadra non è un’entità a parte: ogni casa ne ha una, e il testo non chiede niente della squadra che non sia già della casa. La Coppa è una sola, e del Quidditch il testo non chiede niente: entrambi scartati. Il ruolo e i punti sono attributi, e il secondo passo decide di che cosa.

Secondo passo. I giocatori sono studenti che fanno parte della squadra di una casa: è l’associazione gioca fra studente e casa, con l’attributo ruolo, che è un’informazione sul giocatore in squadra. Il capitano è un’altra associazione fra le stesse due entità, capitano, con coppie diverse da gioca: è il caso dei due rombi legittimi della lezione “Le associazioni”. I punti di una partita sono un attributo della coppia partita–casa, come il voto della lezione precedente: l’associazione sfida fra partita e casa ha l’attributo punti. Ogni partita è arbitrata da un professore: l’associazione arbitra.

Terzo passo. Accanto a casa in gioca c’è (7,7): ogni squadra ha esattamente sette giocatori. Accanto a studente, (0,1): la maggior parte degli studenti non gioca. In capitano, (1,1) accanto a casa e (0,1) accanto a studente. In sfida, (2,2) accanto a partita, perché ogni partita si gioca fra esattamente due case, e (0,N) accanto a casa. In arbitra, (1,1) accanto a partita e (0,N) accanto a professore.

Quarto passo. La casa si identifica con il nome, lo studente con la matricola, il professore con il suo codice e la partita con un numero progressivo.

Una soluzione per la Coppa di QuidditchLo studente (matricola, nome) è collegato alla casa (nome) da due associazioni: gioca, con l'attributo ruolo, (0,1) accanto a studente e (7,7) accanto a casa; e capitano, (0,1) accanto a studente e (1,1) accanto a casa. La casa è collegata alla partita (id, data) da sfida, con l'attributo punti, (0,N) accanto a casa e (2,2) accanto a partita. La partita è collegata al professore (codice, nome) da arbitra, (1,1) accanto a partita e (0,N) accanto a professore.studentematricolanomecasanomepartitaiddataprofessorecodicenomegiocaruolocapitanosfidapuntiarbitra(0,1)(7,7)(0,1)(1,1)(0,N)(2,2)(1,1)(0,N)

Ipotesi. Il database registra solo la squadra dell’anno in corso, come dice il testo: con le squadre degli anni passati, la stessa coppia studente–casa comparirebbe più volte in gioca, e servirebbe un’entità, come per le assegnazioni. Una casa può non aver ancora giocato nessuna partita.

Vincoli non esprimibili. Un giocatore appartiene alla casa per cui gioca. Il capitano è uno dei sette giocatori della sua squadra. Le due case di una partita sono diverse: Grifondoro contro Grifondoro si vede solo agli allenamenti.

Altre soluzioni sono accettabili, se motivate. Per esempio, visto che un giocatore gioca sempre per la sua casa, gioca si può sostituire con un attributo opzionale ruolo di studente, (0,1): il vincolo “sette giocatori per casa” diventa allora un vincolo non esprimibile.