La terza forma normale

La Terza Forma Normale



Questa è la terza parte della serie, Five Normal Forms. I titoli delle prime due parti (tutorial) sono First Normal Form, seguito da Second Normal Form. In questa parte della serie viene spiegata la Terza Forma Normale.

La spiegazione segue la trama: un padre è morto e ha lasciato dei soldi per suo figlio. Il figlio ha deciso di investire i soldi in un minimarket. Un minimarket, noto anche come minimarket, è una piccola attività di vendita al dettaglio che riceve articoli di uso quotidiano dai fornitori e li vende ai singoli clienti del quartiere.







A questo punto il negozio è già rifornito, e sono già state effettuate alcune vendite. Il figlio, che è il titolare dell'attività, ha dei dipendenti, che in questo tutorial vengono chiamati impiegati. Il titolare e l'eventuale dipendente possono ricevere forniture ed effettuare vendite previa registrazione dei prodotti.



Tuttavia, prima che il negozio iniziasse, né il titolare né i dipendenti sapevano nulla di forme normali. Quindi, stavano registrando tutto come transazioni in una tabella e in un quaderno. Non avevano un computer.



Tu, il lettore, hai completato le cinque parti di questa serie di tutorial; ora sei uno sviluppatore di database. Il proprietario del minimarket è tuo amico. Hai visitato il negozio due giorni fa e hai addestrato il proprietario e gli impiegati a produrre un tavolo nella sua prima forma normale. Ieri hai anche visitato il negozio e li hai istruiti su come creare un tavolo nella seconda forma normale dalla prima forma normale.





Oggi sei appena arrivato in negozio per una visita per addestrarli su come produrre un tavolo nella terza forma normale dalla seconda forma normale. Tutte le tabelle che hanno attualmente sono nella seconda forma normale. Le tabelle (per nome e intestazioni di colonna) sono:

Prodotti(IDprodotto, IDcategoria, prodotto)
Categorie(IDcategoria, categoria)



Vendite(saleID, cliente, dipendente, data)
Dettagli vendita(saleID, productID, numeroVenduto, prezzo di vendita)

Ordini (orderID, fornitore, dipendente, data)
OrderDetails(orderID, productID, numberBought, costPrice)

Le chiavi singole o composte sono sottolineate.

Dopo aver riassunto quanto insegnato nei due giorni precedenti e prima che tu potessi fare qualsiasi cosa, il titolare chiede:

“E i numeri di telefono, indirizzi, ecc., per clienti e dipendenti?

E per quanto riguarda la quantità in magazzino, il livello di riordino, ecc. per i prodotti?
Hanno bisogno dei loro tavoli separati o dovrebbero essere inseriti nei tavoli attuali?

Tu, lo sviluppatore del database, rispondi:

“Congratulazioni, proprietario! Lei ha indirettamente introdotto la questione della Terza Forma Normale.

Continua tu.

Altre colonne necessarie

Altre colonne necessarie vengono prima aggiunte alle tabelle precedenti, che sono in 1NF e 2NF. Alcuni dei nomi delle colonne precedenti sono stati modificati.

Come minimo, la tabella Categorie dovrebbe avere le seguenti colonne:

Categorie(categoryID, categoryName, descrizione)

La descrizione è un breve paragrafo che descrive la categoria. Questa tabella delle categorie è già in 1NF, 2NF e 3NF. Il 3NF è spiegato di seguito:

Come minimo, la tabella Prodotti dovrebbe avere le seguenti colonne:

Prodotti(IDprodotto, IDcategoria, IDfornitore, NomeProdotto, PrezzoUnità, QuantitàInStock, ReorderLevel)

Poiché ogni prodotto viene venduto, verrà raggiunto un livello basso (numero) di prodotti quando il prodotto dovrà essere riordinato, quindi i clienti non dovrebbero venire in negozio e non avere il prodotto. Tale assenza non fa bene agli affari. quantityInStock è il numero di un particolare prodotto in magazzino. Ciò include ciò che è nel negozio e ciò che è sullo scaffale.

categoryID e supplierID sono chiavi esterne. Questo è il motivo per cui hanno la sottolineatura del trattino invece della sottolineatura singola. La chiave esterna è spiegata di seguito. Nella parte precedente della serie (Second Normal Form), categoryID faceva parte della chiave primaria con una singola sottolineatura a causa di come era arrivato. Tuttavia, dalla spiegazione seguente, sarebbe chiaro che l'IDcategoria dovrebbe essere una chiave esterna (con un trattino sottolineato).

Questa tabella dei prodotti è già in 1NF, 2NF e 3NF. Scopri perché è in 3NF di seguito:

Come minimo, la tabella SaleDetails dovrebbe avere le seguenti colonne:

SaleDetails(saleID, productID, unitSellingPrice, quantity, discount)

Il valore di sconto dovrebbe essere pari a zero per la maggior parte del tempo. Uno sconto è lo sconto che il negozio offre a un cliente.

Come minimo, la tabella OrderDetails dovrebbe avere le seguenti colonne:

OrderDetails(orderID, productID, unitCostPrice, quantity, discount)

Il valore di sconto dovrebbe essere pari a zero per la maggior parte del tempo. Lo sconto qui è lo sconto che il fornitore concede al negozio.

Come visto di seguito, la tabella Prodotti può essere considerata in 2NF o 3NF. Le tabelle Sales e Order hanno il problema di 3NF. Verrà utilizzata solo la tabella delle vendite per spiegare il problema e la soluzione. Il 3NF per la tabella degli ordini e la tabella dei prodotti seguono un ragionamento simile e verrebbero semplicemente citati.

Durante l'aggiunta di colonne, la tabella Sales sarebbe:

Vendite(IDvendita, dataCliente vendutoNome, telefono, indirizzo, città, regione, CAP, Paese, impiegato)

Sette colonne hanno sostituito la colonna del cliente nella tabella originale. Poiché i clienti sono persone del quartiere, le celle per le colonne città, regione (stato), codice postale e paese possono essere lasciate vuote, anche se non lo sono in questo articolo.

Questa tabella delle vendite è ancora in 2NF poiché le regole 1NF e 2NF non sono state violate. Tuttavia, è necessario tenere presente che in una riga della tabella delle vendite, il cliente (nome) è stato sostituito da sette celle della riga del cliente.

Nota: una cella dell'indirizzo ha il numero civico, il nome della via o strada, e il nome della città, tutti separati da virgole. Una città può essere considerata come composta da più città. Sebbene le virgole separino questi particolari componenti della stringa, formano un valore di cella e non tre valori di cella.

Anche la colonna dei dipendenti deve essere sostituita da sette colonne di questo tipo. Tuttavia, ciò non viene fatto in questo tutorial per risparmiare tempo e spazio di insegnamento. Quindi, una tabella Sales con dati può essere:

Tabella delle vendite – 2NF – Senza customerID

La colonna SaleID del tipo di dati è un numero intero o, meglio, con incremento automatico. Il tipo di dati della colonna dateSold è una data e non un numero perché contiene il carattere '/', che non è una cifra. Il tipo di dati per il resto delle colonne, inclusa la colonna telefono, è stringa (o testo). Il valore del telefono ha il carattere '-', che non è una cifra.

Si noti che per ogni riga cliente (nome), come nella parte precedente della serie, è stata sostituita da sette celle, una delle quali è ancora cliente-nome. Ciò significa che i dati dei clienti sono un'entità. Attualmente, il nome-cliente identifica i suoi altri sei dati di fila. Se questa tabella è programmata, sarà conveniente identificare l'entità cliente in ogni riga con un numero intero (non auto-incremento). In tal caso, una colonna customerID deve precedere customerName. La tabella precedente diventa:

Tabella delle vendite - 2NF - Con customerID

Esistono tre ID cliente: 1, 2 e 3, con 1 che ricorre cinque volte per John Smith, 2 che ricorre due volte per James Taylor e 3 che ricorre una volta per Susan Wright.

Si noti che alcuni ID cliente e i relativi dipendenti si ripetono.

Regole per la terza forma normale

Un tavolo è in Terza Forma Normale se rispetta le seguenti regole:

  1. Dovrebbe essere già nella Seconda Forma Normale.
  2. E non dovrebbe avere dipendenza transitiva.

Quindi uno degli impiegati (impiegati) chiede: 'Cos'è una dipendenza transitiva?'. E tu, lo sviluppatore del database, rispondi: 'Questa è una buona domanda!'

Dipendenza transitiva

È vero che in una riga SaleID identifica tutti i valori nella riga; tuttavia, customerID identifica i suoi sette valori di dati ma non identifica il resto dei valori identificati da SaleID in quella riga. In altre parole, il SaleID dipende da dieci valori di cella in ogni riga. Tuttavia, customerID dipende da sette valori di cella nella stessa riga, ma customerID non dipende da SaleID e dagli altri valori da cui dipende SaleID.

