Questa è la terza parte della serie, cinque forme normali. I titoli delle prime due parti (tutorial) sono la prima forma normale, seguita dalla seconda forma normale. 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 tutti i giorni dai fornitori e li vende ai singoli clienti del quartiere.
A questo punto, il negozio è già fornito e alcune vendite sono già state effettuate. Il figlio, proprietario del business, ha alcuni dipendenti, che sono chiamati impiegati in questo tutorial. Il proprietario e qualsiasi dipendente possono ricevere forniture e effettuare vendite dopo aver registrato i prodotti.
Tuttavia, prima dell'inizio del negozio, né il proprietario né i dipendenti sapevano nulla sulle forme normali. Quindi, stavano registrando tutto come transazioni in una tabella e un libro di allenamento. 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 negozio di alimentari è tuo amico. Hai visitato il negozio due giorni fa e hai formato il proprietario e gli impiegati per produrre un tavolo nella sua prima forma normale. Hai anche visitato il negozio ieri e li hai allenati su come creare un tavolo nella seconda forma normale dalla prima forma normale.
Oggi sei appena arrivato al negozio per una visita per addestrarli su come produrre un tavolo nella terza forma normale dalla seconda forma normale. Tutte le tabelle che hanno al momento sono nella seconda forma normale. Le tabelle (per nome e intestazioni di colonne) sono:
Prodotti (ProductID, CategoryId, Product)
Categorie (categoriaId, categoria)
Vendite (Saleid, Cliente, dipendente, Data)
SaleEtails (SaleId, ProductID, Numberold, SellingPrice)
Ordini (orderid, fornitore, dipendente, data)
OrderDetails (OrderId, ProductID, Numberbought, CostPrice)
Le chiavi singoli o composite sono sottolineate.
Dopo aver riassunto ciò che è stato insegnato nei due giorni precedenti e prima che tu potessi fare qualsiasi cosa, il proprietario chiede:
“Che dire dei numeri di telefono, degli indirizzi, ecc., per clienti e dipendenti?
Che dire della quantità in magazzino, a livello di riordino, ecc., per prodotti?
Hanno bisogno delle loro tabelle separate o se dovessero essere inseriti nei tavoli attuali?"
TU, lo sviluppatore di database, Risposta:
“Congratulazioni, proprietario! Hai introdotto indirettamente il problema della terza forma normale."
Continua tu.
Altre colonne necessarie
Altre colonne necessarie vengono aggiunte per la prima volta alle tabelle precedenti, che sono in 1NF e 2NF. Alcuni dei nomi di colonne precedenti sono modificati.
Come minimo, la tabella delle categorie dovrebbe avere le seguenti colonne:
Categorie (categoriaId, categoria nome, 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 dei prodotti dovrebbe avere le seguenti colonne:
Prodotti (ProductID, CategoryId, SupplierId, ProductName, UnitPrice, QuantityInstock, ReorderLevel)
Man mano che ogni prodotto viene venduto, verrà raggiunto un livello basso (numero) dei prodotti quando il prodotto deve essere riordinato, quindi i clienti non dovrebbero venire al negozio e non avere il prodotto. Tale assenza non fa bene agli affari. QuantityInstock è il numero di un particolare prodotto in stock. Questo include ciò che è nel negozio e ciò che è sullo scaffale.
CategoryId e SupplierId sono chiavi straniere. Ecco perché hanno un sottolineatura anziché sottolinea. La chiave estera è spiegata di seguito. Nella parte precedente della serie (seconda forma normale), CategoryID faceva parte della chiave primaria con una singola sottolineatura a causa di come è stato arrivato. Tuttavia, dalla spiegazione seguente, sarebbe chiaro che la categoriaid dovrebbe essere una chiave esterna (con un sottolineatura).
Questa tabella dei prodotti è già in 1NF, 2NF e 3NF. Scopri perché è nel 3NF di seguito:
Come minimo, la tabella di Saledetails dovrebbe avere le seguenti colonne:
SaleEtails (SaleId, ProductID, Unitselling Price, quantità, sconto)
Il valore di sconto dovrebbe essere 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, quantità, sconto)
Il valore di sconto dovrebbe essere zero per la maggior parte del tempo. Lo sconto qui è lo sconto che il fornitore offre al negozio.
Come visto di seguito, la tabella dei prodotti può essere considerata in 2NF o 3NF. Le tabelle di vendita e ordini hanno il problema di 3nf. Solo il tavolo di vendita verrà utilizzato per spiegare il problema e la soluzione. La tabella 3NF per gli ordini e la tabella dei prodotti seguono un ragionamento simile e verrebbe appena citato.
Durante l'aggiunta di colonne, la tabella delle vendite sarebbe:
Vendite (SaleId, Datedold CustomerName, Telefono, Indirizzo, Città, Regione, Capo postale, Paese, Employe)
Sette colonne hanno sostituito la colonna del cliente nella tabella originale. Poiché i clienti sono persone nel quartiere, le celle per la città, la regione (stato), il codice postale e le colonne di campagna, possono essere lasciate vuote, sebbene non siano lasciate vuote in questo articolo.
Questo tavolo di vendita è ancora in 2NF poiché entrambe le regole 1NF e 2NF non sono state violate. Tuttavia, si dovrebbe realizzare che in una riga della tabella di vendita, il cliente (nome) è stato sostituito da sette celle di riga del cliente.
Nota: una cella di indirizzo ha il numero della casa, il nome di strada o la strada e il nome della città, tutti separati dalle virgole. Una città può essere considerata come composta da diverse città. Sebbene le virgole separassero questi particolari componenti della stringa, formano un valore di cella e non tre valori di celle.
La colonna dei dipendenti deve anche essere sostituita da sette di queste colonne. Tuttavia, ciò non è fatto in questo tutorial per risparmiare tempo e spazio. Quindi, una tabella di vendita con i dati può essere:
Tabella delle vendite - 2NF - Senza customerid
La colonna SaleID TIPO DATI è un numero intero o, migliore, incremento automatico. Il tipo di dati della colonna Datedold è una data e non un numero perché ha il carattere "/", che non è una cifra. Il tipo di dati per il resto delle colonne, inclusa la colonna del telefono, è stringa (o testo). Il valore del telefono ha il carattere "-", che non è una cifra.
Si noti che per ogni riga, il cliente (nome), come era nella parte precedente della serie, è stato sostituito da sette celle, una delle quali è ancora il nome del cliente. Ciò significa che i dati dei clienti sono un'entità. Attualmente, il nome cliente identifica i suoi altri sei dati di riga. Se questa tabella è programmata, sarà conveniente identificare l'entità del cliente in ogni riga con un numero intero (non automatico). In tal caso, una colonna CustomerID dovrebbe precedere il CustomerName. La tabella precedente diventa:
Tabella delle vendite - 2NF - con CustomerID
Ci sono tre clienti: 1, 2 e 3, con 1 che si verificano cinque volte per John Smith, 2 che si verificano due volte per James Taylor e 3 che si verificano una volta per Susan Wright.
Si noti che alcuni clienti e i loro dipendenti si ripetono.
Regole per la terza forma normale
Una tabella è in terza forma normale se rispetta le seguenti regole:
Quindi uno degli impiegati (dipendenti) chiede: “Che 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. Metti in altro modo, la svendita dipende da dieci valori delle celle in ogni riga. Tuttavia, il CustomerID dipende da sette valori di celle nella stessa riga, ma il cliente non dipende dalla vendita e dagli altri valori da cui SaleID dipende.
Tale dipendenza per il Custumeride è dipendenza transitiva. E CustomerID è chiamato una chiave esterna ed è sottolineato in questa serie di tutorial, le cinque forme normali.
Supponiamo che un attributo non principio (valore cellulare non primario) dipenda da altri attributi non prime e dall'attributo non prime in questione (e.G., CustomerId e i suoi dipendenti) non dipende dalla chiave primaria e dal resto dei valori della cella nella riga. Allora questa è dipendenza transitiva.
La precedente tabella di vendita con la chiave estera e i suoi dipendenti, causerebbe problemi contabili (anomalie).
Tabella delle vendite dal 2NF a 3NF
Per risolvere il problema posto dalla chiave estranea e dai suoi dipendenti, rimuovere la chiave estranea 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 principale. Il nuovo tavolo di vendita, a questo punto, è conforme 1NF, 2NF e 3NF; È una tabella dei genitori. La nuova tabella dei bambini dalla tabella di vendita precedente è anche 1NF, 2NF e 3NF conformi. Il nome della tabella dei bambini con chiave estera e i suoi dipendenti, sono i clienti. Se non è possibile trovare un nome adatto, allora qualcosa è andato storto con l'analisi. Il nuovo tavolo di vendita in 3NF è:
Tabella di vendita finale 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 di vendita finale in 3NF è:
Vendite (Saleid, Datedold, CustomerId, EmployeeID)
La svendita è la chiave principale con un singolo sottolinea. CustomerId è una chiave esterna, con un trattino sottolineato. EmployeeID è anche una chiave estera con un trattino sottolineato. Si noti che la situazione dei dipendenti nella tabella delle vendite nel 2NF è la stessa della situazione del cliente. Il dipendente e i suoi dipendenti devono essere tirati fuori per formare un altro tavolo; Una copia del dipendente rimane.
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 di vendita 2NF. In questa tabella, CustomerId è una chiave primaria. È la stessa della chiave estera nella tabella delle vendite, ma senza ripetizioni. La chiave esterna nella tabella delle vendite e la chiave primaria nella tabella dei clienti collegano entrambe le tabelle.
Le righe ripetute nella tabella dei clienti sono state rimosse per non violare 1NF.
Come può vedere il lettore, mettere 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, Codice postale, Paese)
La tabella dei prodotti rivisitati
La tabella dei prodotti sopra indicata in forma di notazione è:
Prodotti (ProductID, CategoryId, SupplierId, ProductName, UnitPrice, QuantityInstock, ReorderLevel)
La chiave principale qui è productid. CategoryId e SupplierId sono chiavi straniere. Simile alla tabella dei clienti, esiste una tabella di categorie, in cui CategoryId è la chiave primaria e esiste una tabella dei fornitori, in cui FornitierID è la chiave primaria.
Se i valori per le celle per unità, la quantità diinstock e il livello di riordino rimarranno fissi, la tabella dei prodotti, così com'è, è veramente in 3NF. Se questi valori cambieranno, allora la tabella dei prodotti, così com'è, è nel 2NF. In questa parte della serie di tutorial, si presume che tali valori rimangano fissi nel tempo.
Tutti i tavoli
Tutti i tavoli sono ora in 3nf. Sono mostrati come:
Dipendenti (dipendenti, nome, telefono, indirizzo, città, regione, codice postale, paese, data di nascita, assunzione, dateleased)
Fornitori (fornitoreid, nome, telefono, indirizzo, città, regione, codice postale, paese)
Prodotti (ProductID, CategoryId, SupplierId, ProductName, UnitPrice, QuantityInstock, ReorderLevel)
Categorie (categoriaId, categoria nome, descrizione)
Vendite (Saleid, Datedold, CustomerId, EmployeeID)
SaleEtails (SaleId, ProductID, Numberold, SellingPrice)
Clienti (CustomerID, CustomerName, Telefono, Indirizzo, Città, Regione, Codice postale, Paese)
Ordini (OrderId, Datedold, SupplierId, EmployeeID)
OrderDetails (OrderId, ProductID, Numberbought, CostPrice)
Fino a nove tabelle professionali sono state prodotte da una sola tabella prodotta dai novizi per prevenire la ridondanza e i problemi di contabilità (anomalie dall'inserto, elimina e aggiorna). La sola tavola principiante comporterebbe perdite finanziarie.
Testare il personale
A questo punto, tutti i dipendenti, incluso il proprietario, avrebbero dovuto comprendere 1NF, 2NF e 3NF. Tuttavia, devono essere testati. Tutti, incluso il proprietario, siederanno in luoghi diversi e completeranno il test. Il test composto da una domanda, richiederà un'ora ed è il seguente:
Domanda: usando le regole per 1nf, 2nf e 3nf, dimostra che tutte le nove tabelle sopra 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 stai completando il test, tu, come sviluppatore di database, esci per fare uno spuntino e una birra, per tornare dopo un'ora.
Il prossimo e lontano futuro
Mentre tu, lo sviluppatore di database, sei fuori, consideri anche quale consiglio dare loro se tutti superano il test.
Inoltre, mentre li stavi addestrando e ora che stanno facendo il test, i clienti sono venuti e se ne vanno senza essere serviti. Non va bene per gli affari e tu, lo sviluppatore di database, lo sapete. Alcuni clienti potrebbero andare nei negozi di concorrenza e non tornare mai più.
Tu, lo sviluppatore di database, ha 30 anni. Il proprietario, come tuo amico, ha anche 30 anni. Gli impiegati (dipendenti) hanno un'età compresa tra 18 e 24 anni. Tutte le qualità di cui avevano bisogno per lavorare per il proprietario erano: essere sani, essere in grado di leggere e scrivere, essere in grado di aggiungere, sottrarre, moltiplicare e dividere e 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 il 3NF e le aziende o le aziende sono a proprio agio.
Quindi, se tutti superano il test, chiederai agli impiegati di andare e continuare a lavorare. Ti consiglierai anche di salvare parti dei loro stipendi in modo che possano possedere i loro negozi di alimentari. Continuerai domani per addestrare solo il proprietario in 4nf e 5nf. Con la conoscenza di 4NF e 5NF, tutte le vulnerabilità note vengono rimosse.
Valutazione
Dopo un'ora, tu, lo sviluppatore di database, torna. Segnali i loro script. Un pezzo di eccellente notizia! Tutti, incluso il proprietario, hanno il 100% ciascuno. Evviva! Questo è eccellente!
Quindi congratulazioni a tutti voi: l'insegnante e gli studenti.
Non c'è più niente da fare in questo tutorial se non per concludere.
Conclusione
Una tabella è in prima forma normale, se non viola nessuna delle seguenti regole:
Una tabella è in seconda forma normale, se non viola nessuna delle seguenti regole:
Una tabella è in terza forma normale, se non viola nessuna delle seguenti regole:
Tu, lo sviluppatore di database, dici agli impiegati che hanno imparato abbastanza. Fornisci consigli e chiedi loro di tornare al lavoro e rimanere nelle loro stazioni per impostazione predefinita.
Si fissa solo un appuntamento con il proprietario, che si svolgerà nel suo ufficio domani per la formazione su 4NF e 5NF.