Seconda forma normale le cinque forme normali

Seconda forma normale le cinque forme normali

Questo tutorial spiega la seconda forma normale, relativa al database relazionale. È la seconda parte della serie: le cinque forme normali. La spiegazione di queste cinque forme normali segue una trama, che inizia come segue: un padre è morto e ha lasciato un po 'di denaro per suo figlio. Il figlio ha deciso di usare i soldi per aprire un negozio di alimentari. Il figlio impiegava alcuni lavoratori (impiegati). Tutto nel negozio è già fornito e il personale ha iniziato a vendere ad alcuni clienti. All'inizio del funzionamento del negozio, che non è molto tempo fa, il figlio, che è il proprietario e i suoi lavoratori, non sapeva nulla delle normali forme.

Sei già un amico del figlio, il proprietario. Hai finalmente completato questa serie di tutorial su moduli normali, sai tutto sulle normali moduli e sei diventato uno sviluppatore di database. Hai visitato il negozio del tuo amico ieri e hai notato che avevano solo un tavolo delle transazioni, che non rispettava la prima forma normale. Hai quindi insegnato sia il proprietario che i suoi impiegati su come produrre la tabella delle transazioni nella prima forma normale. Hanno capito e il tavolo che ora hanno nella prima forma normale è:

Questa è la tabella delle transazioni. C'è una colonna per la chiave primaria, che è transid (auto-incremento).

Poiché qualsiasi prima forma normale può avere vulnerabilità, le hai visitate oggi (il negozio) per addestrarli sulla seconda forma normale al fine di ridurre le vulnerabilità.

Prima di iniziare a fare qualsiasi cosa, il proprietario ha chiesto:

“Questa tabella di transazione attuale non è troppo grande?

Ho sentito che le aziende che non utilizzano i computer registrano i loro dati in diversi registri.

Penso che questa tabella delle transazioni sia effettivamente composta da due tabelle di transazione più piccole, che possono avere nuovi nomi di tabella di vendita e tabella degli ordini."

Rispondi mentre sorridi:

“Sì, l'attuale tabella delle transazioni è troppo grande."

Hai continuato a congratularti con lui per essere positivamente curioso, soprattutto per quanto riguarda la sua attività. Sei d'accordo con i suoi pensieri. Continui per dire che in realtà ci sono tre tavoli principali lì: la tabella delle vendite, la tabella degli ordini e la tabella dei prodotti. Quando vengono identificate le tabelle di vendita e ordini, sostituiranno la tabella delle transazioni. La tabella di vendita e la tabella degli ordini sono tabelle di transazioni più piccole (dimezzate). La tabella dei prodotti è chiaramente un'entità. Deve essere ottenuto dalla precedente tabella delle transazioni della grande transazione.

Tuttavia, queste tre tabelle ottenute dal grande tavolo precedente sarebbero ancora nella prima forma normale. La seconda forma normale affronta il problema della ripetizione (ridondanza), e questo non è ciò che accade qui.

Nota: la seconda forma normale potrebbe non affrontare tutti i problemi di ripetizione (ridondanza).

Tu, lo sviluppatore di database e un amico del proprietario, continui a produrre le tre tabelle con la loro partecipazione come segue:

Le entità principali

Le entità principali sono le tre tabelle principali menzionate in precedenza. Nella colonna precedente, con l'intestazione, l'azione ha una vendita o un ordine. La vendita significa che il prodotto in quella riga è stato venduto a un cliente. Ordine significa che il prodotto in quella riga è stato ordinato da un fornitore. Un negozio di alimentari deve ordinare prodotti prima di venderli.

Le colonne corrispondenti alle tre tabelle sono le seguenti:

Vendite (SaleId, Product, Customer, Employee, SellingPrice)

Ordine (OrderId, Product, Fornitore, Employee, CostPrice)

Prodotti (ProductID, Product, categoria)

Ogni notazione della tabella ha una chiave primaria sottolineata. Ognuna di queste tabelle è ancora nella prima forma normale. E così, ogni numero chiave è correlato direttamente ai suoi valori di riga.

Nel tavolo delle vendite, le vendite non sono le copie dei transids. Nella tabella degli ordini, anche gli ordini non sono le copie dei transids. Ciascuna della colonna Saleid e OrderID è automatica, a partire da 1. La tabella delle transazioni e i suoi ID righe non sono più importanti poiché tutte le informazioni nella tabella delle transazioni sono ora in queste tre tabelle. Le colonne SaleID e OrderID sostituiscono la tabella delle transazioni, ma non copiando. La tabella di vendita non ha la colonna del fornitore e la tabella degli ordini non ha la colonna del cliente, che erano insieme nella tabella delle transazioni. Inoltre, nessuna tabella ha la colonna di azione da quando la vendita e l'ordinamento è ora separata e i due valori di vendita e ordine non sono più necessari.

La colonna di categoria, che era nella colonna delle transazioni, non è né nella tabella di vendita né nella tabella degli ordini. È nella tabella dei prodotti. Questo perché il valore di categoria in ogni riga è correlato solo al valore del prodotto e non all'altra cella nella riga. La colonna di categoria deve uscire dalla tabella delle transazioni insieme alla colonna del prodotto per ottenere la tabella dei prodotti. Questo ragionamento ha qualcosa a che fare con la dipendenza transitiva nella produzione della terza forma normale che sarà discussa nel prossimo tutorial.

La tabella dei prodotti ottenuta dalla tabella delle transazioni precedenti è:

Tabella dei prodotti

Si noti che questa tabella non ha alcuna ripetizione del nome del prodotto (verso il basso) che potrebbe essere stata nella tabella delle transazioni. Inoltre, è presente ogni valore del prodotto ed è presente anche ogni valore di categoria.

Questa tabella è ancora in 1nf. La dipendenza per i valori di una riga è correlata solo alla chiave primaria, finora. I valori nella colonna della categoria si ripetono quando la colonna è discendente. La pasticceria si ripete due volte. "Drink analcolico" si ripete quattro volte. Il "prodotto lattiero -caseario" si ripete tre volte. La ripetizione è ridondante e provoca problemi di contabilità. Mettere un tavolo in 2nf significa rimuovere molte ripetizioni. Questa rimozione delle ripetizioni non è eseguita arbitrariamente.

La tabella di vendita ottenuta dalla tabella delle transazioni precedenti è:

Tavolo di vendita

Vengono aggiunte quattro nuove righe e ci sono state alcune modifiche per migliorare la spiegazione. Viene introdotta una colonna di data per lo stesso motivo. Ora, ci sono 15 righe in questa tabella di vendita anziché 11 per la tabella delle transazioni.

Regole di business

Cos'è una vendita? Se lo stesso dipendente vende a un particolare cliente nella stessa data almeno un prodotto, questa è una vendita. Anche lo stesso giorno (data), se un cliente arriva due volte ed è servito da due dipendenti diversi, allora sono due vendite. Se un cliente arriva due volte lo stesso giorno ed è servito dallo stesso dipendente, anche se i due set di prodotti sono diversi, entrambi gli amici formano una vendita. In una vendita, un cliente può acquistare uno o più prodotti. In altre parole, in una vendita, il trio (cliente, dipendente e data) deve essere lo stesso. Una volta cambia uno di questi valori di trio, questa è un'altra vendita. Vendite diverse sono identificate da diversi SaleID nella tabella precedente. E così, le vendite si ripetono. Valori di colonna diversi si ripetono nelle loro colonne.

Nella prima vendita che ha due righe e la stessa Saleid, John Smith, un cliente, ha acquistato uno dolce e uno sprite di Jacob Jones nella stessa data.

La mattina del 09/06/22, James Taylor, un cliente, venne e acquistò due yogurt e una Coca-Cola. Questa è una vendita. Ci vogliono tre righe nella tabella con la stessa vendita.

Lo stesso giorno, ma nel pomeriggio, lo stesso James Taylor venne e acquistò Pepsi, ma da un dipendente diverso che è Peter Lewis. Il trio ora ha un cambiamento con un dipendente diverso. E così, questa è una vendita diversa causata da un cambiamento in uno dei trio. Poiché questa è una vendita diversa, ha una riga diversa nel tavolo con una vendita diversa.

Il 09/08/22, Susan Wright, un cliente, è venuta e ha comprato due formaggi e un latte da Mary Baker. Questa è una vendita perché il trio rimane lo stesso (nelle tre file). Tuttavia, ci vogliono tre righe nella tabella. Poiché il trio rimane lo stesso, anche la vendita rimane la stessa.

