Нормализация - 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.

Другие вопросы по тегам