Вторая нормальная форма
Вторая нормальная форма идентична первой, если ваша таблица не имеет составного первичного ключа. Давайте проследим в примере с тегами, какой пользователь хотел применить тег к каждой ошибке.
F-anti.sql
CREATE TABLE BugsTags (
bug_id BIGINT NOT NULL, tag VARCHAR(20) NOT NULL, tagger BIGINT NOT NULL, coiner BIGINT NOT NULL, PRIMARY KEY (bug_id, tag),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id), FOREIGN KEY (tagger) REFERENCES Accounts(account_id), FOREIGN KEY (coiner) REFERENCES Accounts(account_id)
) ;
На рис. А.З можно увидеть, что идентификаторы столбца coiner дублиру¬ются1. Это означает, что кто-то мог создать аномалию, заменив идентифика¬тор в одной строке для данного тега, но не изменив при этом остальные строки с тем же тегом.
Чтобы удовлетворить второй нормальной форме, необходимо сохранять значение в столбце только однажды. Это значит, что нужно определить другую таблицу, Tags, в которой тег будет являться первичным ключом, таким образом, одна строка будет связана с одним тегом. Затем можно бу¬дет сохранить значение данного столбца с определенным тегом в новой таблице, вместо таблицы BugsTags, и избежать аномалий.
Файл примера: Normalization/2NF-normal.sql
CREATE TABLE Tags (
tag VARCHAR(20) PRIMARY KEY, coiner BIGINT NOT NULL,
' В примере используются имена вместо идентификационных номеров для облегчения идентификации пользователями.
FOREIGN KEY (coiner) REFERENCES Accounts(account_id)
) ;
CREATE TABLE BugsTags (
bug_id BIGINT NOT NULL, tag VARCHAR(20) NOT NULL, tagger BIGINT NOT NULL, PRIMARY KEY (bug_id, tag) ,
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (tag) REFERENCES Tags (tag),
FOREIGN KEY (tagger) REFERENCES Accounts(account_id) |