Il resto delle righe verso il basso nel tavolo non ha la stessa ripetizione di Saleid. Questa tabella è ancora in 1nf. La dipendenza finora per i valori di una riga è ancora correlata solo alla chiave primaria di quella riga. Ogni colonna ha valori ripetuti. La ripetizione in una colonna non deve necessariamente essere nelle celle consecutive che scendono.

Vedi quando considerare il prezzo o la colonna di vendetta nella sezione tutorial della gestione delle ripetizioni. Mettere una tabella in 2NF risolve il problema delle ripetizioni del set comune (ridondanza) attraverso le righe.

La tabella degli ordini ottenuta dalla tabella delle transazioni precedenti è:

Tabella degli ordini

Questa tabella è ancora nella prima forma normale. C'è la possibilità che qualsiasi valore in qualsiasi colonna si ripeta al di sotto della sua colonna. Queste ripetizioni sono affrontate in questo tutorial per avere la seconda forma normale della tabella.

A questo punto, tu, lo sviluppatore di database, concordato con il suggerimento del personale di mettere la tabella delle transazioni in tabelle più piccole. E metti la tabella delle transazioni in tabelle più piccole (entità) in modo conveniente. Il personale, incluso il loro proprietario, ora crede che anche loro abbiano il potenziale per comprendere completamente le forme normali e sono disposti a imparare di più perché il loro suggerimento si è materializzato.

Tuttavia, tu, lo sviluppatore del database, insiste per loro che la tabella delle transazioni originale non esiste più ed è stata sostituita dalle tre tabelle più piccole. Le vendite e la tabella degli ordini sostituiscono essenzialmente la tabella delle transazioni. Il transid (ID transazione) non è più rilevante. È sostituito da SaleId e OrderId in due diverse tabelle.

Le entità principali che sono ora più piccole tabelle della tabella delle transazioni originali sono: la tabella dei prodotti, la tabella delle vendite e la tabella degli ordini. Tu, lo sviluppatore di database, continui a spiegare e insisti con loro che queste tabelle nuove ma più piccole sono ancora nella prima forma normale. Sostituire una tabella con le sue principali tabelle di entità non è normalizzazione perché nessuno dei tipi di definizioni di dipendenza viene utilizzato per abbattere la tabella grande. Tu, lo sviluppatore di database, continua a mettere le tre tabelle nella seconda forma normale come segue:

Gestione delle ripetizioni

La tabella dei prodotti

Nella tabella dei prodotti, i valori della colonna di categoria si ripetono. Tutti i nomi (valori) della colonna di categoria devono essere rimossi dalla tabella dei prodotti in una tabella delle categorie in cui non vi sarebbero ripetizioni limitate. La tabella delle categorie diventa:

Tabella delle categorie

La tabella delle categorie non ha più oggetti come "bibita" che si ripete. Questa tabella è più breve verticalmente del suo posizionamento nella tabella dei prodotti precedenti.

Qualsiasi tabella ha bisogno di una chiave primaria. Finora, la tabella delle categorie è costituita da una colonna in cui tutti i valori sono univoci e non esiste un valore vuoto o un valore nullo. Questa colonna può essere la colonna chiave principale per la tabella delle categorie. Tuttavia, potrebbe essere meglio avere una chiave primaria automatica. La seguente tabella delle categorie modificate mostra questo:

Tabella delle categorie - 2nf

Questa è la tabella delle categorie finali. Ora è in 1nf e 2nf. E la tabella dei prodotti originali? È necessario creare una nuova tabella dei prodotti. Nella nuova tabella, qualsiasi nome di categoria nella tabella originale verrà sostituito dall'ID corrispondente nella tabella delle categorie. Quindi, la tabella dei prodotti diventa:

Tabella dei prodotti - 2nf

La colonna di categoria viene sostituita dalla colonna CategoryId. Le informazioni per i valori della categoria sono ancora lì nella tabella dei prodotti come categorie. La colonna di categoria viene posizionata subito dopo la colonna ProductID anziché dopo la colonna del prodotto per una migliore presentazione. Questa tabella non è più breve della tabella dei prodotti originale ma ha ancora un vantaggio.

