1NF запрещает повторять списки подряд. Ваш дизайн нарушает это, как и следующий дизайн:
Student Phones
'John D' '555-5555, 666-6666, 777-7777'
'Sally S' '111-1111, 222-2222'
Следующая схема будет нарушать 2NF, поскольку единственным первичным ключом является Name, Phone
, но атрибут Address
не зависит от 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'
Следующий дизайн нарушит 3NF, поскольку AreaName не зависит от Name, а только от 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'
Даже если ваш дизайн нарушает 1NF, это отличный выбор. Сложность добавления таблицы PhoneNumber
вряд ли когда-либо оправдана.
Подумайте о том, насколько сложным становится обновление для клиента, если вы соответствуете 1NF. Номера будут в отдельной таблице. Так что, если кто-то отправит форму с обновленным списком телефонных номеров, как бы вы изменили базу данных? Сначала вам нужно получить существующий список номеров. Затем вам нужно сравнить их с представленным списком. Тогда вам придется удалить или вставить строки на основе разницы. Один черт сложного решения.
Если вы придерживаетесь своего решения, вы можете просто обновить три столбца. Сэкономленное время можно потратить на реальные возможности! Или даже писать длинные ответы о переполнении стека.