Passa al contenuto principale

Capitolo 02

Le associazioni

We are only as strong as we are united, as weak as we are divided.

Albus Silente, Harry Potter e il Calice di Fuoco (2000)

Alla fine della lezione precedente due cose sono rimaste fuori dal diagramma: la colonna casa della tabella studente e il direttore di ogni casa. Nessuna delle due è una proprietà di un’entità. La colonna casa lega uno studente a una casa, e il direttore lega una casa a un professore. Nel modello E/R questi legami si chiamano associazioni, e in questa lezione vediamo che un’associazione non è una linea qualunque fra due entità che hanno qualcosa a che fare: registra un fatto preciso, e il modello deve dire quale.

La colonna che collega​

Riprendiamo la seconda versione delle tabelle della lezione precedente: la tabella casa con nome, colori e animale, e la tabella studente con nome, casa e anno. Le colonne anno e casa della tabella studente sembrano dello stesso tipo, ma contengono due cose diverse. Il numero 3 accanto a Fred Weasley è l’anno che Fred frequenta, e non rimanda a nient’altro. La parola Grifondoro accanto a Fred è invece il nome di una riga di un’altra tabella: rimanda alla riga di Grifondoro nella tabella casa, dove stanno i colori e l’animale. La colonna anno descrive lo studente; la colonna casa lo collega a un’occorrenza di un’altra entità.

Il collegamento registra un fatto: “Fred Weasley appartiene a Grifondoro”. Un fatto dello stesso tipo lega ogni studente alla sua casa: Harry Potter con Grifondoro, Draco Malfoy con Serpeverde, Padma Patil con Corvonero, Cedric Diggory con Tassofrasso, e così via. Nel modello E/R l’insieme di tutte queste coppie è un’associazione.

Le occorrenze dell’associazione appartieneA sinistra l’insieme degli studenti: Harry Potter, Hermione Granger, Draco Malfoy, Padma Patil e Cedric Diggory. A destra l’insieme delle case: Grifondoro, Serpeverde, Corvonero e Tassofrasso. Una linea per ogni coppia studente-casa per cui vale il legame: Harry e Hermione con Grifondoro, Draco con Serpeverde, Padma con Corvonero, Cedric con Tassofrasso. Sopra le linee il rombo appartiene, con una graffa che le raccoglie tutte. In evidenza la coppia Harry Potter, Grifondoro.studentecasaappartieneHarry PotterHermione GrangerDraco MalfoyPadma PatilCedric Diggoryun’occorrenza: (Harry Potter, Grifondoro)GrifondoroSerpeverdeCorvoneroTassofrasso
Le occorrenze dell’associazione appartieneA sinistra l’insieme degli studenti: Harry Potter, Hermione Granger, Draco Malfoy, Padma Patil e Cedric Diggory. A destra l’insieme delle case: Grifondoro, Serpeverde, Corvonero e Tassofrasso. Una linea per ogni coppia studente-casa per cui vale il legame: Harry e Hermione con Grifondoro, Draco con Serpeverde, Padma con Corvonero, Cedric con Tassofrasso. Sopra le linee il rombo appartiene, con una graffa che le raccoglie tutte. In evidenza la coppia Harry Potter, Grifondoro.studentecasaappartieneHarry PotterHermione GrangerDraco MalfoyPadma PatilCedric Diggoryun’occorrenza: (Harry Potter, Grifondoro)GrifondoroSerpeverdeCorvoneroTassofrasso

Ogni linea è un’occorrenza di appartiene, cioè una coppia studente-casa, come (Harry Potter, Grifondoro).

Esistono anche associazioni fra tre o più entità, ma sono rare e in questo libro non servono: le nostre associazioni legano sempre due entità.

Il nome di un’associazione è di solito un verbo, scelto in modo che insieme ai nomi delle due entità formi una frase vera: lo studente appartiene alla casa. Nel diagramma un’associazione è un rombo con il nome dentro, collegato con una linea a ciascuna delle due entità. Da questa lezione in avanti i diagrammi mostrano di ogni entità soltanto gli attributi che servono al discorso.

Lo studente appartiene a una casaL'entità studente, con gli attributi nome e anno, è collegata all'entità casa, con gli attributi nome, colori e animale, dall'associazione appartiene. Le linee non hanno cardinalità.studentenomeannocasanomecolorianimaleappartiene

Fra gli attributi di studente la casa non c’è più: il suo posto è il rombo. Quando nel capitolo 3 trasformeremo il modello in tabelle, l’associazione appartiene tornerà a essere una colonna della tabella studente, perché è così che le tabelle registrano un legame. Il modello concettuale però non decide le colonne: registra il fatto che uno studente appartiene a una casa, e il modo di scriverlo nelle tabelle lo decideremo nel capitolo 3. Le linee del diagramma, per ora, non hanno numeri; i numeri arrivano nella prossima lezione.

Un fatto, due versi​

La frase “Harry appartiene a Grifondoro” si può girare: “Grifondoro accoglie Harry”. Le due frasi parlano della stessa coppia, (Harry Potter, Grifondoro), quindi dello stesso fatto. Chi legge il diagramma partendo dalla casa legge la stessa associazione nell’altro verso. Chi progetta il modello sceglie il nome leggendo l’associazione in uno dei due versi, e quel nome vale per tutti e due.