“Qual è la chiave principale della tabella dei prodotti?"Chiesto da uno degli impiegati. Si noti che in ogni riga, ProductID e CategoryID dipendono entrambi dal valore del nome del prodotto (valore). Se il ProductID o la categoriaId vengono modificati per qualsiasi riga, la nuova combinazione di ProductID e CategoryID indicherebbe un nome di prodotto diverso (valore). In altre parole, un nome di prodotto (valore) in una riga è correlato sia a ProductID che a categoria di quella riga. A causa di questa dipendenza (dipendenza funzionale) della combinazione productid e categoryid su un determinato nome di prodotto (valore), sia ProductID che CategoryID formano la chiave primaria.

Quando una chiave è una combinazione di più di una colonna, la chiave è chiamata chiave composita. La notazione della tabella per questa tabella di nuovi prodotti è:

Prodotti (ProductID, CategoryId, Product)

La relazione tra ProductID e CategoryId è molti a uno.

Ogni nome di colonna per la chiave primaria (tasto composito questa volta) è sottolineato. I valori di categoriaID nella tabella dei prodotti e i valori di categorie nella tabella delle categorie rendono le corrispondenze esatte tra le due tabelle.

La notazione della tabella per la tabella delle categorie è:

Categorie (categoriaId, categoria)

Le nuove tabelle che hanno sostituito la tabella dei prodotti originali sono: Tabella delle categorie e prodotti (stesso nome). Queste tabelle sono ora nella prima forma normale e nella seconda forma normale. Vedere le regole effettive per la seconda forma normale nella discussione seguente.

Il tavolo delle vendite

Le sezioni di riga in cui il SaleID si ripete ma i valori della cella della colonna non si ripetono, devono essere rimosse dalla tabella di vendita ed essere posizionate in una nuova tabella. Nella nuova tabella, le identiche sezioni di riga (colonne) in cui i valori della cella si ripetono insieme a SaleID nella tabella di vendita non saranno inclusi. Cioè, qualsiasi valore cellulare o sezione a righe come il trio (cliente, dipendente e data) che deve ripetere con la stessa vendita nella tabella delle vendite non sarà incluso nella nuova tabella anche se la ripetizione è solo una volta. I valori della colonna del prodotto che possono cambiare con la stessa vendita nella tabella delle vendite devono trovarsi nella nuova tabella. Viene introdotta una nuova colonna che ha il numero degli stessi prodotti venduti per una particolare vendita. Che mantiene la nuova tabella in 1nf, portandola al 2NF. La nuova tabella si chiama Tabella SaleEtails. Se lo sviluppatore non riesce a trovare un nuovo nome adatto per il nuovo tavolo, qualcosa è andato storto nella sua analisi. La tabella di Saledetails diventa:

Saledetails - 2nf

La tabella di SaleEtails, rimossa dalla tabella delle vendite, è ora nella seconda forma normale e ancora nella prima forma normale. La vendita di vendita dalla tabella di vendita originale deve essere incluse nella tabella di SaleEtails al fine di mantenere la relazione tra la tabella di vendita originale e la nuova tabella di Saledetails. Ora, ci sono 13 righe nella tabella di SaleEtails anziché 15 dalla tabella di vendita originale.

Nella tabella di vendita originale, qualsiasi colonna il cui valore non è cambiato, mentre la vendita non è cambiata, è rimasta nella tabella di vendita originale e non è stata rimossa. Questi sono essenzialmente il trio (cliente, dipendente e data) in questa situazione. I valori della colonna del prodotto sono cambiati mentre la vendita non è cambiata, quindi deve essere rimossa. Se i valori del prezzo o della colonna di vendita di venduti cambiano mentre la vendita non sta cambiando, deve anche essere rimosso.

Venerebbero tutti in un negozio e comprerebbero solo una scatola di latte? NO. Per tutti i clienti che acquistano, diciamo 4 latte di latte, il numero 4 si adatterebbe bene alla colonna Numberold nella riga appropriata.

“E qual è la chiave principale della nuova tabella di Saledetails?"Chiesto dal proprietario. Questa è la tua risposta come sviluppatore di database:

Si noti che in ogni riga, SaleId e Product dipendono entrambi da Numerold e SellingPrice (Valori). Se SalesID o il nome del prodotto viene modificato per qualsiasi riga, la nuova combinazione di SaleID e il prodotto punta a una riga diversa di Numberold e SellingPrice. In altre parole, una riga di Numberold e SellingPrice è correlata sia ai valori di SaleID che al prodotto di quella riga. A causa di questa dipendenza (dipendenza funzionale) della combinazione SalesID e Product su una determinata riga, sia il SalesID che il prodotto formano la chiave primaria. Anche il prodotto dovrebbe essere sottolineato.