Tale dipendenza per l'ID cliente è una dipendenza transitiva. E customerID è chiamato chiave esterna ed è sottolineato da un trattino in questa serie di esercitazioni, Le cinque forme normali.

Supponiamo che un attributo non primo (valore di cella non primario) dipenda da altri attributi non primi e che l'attributo non primo in questione (ad esempio, customerID e i suoi dipendenti) non dipenda dalla chiave primaria e dal resto della cella valori nella riga. Allora questa è dipendenza transitiva.

La precedente tabella Sales con la chiave esterna e le sue dipendenze, causerebbe problemi di contabilità (anomalie).

Tabella delle vendite da 2NF a 3NF

Per risolvere il problema posto dalla chiave esterna e dai suoi dipendenti, rimuovi la chiave esterna e i suoi dipendenti, per formare una nuova tabella senza ripetizioni. Tuttavia, anche se la chiave esterna non dipende dalla chiave primaria, la chiave primaria dipende dalla chiave esterna. Quindi, una copia della chiave esterna deve rimanere nella tabella padre. La nuova tabella delle vendite, a questo punto, è conforme a 1NF, 2NF e 3NF; è una tabella padre. Anche la nuova tabella figlio della precedente tabella Sales è conforme a 1NF, 2NF e 3NF. Il nome della tabella figlio con chiave esterna e relative dipendenze è Customers. Se non è possibile trovare un nome adatto, qualcosa è andato storto nell'analisi. La nuova tabella delle vendite in 3NF è:

Tabella delle vendite finali in 3NF

Questa tabella in 3NF ha lo stesso numero di righe di quella in 2NF ma con meno colonne.

La notazione della tabella per questa tabella Sales finale in 3NF è:

Vendite(IDvendita, dataVendita, IDcliente, IDimpiegato)

Il saleID è la chiave primaria con una singola sottolineatura. customerID è una chiave esterna, con un trattino sottolineato. employeeID è anche una chiave esterna con un trattino sottolineato. Si noti che la situazione del dipendente nella tabella Sales in 2NF è la stessa della situazione del cliente. L'ID dipendente e i suoi dipendenti devono essere estratti per formare un'altra tabella; rimane una copia dell'ID dipendente.

Nota: saleID, customerID e employeeID non formano una chiave composita. saleID dipende da customerID e employeeID.

La relazione tra saleID e customerID è molti-a-uno.

La tabella dei clienti in 3NF

Questa tabella ha tre righe invece di 9 righe nella tabella 2NF Sales. In questa tabella, customerID è una chiave primaria. È uguale alla chiave esterna nella tabella Sales, ma senza ripetizioni. La chiave esterna nella tabella Sales e la chiave primaria nella tabella Customer collegano entrambe le tabelle.

Le righe ripetute nella tabella Clienti sono state rimosse per non violare 1NF.

Come il lettore può vedere, inserire una tabella in 3NF risolverebbe anche il problema delle righe ripetute (ridondanza).

La notazione della tabella per la tabella dei clienti è:

Clienti(customerID, customerName, telefono, indirizzo, città, regione, CAP, paese)

La tavola dei prodotti rivisitata

La tabella dei prodotti sopra riportata in forma di notazione è:

Prodotti(IDprodotto, IDcategoria, IDfornitore, NomeProdotto, PrezzoUnità, QuantitàInStock, ReorderLevel)

La chiave primaria qui è productID. categoryID e supplierID sono chiavi esterne. Analogamente alla tabella Cliente, è presente una tabella Categorie, in cui IDcategoria è la chiave primaria, e una tabella Fornitore, in cui IDfornitore è la chiave primaria.

Se i valori per le celle per unitPrice, quantityInStock e reorderLevel rimarranno fissi, allora la tabella Products, così com'è, è veramente in 3NF. Se questi valori cambieranno, la tabella Prodotti, così com'è, è in 2NF. In questa parte della serie di esercitazioni si presuppone che tali valori rimangano fissi nel tempo.

Tutti i tavoli

Tutti i tavoli sono ora in 3NF. Sono mostrati come:

Dipendenti (ID dipendente, nome, telefono, indirizzo, città, regione, CAP, nazione, data di nascita, data di assunzione, data di rilascio)

Fornitori (IDfornitore, nome, telefono, indirizzo, città, regione, CAP, nazione)

Prodotti(IDprodotto, IDcategoria, IDfornitore, NomeProdotto, PrezzoUnità, QuantitàInStock, ReorderLevel)
Categorie(categoryID, categoryName, descrizione)

