Passa al contenuto principale

Capitolo 02

Le cardinalità

There can be only one.

Highlander (1986)

Nella lezione precedente le linee dei diagrammi sono rimaste senza numeri, ma qualche conteggio l’abbiamo già fatto a voce: ogni studente appartiene a una casa sola, e Silente non dirige nessuna casa. In questa lezione quei conteggi entrano nel modello, e si chiamano cardinalità. Chi comincia a modellare le scrive per ultime, come un’etichetta da attaccare alla linea quando il diagramma è finito. Vedremo invece che le cardinalità decidono quali dati il database accetta e quale forma avranno le sue tabelle.

Quante case per uno studente​

Prendiamo l’associazione appartiene e contiamo le sue coppie, partendo da uno studente. Harry appartiene a Grifondoro e a nessun’altra casa: compare in una coppia sola, e lo stesso vale per ogni altro studente. Partendo da una casa il conto cambia: nel registro dei punti Grifondoro compare in sei coppie, una per ogni suo studente, e Corvonero in una. Nella lezione “Entità e attributi”, dopo la cancellazione di Padma, Corvonero è rimasta una casa con zero studenti, e il database l’ha conservata.

Il modello registra questi conteggi con due numeri per ogni entità che partecipa all’associazione, scritti fra parentesi accanto all’entità: il minimo e il massimo delle coppie in cui ogni sua occorrenza può comparire. Per appartiene, accanto a studente c’è (1,1): ogni studente compare in almeno una coppia e al massimo in una, perché di case, come di Highlander, ce ne può essere una sola. Accanto a casa c’è (0,N): una casa può non comparire in nessuna coppia, e non ha un massimo fissato. La lettera N vuol dire “quante se ne vuole”. È la stessa notazione dell’attributo opzionale della lezione “Entità e attributi”, dove (0,1) accanto al Patronus voleva dire nessun valore oppure uno.

Le cardinalità di appartiene, contate sulle coppieGli insiemi dei nove studenti del registro e delle quattro case, con una linea per ogni coppia di appartiene. Ogni studente ha una linea sola, e accanto a studente si legge (1,1). Grifondoro ha sei linee, Serpeverde, Corvonero e Tassofrasso una ciascuna. Padma Patil è barrata, e senza di lei Corvonero resta con zero linee, e accanto a casa si legge (0,N).studentecasaHarry PotterHermione GrangerRon WeasleyNeville LongbottomFred WeasleyGeorge WeasleyDraco MalfoyPadma PatilCedric DiggoryGrifondoroSerpeverdeCorvoneroTassofrasso6 1 0 1 (1,1)(0,N)
Le cardinalità di appartiene, contate sulle coppieGli insiemi dei nove studenti del registro e delle quattro case, con una linea per ogni coppia di appartiene. Ogni studente ha una linea sola, e accanto a studente si legge (1,1). Grifondoro ha sei linee, Serpeverde, Corvonero e Tassofrasso una ciascuna. Padma Patil è barrata, e senza di lei Corvonero resta con zero linee, e accanto a casa si legge (0,N).studentecasaHarry PotterHermione GrangerRon WeasleyNeville LongbottomFred WeasleyGeorge WeasleyDraco MalfoyPadma PatilCedric DiggoryGrifondoroSerpeverdeCorvoneroTassofrasso6 1 0 1 (1,1)(0,N)

Senza Padma, Corvonero resta con zero linee: accanto a casa va (0,N).

  1. I nove studenti del registro, ognuno con la linea verso la sua casa.
  2. Contando da uno studente, ognuno ha una linea sola: accanto a studente va (1,1).
  3. Contando da una casa, Grifondoro ha sei linee e le altre case una ciascuna.
  4. Senza Padma, Corvonero resta con zero linee: accanto a casa va (0,N).
Lo studente appartiene a una casa, con le cardinalitàL'entità studente, con nome e anno, è collegata all'entità casa, con nome, colori e animale, dall'associazione appartiene. Accanto a studente la cardinalità è (1,1), accanto a casa (0,N).studentenomeannocasanomecolorianimaleappartiene(1,1)(0,N)

Le cardinalità si leggono partendo dall’entità che hanno accanto: “ogni studente appartiene ad almeno una casa e al massimo a una”, “ogni casa accoglie da zero a N studenti”. Sono le due letture della stessa associazione della lezione precedente, una per verso, e ognuna ha i suoi numeri.

Prima dello smistamento​

Il minimo 1 accanto a studente dice che uno studente senza casa non esiste. Nella seconda versione delle tabelle della lezione “Entità e attributi” questo minimo è già diventato una regola che il DBMS fa rispettare: la colonna casa della tabella studente è obbligatoria, e una riga senza la casa viene rifiutata. Come si dichiara una colonna obbligatoria lo vedremo nel capitolo 5.

Immaginiamo che la segreteria di Hogwarts voglia registrare ogni studente nuovo appena parte la sua lettera di ammissione, durante l’estate. Ginny Weasley arriva a Hogwarts l’anno dopo Harry: riceve la lettera in estate, e il Cappello Parlante la smista solo la sera del 1° settembre, al banchetto di inizio anno. Il blocco qui sotto prova a registrarla in agosto, e si legge così: inserisci nella tabella studente, nelle colonne nome e anno, i valori Ginny Weasley e 1. La casa manca, perché ancora nessuno la conosce. Prima di eseguire il blocco, prova a prevedere che cosa fa il DBMS.

INSERT INTO studente (nome, anno)
VALUES ('Ginny Weasley', 1);

Il DBMS fa rispettare il minimo che il modello ha fissato: con il minimo a 1, uno studente senza casa è un dato impossibile. Per questo dominio, però, è il minimo a essere sbagliato. Se il database registra gli studenti solo dopo lo smistamento, (1,1) va bene e Ginny entra il 1° settembre. Se li registra dalla lettera di ammissione, per qualche settimana uno studente esiste senza casa, e accanto a studente serve (0,1).

Il minimo risponde a una domanda precisa: un’occorrenza di questa entità può esistere senza comparire in nessuna coppia dell’associazione? La risposta non si ricava dai nomi delle entità. Dipende da che cosa il database deve registrare, e da quando: a Hogwarts, lo stesso studente può entrare nel database prima o dopo lo smistamento, e il minimo giusto cambia con quel giorno. Con il minimo a 0 la casa di Ginny resterebbe vuota fino allo smistamento, e il valore che manca ha nelle tabelle un nome e un comportamento tutto suo, NULL, che vedremo nel capitolo 3.

La seconda bacchetta di Ron​

Il massimo decide un’altra cosa. Nella lezione “Entità e attributi” un quiz chiedeva che cosa fare della bacchetta: finché interessa solo il legno, è un attributo dello studente; se interessano anche il nucleo e la lunghezza, diventa un’entità. Supponiamo che interessino. La bacchetta è un’entità con gli attributi legno, nucleo e lunghezza, legata allo studente dall’associazione possiede.

Se il database registra la bacchetta che ogni studente usa adesso, le cardinalità sono (1,1) dai due lati: ogni studente ha una bacchetta, e ogni bacchetta registrata è di uno studente. Ron Weasley però, a Hogwarts, ha avuto due bacchette. La prima era quella vecchia di suo fratello Charlie, e si è spezzata al secondo anno, quando Ron e Harry sono arrivati a scuola sulla Ford Anglia volante del padre di Ron, atterrando su un albero che non l’ha presa bene. Al terzo anno Ron ne ha una nuova: salice, crine di unicorno, quattordici pollici.

Se il database deve conservare tutte le bacchette che ogni studente ha avuto, il massimo accanto a studente diventa N, e la cardinalità (1,N).

Lo studente possiede una o più bacchetteL'entità studente, con nome e anno, è collegata all'entità bacchetta, con legno, nucleo e lunghezza, dall'associazione possiede. Accanto a studente la cardinalità è (1,N), accanto a bacchetta (1,1).studentenomeannobacchettalegnonucleolunghezzapossiede(1,N)(1,1)

Nel diagramma è cambiato un carattere, da 1 a N. Nel database è cambiata la struttura. Con il massimo a 1, legno, nucleo e lunghezza potrebbero stare nella riga dello studente, una volta sola; se convenga oppure no, lo vedremo nel capitolo 3. Con il massimo a N, nella riga di Ron servirebbero due legni, due nuclei e due lunghezze, e una cella di una tabella contiene un valore solo: perché, lo spiega la prima lezione del capitolo 3. Aggiungere le colonne legno_2, nucleo_2 e lunghezza_2 sposta il problema alla terza bacchetta. Le bacchette devono stare in una tabella propria, con una riga per bacchetta e il nome del proprietario in ogni riga, come le assegnazioni del registro dei punti contengono il nome dello studente.

Il massimo risponde quindi a un’altra domanda: un’occorrenza di questa entità può comparire in più di una coppia? Anche questa risposta dipende da che cosa il database registra, la bacchetta di adesso o tutte quelle avute.

Uno a uno, uno a molti, molti a molti​

I massimi dei due lati danno il nome al tipo di associazione:

  • uno a uno (1:1), con il massimo 1 da tutti e due i lati, come possiede quando registra solo la bacchetta di adesso;
  • uno a molti (1:N), con il massimo 1 da un lato e N dall’altro, come appartiene e come possiede quando registra tutte le bacchette;
  • molti a molti (N:N), con il massimo N da tutti e due i lati, come l’associazione fra studenti e corsi: ogni studente segue più corsi, e ogni corso ha più studenti.

I minimi non entrano nel nome. L’associazione dirige è uno a uno: ogni casa ha esattamente un direttore, (1,1), e ogni professore dirige al massimo una casa, (0,1). Il minimo 0 accanto a professore serve a Silente, che è il preside e non dirige nessuna casa, e a ogni professore che non ne dirige una.

La casa è diretta da un professoreL'entità casa è collegata all'entità professore dall'associazione dirige. Accanto a casa la cardinalità è (1,1), accanto a professore (0,1).casanomecolorianimaleprofessorenomemateriadirige(1,1)(0,1)

Le associazioni molti a molti hanno problemi tutti loro, e li vedremo in una lezione dedicata, più avanti in questo capitolo. Prima serve un modo per distinguere senza ambiguità le occorrenze che le coppie nominano.

Mettiti alla provaDomanda 1 / 3

Un compagno disegna l’associazione appartiene con (0,N) accanto a studente e (1,1) accanto a casa. Che cosa dice il suo diagramma?

Scegli la risposta corretta