Нормализация - 2НФ и 3НФ
https://dba.stackexchange.com/questions/98427/normilsation-2nf-and-3nf
Я прошел через несколько вопросов и учебных пособий по YouTube; Я понимаю, что 2NF удаляет частичные зависимости, а 3NF - транзитивные, но я не могу понять, как должен выглядеть следующий пример в 2NF.
StudentID | StudentName | CourseCode | CourseTitle | modCode | modTitle | кредиты | ResultCode
Моя попытка следующая для 2NF:
Ученик
StudentID | StudentName | CourseCode | modCode | ResultCode
Курс
CourseCode | название курса
модуль
modCode | modTitle | кредиты
Это правильно? Если нет, то где я иду не так и почему.
Ниже приводится 3NF:
Ученик
StudentID | StudentName | код курса
Курс
CourseCode | название курса
модуль
modCode | modTitle | кредиты | код курса
Результаты
StudentID | modCode | ResultCode
То же самое и для этого; это правильно - если нет, то где и почему?
1 ответ
Хорошо, давайте посмотрим на вашу попытку 2NF:
Ученик
StudentID | StudentName | CourseCode | modCode | ResultCode
Курс
CourseCode | название курса
модуль
modCode | modTitle | кредиты
Давайте сначала поговорим о студенте.
Ваш ключ не может быть studentID, потому что resultCode зависит от studentID и courseCode (у вас есть один результат для каждого курса). Но ваш studentName зависит только от studentID, поэтому часть ключа (studentID,courseCode). Так что 2НФ нарушается. Вам нужно сделать что-то вроде этого:
Ученик
StudentID | StudentName | CourseCode | modCode
Курс
CourseCode | название курса
модуль
modCode | modTitle | кредиты
Результат
StudentID | CourseCode | ResultCode
Но имейте в виду, что это относится к 2NF, но все еще кажется неправильным, потому что модули и курсы теперь совершенно не связаны. Так что попробуйте это:
Ученик
StudentID | StudentName | modCode
модуль
modCode | modTitle | кредиты
Курс
CourseCode | CourseTitle | modCode
Результат
StudentID | CourseCode | ResultCode
Курс принадлежит модулю (модуль имеет много курсов) - с моей точки зрения. Это автоматически в 2NF (потому что ключ всегда является только одним атрибутом (за исключением результата, но всегда есть только один неключевой атрибут, зависящий от обоих атрибутов ключа), поэтому ничто не может зависеть от "части" ключа). И это также относится к 3NF, потому что каждая "физическая" сущность имеет свое логическое представление в модели данных (скорее практическое правило, чем формализм).
Теперь давайте посмотрим на вашу попытку 3NF. Я думаю, что вы получили неправильную зависимость от курса <-> модуля, но давайте просто сконцентрируемся на нормализации.
Ученик
StudentID | StudentName | код курса
Курс
CourseCode | название курса
модуль
modCode | modTitle | кредиты | код курса
Результаты
StudentID | modCode | ResultCode
Это правильная 3NF, потому что просто нет другого ключевого кандидата, кроме самого ключа. Так что не может быть никакой переходной зависимости.
Чтобы прояснить это: ключевой кандидат - это один из множества минимальных наборов возможных ключей. В вашем отношении вы нашли по крайней мере одного ключевого кандидата с одним элементом (за исключением отношения результатов). Таким образом, любой другой ключевой кандидат не может иметь более одного элемента. Это означает, что вы можете просто посмотреть на каждый атрибут и решить, "это может быть ключом или нет?" И в вашем примере вы обнаружите, что никакой другой атрибут не может быть ключом - поэтому он автоматически в 2NF и 3NF.