Vendite(IDvendita, dataVendita, IDcliente, IDimpiegato)
Dettagli vendita(saleID, productID, numeroVenduto, prezzo di vendita)
Clienti(customerID, customerName, telefono, indirizzo, città, regione, CAP, paese)

Ordini (IDordine, dataVendita, IDfornitore, IDimpiegato)
OrderDetails(orderID, productID, numberBought, costPrice)

Da una sola tabella prodotta da neofiti sono state prodotte fino a nove tabelle professionali per evitare ridondanze e problemi contabili (anomalie da inserimento, cancellazione e aggiornamento). Il solo tavolo dei novizi porterebbe a perdite finanziarie.

Test del personale

A questo punto, tutti i dipendenti, compreso il titolare, avrebbero dovuto comprendere 1NF, 2NF e 3NF. Tuttavia, devono essere testati. Tutti loro, compreso il titolare, si siederanno in posti diversi e completeranno il test. Il test, composto da una domanda, durerà un'ora ed è il seguente:

Domanda: Utilizzando le regole per 1NF, 2NF e 3NF, dimostra che tutte le nove tabelle precedenti sono già in prima forma normale, seconda forma normale e terza forma normale. I clienti e i fornitori non devono essere entità reali. I dati per le tabelle dovrebbero eseguire il backup delle notazioni della tabella.

Mentre stanno completando il test, tu, come sviluppatore del database, esci per uno spuntino e una birra, per tornare dopo un'ora.

Il futuro prossimo e lontano

Mentre tu, lo sviluppatore del database, sei fuori, consideri anche quale consiglio dare loro se tutti superano il test.

Inoltre, mentre li addestravi e ora che stanno facendo il test, i clienti andavano e venivano senza essere serviti. Questo non va bene per gli affari e tu, lo sviluppatore del database, lo sai. Alcuni clienti possono andare nei negozi della concorrenza e non tornare più.

Tu, lo sviluppatore del database, hai 30 anni. Anche il proprietario, come tuo amico, ha 30 anni. Gli impiegati (impiegati) hanno un'età compresa tra i 18 e i 24 anni. Tutte le qualità di cui avevano bisogno per lavorare per il titolare erano: essere sani, saper leggere e scrivere, saper sommare, sottrarre, moltiplicare e dividere , e per essere in grado di utilizzare il computer e Internet.

Quando una tabella è in 3NF, la maggior parte delle vulnerabilità sono state rimosse dal database. Molti database commerciali non vanno oltre 3NF e le aziende o le società sono a loro agio.

Quindi, se tutti superano il test, chiederai agli impiegati di andare a continuare a lavorare. Consiglierai loro anche di risparmiare parte dei loro stipendi in modo che possano possedere i loro minimarket. Continuerai domani ad addestrare solo il titolare in 4NF e 5NF. Con la conoscenza di 4NF e 5NF, tutte le vulnerabilità note vengono rimosse.

Valutazione

Dopo un'ora, tu, lo sviluppatore del database, torni. Contrassegni i loro copioni. Un'ottima notizia! Tutti, compreso il titolare, hanno il 100% ciascuno. Evviva! Questo è eccellente!

Quindi congratulazioni a tutti voi: l'insegnante e gli studenti.

Non c'è altro da fare in questo tutorial se non concludere.

Conclusione

Una tabella è in prima forma normale se non viola nessuna delle seguenti regole:

  1. Tutte le colonne di una tabella devono avere nomi di intestazione univoci.
  2. Ogni cella deve avere un solo valore.
  3. I valori archiviati in una colonna devono essere dello stesso tipo.
  4. Le righe dovrebbero essere distinte.
  5. L'ordine delle colonne o delle righe non ha importanza.

Una tabella è in Seconda Forma Normale se non viola nessuna delle seguenti regole:

  1. La tabella deve essere già in prima forma normale.
  2. Non ci deve essere alcuna dipendenza parziale.

Una tabella è in Terza Forma Normale se non viola nessuna delle seguenti regole:

  1. Deve essere già nella Seconda Forma Normale.
  2. E non deve avere dipendenza transitiva.

Tu, lo sviluppatore del database, dici agli impiegati che hanno imparato abbastanza. Fornisci consigli e chiedi loro di tornare al lavoro e rimanere alle loro postazioni per impostazione predefinita.

Fissa un appuntamento solo con il titolare, da tenersi domani nel suo ufficio per l'addestramento su 4NF e 5NF.