Quando una chiave è una combinazione di più di una colonna, la chiave è chiamata chiave composita. La notazione della tabella per questa nuova tabella di SaleEtails è:

SaleEtails (Saleid, Product, Numberold, SellingPrice)

La relazione tra SalesID e Prodotto è da molti a molti.

“Ho intenzione di informatizzare il database. Poiché una tabella dei prodotti esiste già con ProductID, non sarebbe meglio sostituire il prodotto come parte della chiave con ProductID? Quindi il computer utilizzerà il productID dalla tabella di SaleEtails e cercherà il nome del prodotto dalla tabella dei prodotti ", osserva il proprietario.

Tu, lo sviluppatore e l'allenatore del database, sorride mentre annuirai. E questa è la tua risposta:

“Proprietario, stai bene. Stai capendo più velocemente di quanto mi aspettassi. Quando un database sarà solo nei libri di allenamento (registri), ove possibile, avrà nomi di testo anziché ID numerati. Quando un database sarà su un computer, ove possibile, avrà ID numerati anziché nomi di testo. Il computer collegherà gli ID numerati e i nomi di testo nelle loro tabelle e stampa i nomi di testo quando viene emessa una query.

Vorrei avere l'onore di fare l'informatizzazione; Ma per l'informatizzazione, mi pagherai."E così, la notazione della tabella per la tabella di Saledetails diventa:

SaleEtails (SaleId, ProductID, Numberold, SellingPrice)

“Ciò che rimane del tavolo delle vendite?"Chiesto da uno degli impiegati. Le colonne i cui valori non sono cambiati mentre la vendita non cambiava rimaneva nella tabella delle vendite. La svendita rimane anche perché "governa" ogni riga nella tabella delle vendite. Il nuovo tavolo di vendita diventa:

Tabella delle vendite - intermedio

Il prodotto e le colonne di vendita di prezzi in cui vi è stato un cambiamento di valore mentre la vendita non è stata rimossa sono state rimosse. Ora, ci sono chiaramente alcune righe complete duplicate. Tali duplicati sono già stati contati e registrati nella tabella di Saledetails nella colonna Numberold. Nella tabella di SaleEtails effettivi, il conteggio è 2 o 1. Quindi, i duplicati non devono essere presi in considerazione nel nuovo tavolo di vendita. Se i duplicati fossero consentiti, una delle regole della prima forma normale verrebbe violata. Il nuovo tavolo di vendita diventa:

Tabella delle vendite - 2nf

Questo tavolo di vendita nuovo e finale è nel 2NF e ancora in 1NF. Nessuna svendita si verifica più di una volta in questa tabella. Ci sono 10 righe qui e non 15, rispetto alla tabella di vendita originale. Questo nuovo tavolo di vendita è più breve dell'originale per cinque righe.

Questa tabella di vendita finale ha solo una colonna chiave principale che è la vendita. È sottolineato. I valori SaleID nella tabella di vendita e nei valori di vendita nella tabella di Saledetails rendono le corrispondenze esatte tra le due tabelle.

La notazione della tabella per la tabella delle vendite è:

Vendite (Saleid, Cliente, dipendente, Data)

E la notazione della tabella per la tabella di SaleEtails è:

SaleEtails (SaleId, ProductID, Numberold, SellingPrice)

Le nuove tabelle che hanno sostituito la tabella di vendita originali sono: Tabella e tabella di vendita di Saledetails (stesso nome). Queste tabelle sono ora nella prima forma normale e nella seconda forma normale. Vedi le regole effettive per la seconda forma normale nella discussione seguente:

La tabella degli ordini

L'analisi simile a quella per la tabella di vendita può essere fatta affinché la tabella degli ordini abbia le nuove tabelle di sostituzione:

Order (orderid, fornitore, dipendente, data)

E

OrderDetails (OrderId, ProductID, Numberbought, CostPrice)

A questo punto, tu, lo sviluppatore di database, ha appena finito di illustrare ai membri dello staff, incluso il proprietario su come il 2NF viene prodotto dal 1NF.

