Quali sono i moduli normali del database e puoi fare degli esempi? [chiuso]


277

Nella progettazione di database relazionali, esiste un concetto di normalizzazione del database o semplicemente di normalizzazione, che è un processo di organizzazione di colonne (attributi) e tabelle (relazioni) per ridurre la ridondanza dei dati e migliorare l'integrità dei dati. (come scritto su Wikipedia ).

Poiché la maggior parte degli articoli sono in qualche modo tecnici e quindi più difficili da capire, sto chiedendo a qualcuno di scrivere una spiegazione più facile da capire basata su esempi su cosa significano 1NF, 2NF, 3NF, persino 3.5NF (Boyce-Codd).

Risposte:


435

1NF è il più semplice dei moduli normali: ogni cella in una tabella deve contenere solo un pezzo di informazione e non possono esserci righe duplicate.

2NF e 3NF dipendono dalla dipendenza dalla chiave primaria. Ricordiamo che una chiave primaria può essere composta da più colonne. Come ha detto Chris nella sua risposta:

I dati dipendono dalla chiave [1NF], l'intera chiave [2NF] e nient'altro che la chiave [3NF] (quindi aiutatemi Codd ).

2NF

Supponi di avere una tabella contenente corsi seguiti in un certo semestre e di avere i seguenti dati:

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

Questo non è in 2NF , perché la quarta colonna non si basa sull'intera chiave, ma solo su una parte di essa. Il nome del corso dipende dall'ID del corso, ma non ha nulla a che fare con il semestre in cui si svolge. Pertanto, come puoi vedere, abbiamo informazioni duplicate: diverse righe ci dicono che IT101 sta programmando e IT102 è Database. Quindi risolviamo ciò spostando il nome del corso in un'altra tabella, dove CourseID è la chiave INTERA.

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

Nessuna ridondanza!

3NF

Ok, quindi supponiamo di aggiungere anche il nome dell'insegnante del corso e alcuni dettagli su di essi nel RDBMS:

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

Ora spero che dovrebbe essere ovvio che TeacherName dipende da TeacherID - quindi questo non è in 3NF . Per risolvere questo problema, facciamo lo stesso che in 2NF: prendiamo il campo TeacherName da questa tabella e mettiamolo in proprio, che ha TeacherID come chiave.

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

Nessuna ridondanza !!

Una cosa importante da ricordare è che se qualcosa non è in 1NF, non lo è nemmeno in 2NF o 3NF. Quindi ogni forma normale aggiuntiva richiede tutto ciò che aveva le forme normali inferiori, oltre ad alcune condizioni extra, che devono essere soddisfatte tutte .


9
Pensaci solo in termini di relazione tra le cose. Se ti chiedo "come si chiama il corso con ID IT101?", Puoi darmi una risposta, giusto? Allo stesso modo, se ti chiedo "quale insegnante ha l'ID 332?" puoi dirmi che insegnante è. Pertanto, il nome del corso dipende dal suo ID.
Smashery,

9
Tuttavia, non puoi andare dall'altra parte - se dovessi chiederti "Qual è l'ID del signor Jones?" potresti non essere in grado di dare una risposta unica, in quanto potrebbero esserci due Mr Joneses. Quindi l'ID non dipende dal nome - è il nome che dipende dall'ID.
Smashery,

2
Puoi anche pensarci in questo modo - guarda la terza tabella in basso (la prima con TeacherName). Che cosa mi impedisce di avere "Mr Jones" in prima fila, ma poi mettere "Mr Bloggs" in seconda fila? Non dovrei essere autorizzato a farlo, perché entrambi hanno l'ID di 332.
Smashery,

30
@instantsetsuna - Spiegazione completa: in alcuni tribunali viene chiesto a un testimone se diranno "La verità, tutta la verità e nient'altro che la verità, quindi aiutatemi Dio"; come Dio è considerato quello con autorità quando si tratta di sapere se stai dicendo la verità. Nel caso dei database, possiamo dire "I dati dipendono dalla chiave, l'intera chiave e nient'altro che la chiave, quindi aiutatemi Codd". Ted Codd è colui che ha avuto l'idea dei database relazionali - cose che si basano su chiavi, ecc., Quindi sarebbe l'autorità a passare nel caso dei database relazionali.
Smashery,

5
@Smashery Qual è la differenza tra 2NF e 3NF?
Zo ha il

119

Non ho mai avuto una buona memoria per la formulazione esatta, ma nella mia classe di database penso che il professore abbia sempre detto qualcosa del tipo:

I dati dipendono dalla chiave [1NF], l'intera chiave [2NF] e nient'altro che la chiave [3NF].


72
... quindi aiutami Codd. en.wikipedia.org/wiki/Ted_Codd
Smashery

6
Quindi qual è la differenza tra The data depends on the key [1NF], nothing but the key [3NF]? Per favore non confonderci, poiché 1 risposta sentense non chiarisce la risposta ma confonde i visitatori!
Pratik,

2
"ogni cella in una tabella deve contenere solo un pezzo di informazione e non possono esserci righe duplicate." - Non vedo come "I dati dipendono dalla chiave" corrispondono a tutto ciò.
Simon Forsberg,

46

Ecco una risposta rapida, dichiaratamente macellata , ma in una frase:

1NF: la tabella è organizzata come un insieme di dati non ordinati e non sono presenti colonne ripetute.

2NF: non ripetere i dati in una colonna della tabella a causa di un'altra colonna.

3NF: ogni colonna nella tua tabella si riferisce solo alla chiave della tua tabella - non avresti una colonna in una tabella che descrive un'altra colonna nella tua tabella che non è la chiave.

Per maggiori dettagli, vedi Wikipedia ...


1
Per quanto ne so, l'astuzia di 1NF di gruppi ripetuti non si riferisce a colonne ripetute, ma piuttosto a singole colonne che rappresentano un numero arbitrario di valori ripetuti per lo stesso attributo, cioè non sono atomiche. Baso questo su es (1) stackoverflow.com/questions/23194292/… / (2) stackoverflow.com/questions/26357276/…
underscore_d

34

1NF: solo un valore per colonna

2NF: tutte le colonne di chiavi non primarie nella tabella dovrebbero dipendere dall'intera chiave primaria.

3NF: tutte le colonne della chiave non primaria nella tabella devono dipendere DIRETTAMENTE dall'intera chiave primaria.

Ho scritto un articolo in modo più dettagliato qui


Perché non hai fornito l'attribuzione. Ho modificato la risposta per fornire l'attribuzione.
Robert Harvey,

Quando possibile, includi l'esempio nella risposta stessa. Un utente occasionale dovrebbe essere in grado di leggere la tua risposta e ottenere un valore da essa senza dover fare clic sul link del blog. La risposta dovrebbe essere autonoma, in altre parole.
Robert Harvey,

Lo terrò a mente. Grazie :)
Arcturus,

3
Si noti inoltre che questa domanda ha due anni e ha già una risposta molto votata che è stata contrassegnata come accettata dal PO. Le risposte tardive vengono esaminate più attentamente dalla comunità per valutare se aggiungono o meno un reale valore aggiunto al PO.
Robert Harvey,

3
@Arcturus ha letto l'articolo, ancora una delle migliori spiegazioni per la normalizzazione là fuori.
Olian04
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.