1NF vieta di ripetere gli elenchi di seguito. Il vostro disegno viola questa, e così sarebbe il seguente disegno:
Student Phones
'John D' '555-5555, 666-6666, 777-7777'
'Sally S' '111-1111, 222-2222'
Il seguente disegno sarebbe viola 2NF, perché l'unica chiave primaria è Name, Phone
, ma l'attributo Address
non dipende dal Phone
:
Name Phone Address
'John D' '555-5555' '1 Square Village'
'John D' '666-6666' '1 Square Village'
'John D' '777-7777' '1 Square Village'
'Sally S' '111-1111' '999 Flash City'
'Sally S' '222-2222' '999 Flash City'
Il design prossima violerebbe 3NF, perché AreaName non dipende dal nome, ma solo su Area:
Name Area Phone AreaName
'John D' '555' '5555' '111name'
'John D' '666' '6666' '666name'
'John D' '777' '7777' '777name'
'Sally S' '111' '1111' '111name'
'Sally S' '222' '2222' '222name'
Anche se il tuo design viola 1NF, è una scelta eccellente. La complessità dell'aggiunta di una tabella PhoneNumber
non è quasi mai giustificata.
Pensa a quanto diventa difficile un aggiornamento per un cliente se sei conforme a 1NF. I numeri sarebbero in una tabella separata. Quindi, se qualcuno invia un modulo con un elenco aggiornato di numeri di telefono, come cambieresti il database? Prima dovresti recuperare l'elenco esistente di numeri. Quindi dovresti confrontarli con l'elenco inviato. Quindi dovresti eliminare o inserire righe in base alla differenza. Un diavolo di una soluzione complessa.
Se ci si attiene alla soluzione, è sufficiente aggiornare le tre colonne. Il tempo risparmiato può essere speso per le funzionalità reali! O anche scrivendo lunghe risposte su Stack Overflow.
C'è un ottimo write-up @ http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups –