La normalizzazione è un approccio di progettazione del database per decomporre sistematicamente le tabelle per rimuovere la ridondanza dei dati e prevenire anomalie che possono accompagnare l'inserimento, l'aggiornamento e la cancellazione dei dati. Esiste la prima forma normale (1NF), la seconda forma normale (2NF), la terza forma normale (3NF), la forma normale Boyce-CoDD (BCNF), la quarta forma normale (4NF) e la quinta forma normale (5NF). La sesta forma normale è ancora in fase di sviluppo (ancora nello stato di ricerca) e non sarà discussa in questa serie. La forma normale di Boyce-Codd è come il 3½ (3.5) Forma normale. Un database relazionale è costituito da tabelle correlate, che avrebbero dovuto essere normalizzate.
Questo articolo (tutorial) spiega la prima forma normale. Questa è la prima parte della serie, le cinque forme normali. Il database di esempio utilizzato è quello di un negozio di alimentari. In Gran Bretagna, un negozio di alimentari si chiama un negozio d'angolo. In alcuni paesi, si chiama fornitura.
Tabella delle transazioni non normalizzata
Una transazione è l'acquisto di prodotti da parte di un cliente, dal negozio o riceve prodotti dal negozio dai fornitori, in vendita. Si presume in questa parte della serie (in questo tutorial) che l'impiegato che registra le transazioni non è addestrato per tale registrazione. Potrebbe esserci più di un impiegato che non sanno nulla della normalizzazione. Se ci sono più di un impiegato, tutti gli impiegati registrano nello stesso libro di esercizi e nessuno di loro sa nulla sulla normalizzazione. Anche il proprietario (proprietario del negozio) non sa nulla sulla normalizzazione. Suo padre è appena morto e gli ha lasciato un po 'di soldi, e ha deciso di investire in un negozio di alimentari. Quindi, l'impiegato (o gli impiegati) sta iniziando con una tabella per registrare tutte le transazioni. La tabella ha le seguenti intestazioni di colonna in cui trans significa transazione:
Trans (prodotto, categoria, cliente, fornitore, dipendente, prezzo)
Trans si riferisce a una riga nella tabella. La tabella è una tabella delle transazioni. Gli esempi di prodotti venduti nel negozio sono: dolce. Uno di questi nomi può apparire nella colonna del prodotto.
Questi prodotti rientrano in categorie che sono: pasticceria, bibite, prodotti lattiero -caseari, articoli da toeletta e snack.
La colonna del cliente ha i nomi delle persone che acquistano dal negozio. La colonna del fornitore ha i nomi delle aziende che forniscono i prodotti per essere venduti dal negozio. La colonna dei dipendenti ha il nome dell'impiegato che vende un prodotto o riceve un prodotto da un fornitore e lo registra. La colonna Azione indica se è stata effettuata una vendita a un cliente o un ordine (acquistato) da un fornitore.
Ogni prezzo è il prezzo totale dei prodotti venduti o acquistati in una transazione.
E così, le prime righe del tavolo sono:
Prima di continuare, sappi che le colonne della tabella in una tabella di database sono anche chiamate attributi. Le righe con valori possono essere definite oggetti.
Ora, nota che nella colonna dei prezzi, la valuta non è indicata. Se la valuta è dollari o euro o qualche altra valuta, non deve essere indicato. Tuttavia, è indicato in alcune aree di commento che non fa parte del tavolo.
Dal tavolo: Finora ci sono tre impiegati, esclusi il proprietario, e uno di loro ha effettuato la transazione due volte; Finora ci sono tre clienti e uno di loro ha acquistato due volte; Finora ci sono quattro società di fornitori e ognuna si occupa di una transazione.
Ridondanza:
Si noti che "John Smith" appare come valore in due righe nella stessa colonna. La ripetizione dello stesso valore nella stessa colonna è la ridondanza che può portare a problemi di contabilità.
Regole della prima forma normale
Affinché una tabella sia nella prima forma normale, le seguenti regole devono essere rispettate. Altrimenti, ci sarebbero problemi di contabilità:
1) Tutte le colonne in una tabella dovrebbero avere nomi di intestazione univoci.
2) Ogni cella deve avere un solo valore singolo.
3) I valori memorizzati in una colonna dovrebbero essere dello stesso tipo.
4) Le righe dovrebbero essere distinte.
5) L'ordine delle colonne o dell'ordine delle righe non ha importanza.
Tu, il lettore, che finalmente completa questa serie e sapete tutto sulle normali forme, sei diventato uno sviluppatore di database. Il proprietario del negozio di alimentari è tuo amico. Hai deciso di visitare il sito commerciale del tuo amico (negozio).
Guardi la tabella precedente che hanno prodotto. Rifletti per un po 'di tempo, quindi scuoti la testa, dicendo: "HM-HM-HM". Quindi dici al tuo amico, il proprietario e i suoi lavoratori, che non tutte le regole della prima forma normale sono state rispettate; e ciò porterebbe a errori contabili.
Hai quindi deciso di insegnare loro le regole della prima forma normale, esaminando le cinque regole in quanto sono correlate alla tabella precedente, uno per uno.
Regola 1: Tutte le colonne in una tabella dovrebbero avere nomi di intestazione univoci.
Tutte le colonne della tabella precedente hanno nomi univoci? Sì, e va bene. Dopotutto i membri del personale non sono poco importanti. Semplicemente non sono stati educati su forme normali. La regola 1 non è stata violata e ciò non rappresenta un problema.
Regola 2: Ogni cella deve avere un solo valore singolo.
Una cella è l'intersezione di una riga e una colonna. Guardando l'ultimo attributo (colonna) con l'intestazione, il prezzo, c'è un numero in ogni cella e c'è solo un numero per cella. Va bene. Ogni cella è un singolo apprezzato.
Guardando la colonna dei dipendenti, ogni cella ha un nome di una persona. Un nome è costituito dal nome e dal cognome, formando una stringa (testo). Va bene. Ogni cella nella colonna ha una stringa e così, ogni cella ha un valore.
Le celle per le colonne del cliente e dei fornitori hanno una singola stringa ciascuno e quindi, un singolo valore. Va bene. Nella colonna del cliente, "John Smith" è in due celle diverse (righe). Questa è ridondanza (ripetizione) e il suo problema sarà discusso più avanti nel tutorial per 2NF.
Nella colonna di categoria, ogni cella dovrebbe avere una categoria. Un testo di una categoria (un valore) è una stringa. Tuttavia, nella seconda cella dall'alto, ci sono due categorie (due stringhe): "bevanda analcolica" e "prodotto lattiero -caseario" separati da una virgola. Questi sono due valori in una cella. Il resto delle celle nella colonna della categoria ha valori singoli, ma questa cella ha due. La regola che ogni cella deve avere un solo valore singolo, è stata violata qui nella seconda cella. Ciò porterebbe a problemi contabili. Poiché ci sono due valori in una cella, la soluzione è di dividere la riga di dati in due righe, mettendo i due valori in due celle, due righe, nella stessa colonna di:
Le due categorie che erano in una cella, sono state messe in due celle nella stessa colonna. Tuttavia, le altre cellule sono state ripetute nelle loro colonne, introducendo una maggiore ridondanza. Nel corso della risoluzione di un problema, sono state aggiunte ripetizioni (ridondanza), aggiungendo un altro problema. La soluzione alle ripetizioni sarà discussa nel prossimo tutorial sulla seconda forma normale.
Guardando la prima colonna sul prodotto, la prima cella ha due valori: "dolci" e "cioccolatini" separati da una virgola. Questi sono anche due prodotti. La soluzione è di dividere la riga in due, mettendo i due valori in due celle diverse nella stessa colonna e purtroppo raddoppia anche le altre celle.
La seconda cella della stessa colonna del prodotto ha sette valori. Come la prima cella, questo viola la regola: ogni cella deve avere un solo valore. La soluzione è sostituire la riga con sette nuove righe, con ciascuno di questi valori nella propria cella nella stessa colonna e le ripetizioni delle altre celle nelle proprie colonne. Le nuove ripetizioni aumentano la ridondanza.
Dei sette prodotti, quattro cadono nella categoria delle bevande analcoliche e tre cadono nella categoria dei prodotti lattiero -caseari. I quattro prodotti (Sprite, Coca-Cola, Fanta e Pepsi) sono ciascuno associati alla categoria, Drink analcolico. I prodotti (latte, yogurt e formaggio) sono ciascuno associati alla categoria, al prodotto lattiero -caseario.
Il nuovo tavolo diventa:
La regola che ogni cella deve avere un solo valore è ora soddisfatto. Non c'è cella con più di un valore nella tabella. Questa soluzione ha avuto un costo. Altre celle si sono ripetute nelle loro colonne, aggiungendo più ripetizioni alla doppia (originale) ripetizione di "John Smith". Mettere una tabella nella seconda forma normale risolve il problema della ripetizione (ridondanza) dalla prima forma normale.
Nota: La ripetizione nella colonna dei prezzi non è considerata un problema e non viene presa in considerazione quando si produce il 2NF. Si noti inoltre che in questa tabella risultante, alcuni dei prezzi dati sono stati divisi ed sono considerati appropriati.
Regola 3: I valori memorizzati in una colonna dovrebbero essere dello stesso tipo.
L'ultimo attributo, la colonna prezzo ha solo numeri. Quindi, tutti i valori in quella colonna sono dello stesso tipo chiamato numeri (precisamente, numeri interi). Ciascuna delle altre colonne ha valori di stringa di tipo. Il tipo di stringa si chiama testo in alcuni codici della tabella del database. E così, la regola secondo cui i valori memorizzati in una colonna dovrebbero essere dello stesso tipo è soddisfatta senza alcun cambiamento a ciò che il personale aveva fatto. Dopotutto non sono poco intelligenti.
Regola 4: Le righe dovrebbero essere distinte.
Nella tabella precedente risultante, non ci sono due righe le stesse. Alcune cellule si verificano in più di una riga nella stessa colonna, ma non ci sono due righe hanno le stesse celle nello stesso ordine. E così, la regola secondo cui le righe dovrebbero essere distinte è soddisfatta senza alcun cambiamento a ciò che il personale aveva fatto. Dopotutto non sono poco intelligenti.
Regola 5: L'ordine delle colonne o dell'ordine delle righe non ha importanza.
Qualsiasi colonna può essere la prima o l'ultima colonna. Qualsiasi riga può essere la prima o l'ultima riga. E così, la regola secondo cui l'ordine delle colonne o l'ordine delle righe non importa è soddisfatta senza alcun cambiamento a ciò che il personale aveva fatto. Dopotutto non sono poco intelligenti.
La tabella è ora in prima forma normale perché le cinque regole sono soddisfatte.
Delle cinque regole per avere un tavolo in prima forma normale, il personale, incluso il loro proprietario, ha violato solo uno per ignoranza che non è di colpa loro. Tu, lo sviluppatore web che li sta addestrando, devi congratularsi con loro. Tuttavia, devi insistere sul fatto che la regola che ogni cella deve avere un solo valore è la regola più importante per mettere una tabella nella prima forma normale.
Bene, non è tutto. Non lasci ancora le persone che ti stai allenando. La tabella deve essere fornita una chiave (una chiave primaria). In altre parole, ogni riga deve essere identificabile da uno o più valori di cella di quella riga. Se ciò non è possibile, una nuova colonna deve essere creata sul lato sinistro della tabella per essere chiamata colonna chiave.
Chiave primaria
C'è qualche colonna nella tabella precedente in cui nessuna cella può essere vuota o avere un valore nullo e tutti i valori saranno sempre univoci? Non c'è nessuno. Se ce ne fosse uno, allora sarebbe resa la chiave primaria. Il lettore potrebbe pensare che la colonna del prodotto abbia valori univoci, ma questo non sarebbe sempre il caso. Ad esempio, il cliente "John Smith" o un nuovo cliente possono ancora venire a comprare dolci in futuro, come nuova transazione (riga). Quindi, ci sarebbero due valori di stringa di dolci in due celle nella colonna del prodotto.
Ci sono due o più colonne nella tabella precedente risultante la cui combinazione di celle di riga è unica e non può avere alcuna ripetizione nella tabella seguente? Se sì, il gruppo di colonne formerà la chiave primaria. Come succede, non esiste un gruppo del genere; a meno che tutte le colonne della tabella non debbano essere considerate come la chiave primaria poiché nessuna riga può ripetere. Ci deve essere una chiave primaria e ci devono essere colonne non chiave in una tabella normalizzata.
Poiché una o più colonne non possono essere la chiave primaria della tabella precedente risultante, una nuova colonna deve essere aggiunta sull'estremità sinistra della tabella per essere la chiave primaria. In una colonna chiave così primaria, nessuna cella è vuota e nessuna cella ha un valore nullo. Tutti i valori nella cella devono essere univoci. Il modo più semplice per avere tali valori per la colonna della chiave primaria è avere numeri da 1 verso l'alto. Cioè, per la prima riga, il valore della chiave primaria sarebbe 1. Per la seconda riga, il valore per la chiave primaria sarebbe 2. Per la terza riga, il valore per la chiave primaria sarebbe 3 e così via. Quando viene aggiunta una nuova riga di transazione in basso, il nuovo valore della chiave primaria è uno più quello appena sopra. Quindi, la tabella completa per la prima forma normale è la seguente:
La colonna della chiave primaria è chiamata transid per "ID transazione". Id significa identificatore. Tale chiave primaria è il tipo di incremento automatico che è uguale al numero automatico. Una nuova riga avrà un ID primario di 12. Questa tabella è una tabella delle transazioni. È l'unico tavolo che il negozio ha finora.
Che completa il design della tabella per la prima forma normale. Tuttavia, tu come sviluppatore web, non andare via dalle persone che ti stai ancora allenando. Devi ancora spiegare al personale (i tirocinanti) il significato della dipendenza funzionale. Con ciò, saranno in grado di gestire il problema della chiave primaria e delle cinque regole che hai insegnato in tua assenza.
Dipendenza funzionale
L'idea di dipendenza funzionale o semplicemente dipendenza è che una volta nota la chiave primaria di una riga, qualsiasi altro valore in quella riga può essere recuperato. Quindi, la chiave primaria è il valore dipendente. Dipende dal resto degli altri valori nella riga. Ad esempio, se il transid di 3 è indicato per la tabella precedente, il prodotto corrispondente è sprite. La categoria corrispondente è "bevanda analcolica". Il cliente corrispondente è "John Smith". Il fornitore corrispondente è "Brinking Company". Il dipendente corrispondente (impiegato) è "Mary Baker". L'azione corrispondente è "vendite". E l'importo (prezzo) che il cliente ha pagato è $ 12 ($ non è indicato nella tabella).
A questo punto, come sviluppatore di database può andarsene. Tuttavia, prima di andare, riassumi ciò che hai insegnato loro.
Conclusione
Una tabella nella prima forma normale non deve violare nessuna delle seguenti regole:
1) Tutte le colonne in una tabella dovrebbero avere nomi di intestazione univoci.
2) Ogni cella deve avere un solo valore singolo.
3) I valori memorizzati in una colonna dovrebbero essere dello stesso tipo.
4) Le righe dovrebbero essere distinte.
5) L'ordine delle colonne o delle righe non ha importanza.
Qualsiasi tabella in qualsiasi forma normale dovrebbe avere una chiave primaria.
L'idea della dipendenza funzionale o semplicemente della dipendenza è che una volta nota la chiave primaria di una riga, qualsiasi altro valore in quella riga può essere recuperato.
A questo punto, come sviluppatore di database puoi accompagnare. Tuttavia, tornerai per insegnare loro la seconda forma normale perché una tabella in 1NF potrebbe avere ancora alcune vulnerabilità.