Due rombi fra le stesse entità però non sono sempre un errore. Harry appartiene a Grifondoro, e dal primo anno gioca anche nella squadra di Quidditch di Grifondoro. Se il database deve registrare le squadre, gioca è un’associazione fra studente e casa diversa da appartiene: le sue coppie sono soltanto quelle dei giocatori, e non si ricavano da appartiene, perché anche Hermione appartiene a Grifondoro, e il Quidditch preferisce studiarlo sui libri. Per decidere se due associazioni fra le stesse entità sono una sola, confronta le coppie: se sono le stesse, l’associazione è una; se sono diverse, i fatti registrati sono due.

Il direttore​

Nella lezione precedente abbiamo deciso che il direttore di una casa non è un attributo della casa, perché è un professore. Con la colonna casa della tabella studente abbiamo appena trovato un modo per riconoscere questo errore anche quando non conosciamo il dominio. Se la tabella casa avesse una colonna direttore, nella riga di Grifondoro conterrebbe McGonagall: il nome di un’occorrenza di un’altra entità, professore, come Grifondoro nella riga di Fred è il nome di un’occorrenza di casa.

Un attributo che contiene i nomi delle occorrenze di un’altra entità è un’associazione travestita da attributo. Il direttore diventa quindi l’associazione dirige, fra professore e casa. Le sue coppie sono quattro, una per casa: (McGonagall, Grifondoro), (Piton, Serpeverde), (Flitwick, Corvonero) e (Sprout, Tassofrasso). Silente, che è il preside, non dirige nessuna casa e non compare in nessuna coppia.

Lo studente appartiene a una casa, la casa è diretta da un professoreTre entità impilate: studente (nome, anno), casa (nome, colori, animale) e professore (nome, materia). L'associazione appartiene collega studente e casa, l'associazione dirige collega casa e professore. Le linee non hanno cardinalità.studentenomeannocasanomecolorianimaleprofessorenomemateriaappartienedirige

Il diagramma si legge dall’alto in basso come due frasi: lo studente appartiene a una casa, il professore dirige una casa. La casa sta in mezzo, ed è l’unica entità che partecipa a due associazioni.

L’associazione che si ricava​

Nella seconda lezione del capitolo 1 il registro dei punti scriveva la casa dello studente in ogni assegnazione. Anche l’assegnazione è un’entità del registro: ogni assegnazione ha i suoi punti, ed è legata allo studente che li ha ricevuti e al professore che li ha dati. Perché sia un’entità e non un’associazione lo vedremo nella lezione sulle associazioni molti a molti. La casa scritta in ogni assegnazione, nel modello E/R, era un’associazione fra assegnazione e casa. Questa associazione si ricava dalle altre: dall’assegnazione si arriva allo studente, e dallo studente alla sua casa, sempre, per qualunque assegnazione.

Un’associazione le cui coppie si ottengono sempre passando da altre associazioni è un’associazione derivata. Come l’attributo derivato della lezione precedente, è una seconda copia di informazioni che il database contiene già, e può contraddire l’originale: nel capitolo 1, i cinque punti di Neville finivano a Tassofrasso in un conteggio e a Grifondoro nell’altro.

Un giro chiuso nel diagramma, però, non basta a dire che un’associazione è derivata. Anche dirige chiude un giro: un professore dà punti agli studenti, gli studenti appartengono a una casa, e la casa è diretta da un professore. Se ogni professore desse punti soltanto agli studenti della casa che dirige, dirige si potrebbe ricavare dalle assegnazioni e il rombo sarebbe una copia.

Il blocco qui sotto mette alla prova l’idea sul registro dei punti. L’istruzione si legge così: il professore e la casa dello studente, senza ripetizioni (DISTINCT), dalle assegnazioni unite agli studenti con lo stesso nome, in ordine di professore. Se dirige si ricavasse dalle assegnazioni, ogni professore comparirebbe con una casa sola, quella che dirige. Prima di eseguire il blocco, prova a prevedere con quante case compare McGonagall.

SELECT DISTINCT assegnazione.professore, studente.casa
FROM assegnazione
JOIN studente ON studente.nome = assegnazione.studente
ORDER BY assegnazione.professore;

Dalle assegnazioni non si ricava chi dirige una casa: dirige registra un fatto che nel database non sta da nessun’altra parte, e il suo rombo serve. Per la casa di un’assegnazione vale il contrario, perché i punti di un’assegnazione vanno sempre alla casa dello studente che li riceve: è una regola del dominio, valida per tutte le assegnazioni di oggi e di domani.

C’è un’asimmetria fra le due prove. Per dire che un’associazione non si ricava basta un’eccezione nei dati, come le due case di McGonagall. Per dire che si ricava i dati non bastano mai: anche se oggi ogni professore avesse dato punti solo alla casa che dirige, domani McGonagall potrebbe togliere punti a uno studente di Serpeverde. Serve una regola del dominio, e nei dati una regola non sta scritta: la conosce chi usa il database.

Mettiti alla provaDomanda 1 / 3

Un compagno disegna l’entità professore con gli attributi nome, materia e casa_diretta, che per McGonagall vale “Grifondoro”. Che cosa non va?

Scegli la risposta corretta