Вопрос:

У вас есть таблица с полями «id», «names», «birth». Пример заполнения первой строки: 1/Alek­sander Pushkin/1799. Находится ли данная таблица в нормальном состоянии? Как привести её в нормальное состояние, если это необходимо? Что сделают команды ALTER TABLE users ADD COLUMN fname VARCHAR(20) NOT NULL, ADD COLUMN lname VARCHAR(20); UPDATE users SET fname = SUBSTRING_INDEX(names, ' ', 1)?

Ответ:

Таблица не находится в нормальном состоянии: поле names содержит два самостоятельных значения — имя и фамилию, поэтому нарушается атомарность данных (требование первой нормальной формы).

Для нормализации нужно разделить поле names на два столбца: fname для имени и lname для фамилии, а затем перенести в них соответствующие данные.

Команда ALTER TABLE создаст столбцы fname и lname. Команда UPDATE заполнит fname частью строки слева до первого пробела, то есть для значения Alek­sander Pushkin запишет Alek­sander. Столбец lname этой командой не заполняется и останется со значением NULL. Кроме того, если в таблице уже есть строки, добавление столбца fname с ограничением NOT NULL может завершиться ошибкой до заполнения существующих записей.

Ответ: нет, таблица не нормализована; команды создадут новые столбцы, заполнят только fname именем до первого пробела, а lname останется NULL.