Il proprietario ora chiede: “È il modo in cui formare le tabelle 2NF dalla tabella 1NF?"Tu, lo sviluppatore di database, risponde come segue:

"Beh si. Tuttavia, qualunque sia il modo in cui usi per formare un 2NF dal 1NF deve attenersi alle regole del 2NF."Quindi continui a spiegare le regole del 2NF.

Regole per la seconda forma normale

Perché una tabella sia nella seconda forma normale, deve rispettare le seguenti due regole:

1) La tabella deve essere già nella prima forma normale.

2) Non ci deve essere dipendenza parziale.

La dipendenza funzionale o semplicemente la dipendenza è spiegata nella parte precedente della serie, la prima forma normale. La spiegazione viene brevemente ripetuta qui e quindi la dipendenza parziale verrà spiegata.

Dipendenza funzionale

In qualsiasi tabella nella prima forma normale, una volta nota una chiave primaria, è possibile prendere il resto dei valori nella riga della chiave primaria. Ad esempio, nella prima tabella dell'esempio precedente, i valori per la chiave primaria numero 10 sono: dentifricio, articoli da toeletta, società di pulizia, Peter Lewis, ordine e 4. Quindi, il numero chiave 10 dipende da questi valori. Una chiave primaria identifica in modo univoco tutti i suoi valori.

Dipendenza parziale

La dipendenza parziale è una situazione con la chiave composita in cui un valore chiave non primario di riga può avere solo una parte della chiave composita, e.G. una delle sue cellule a seconda di essa. Nelle tabelle precedenti con tasti compositi, ogni valore della chiave non primario in una riga ha entrambe le celle della chiave primaria a seconda di essa. La seconda regola per il 2NF dice che non ci deve essere dipendenza parziale. E non esiste una dipendenza parziale in nessuna delle tabelle precedenti.

Entrambe le celle della chiave composita dipendono da ciascun valore nella riga per tutte le tabelle sopra con tasti compositi. Se fosse una dipendenza parziale, una cella nella chiave composita dipenderebbe da alcuni valori nella riga e l'altra cella della chiave composita dipenderebbe dagli altri valori della stessa riga.

Produzione di 2NF dalla tabella dei prodotti e dalla tabella di vendita rispetto

La tabella dei prodotti ha un limite di lunghezza (che scende verso il basso). La tabella di vendita non ha un limite di lunghezza perché è una tabella delle transazioni. Tuttavia, questa differenza non è ciò che fornisce necessariamente a entrambe le tabelle i loro diversi modi per ottenere le tabelle 2NF.

Nella tabella dei prodotti 1NF data, le categorie si ripetono verso il basso. La colonna di categoria viene rimossa per formare una nuova tabella di lunghezza limitata e la chiave composita va alla tabella principale, la tabella dei prodotti.

Nella tabella di vendita 1NF fornita, il set di SaleId e corrispondente di altre celle della stessa riga si ripetono verso il basso. Le colonne piuttosto non ripetute sono state rimosse per formare una nuova tabella e la chiave composita va alla tabella dei bambini, la tabella di Saledetails. Sia le vendite che le tabelle di Saledetails sono di lunghezze illimitate.

A questo punto, tu, lo sviluppatore di database che addestra il personale, incluso il proprio proprietario, chiede a tutti loro di verificare se tutte le nuove tabelle sono veramente nella prima e nella seconda forma normale. Dovrebbero farlo con successo e rispondere a sì.

E poi, concludi.

Conclusione

Una tabella si trova nella seconda forma normale se si rispetta le seguenti regole:

1) La tabella deve essere già nella prima forma normale.

2) Non ci deve essere dipendenza parziale.

Per tutte le tabelle con chiavi primarie composite, tutti i valori della chiave non primaria in una riga determinano ciascuno del valore della chiave primaria di quella riga.

Prendere una tabella da 1NF a 2NF implicherebbe la gestione di un importante gruppo ripetuto (insieme di cellule).

Sebbene alcune vulnerabilità siano state eliminate, una tabella del 2NF ha ancora altre vulnerabilità. Più di queste vulnerabilità saranno trattate nel prossimo tutorial (articolo) sulla terza forma normale.

Dalle domande che i membri dello staff stanno ponendo e il feedback da loro, dimostra che hanno capito tutto ciò che è stato insegnato finora. Devi congratularti con loro prima di partire e tornare di nuovo a discutere della terza forma normale.