StudentId, StudentName, GroupId, GroupName, CourseId, CourseName, LecturerId, LecturerName, Mark
Дано отношение с атрибутами StudentId, StudentName, GroupId, GroupName, CourseId, CourseName, LecturerId, LecturerName, Mark.
Примечания:
-- У студента есть имя и он обучается в определенной группе, при чем могут быть студенты с одинаковыми именами
StudentId -> StudentName
StudentId -> GroupId
-- У группы есть название, при чем название уникально в пределах университета
GroupId -> GroupName
GroupName -> GroupId
-- У курса есть название, при чем названия курсов могут совпадать в разных программах
CourseId -> CourseName
-- У лектора есть имя
LecturerId -> LecturerName
-- Студент может иметь оценку по итогам какого-либо курса, при чем эту оценку выставил лектор этого курса
StudentId, CourseId -> Mark, LecturerId
-- Курс у группы читает определенный лектор, при чем у разныз групп один и тот же курс могут читать разные лекторы
-- Так же лектор может читать больше одного курса
GroupId, CourseId -> LecturerId
Возьмем надключ из всех аттрибутов. Заметим что StudentId не встерчается в правых частях ФЗ, поэтому ключ обязательно будет содержать StudentId. Для любого множества аттрибутов без StudentId -- это множество не надключ и следовательно не ключ
Аналогичное утверждение верно для CourseId.
Следовательно не будет рассматривать множества аттрибутов не содержащих StudentId, CourseId в качестве ключей
Если множество аттрибутов {StudentId, CourseId} -- надключ, то оно так же и ключ, т.к. любой другой надключ будет содержать в себe это множество и следовательно оно минимально по включению.
Проверим что {StudentId, CourseId} -- надключ: {StudentId, CourseId}* = {StudentId, CourseId, StudentName, GroupId, GroupName, CourseName, Mark, LecturerId, LecturerName}
StudentId, CourseId
GroupId, CourseId
GroupId, CourseId, GroupName
GroupId, CourseId, GroupName, CourseName
GroupId, CourseId, GroupName, CourseName, LecturerId
GroupId, CourseId, GroupName, CourseName, LecturerId, LecturerName
StudentId, CourseId
StudentId, CourseId, StudentName
StudentId, CourseId, StudentName, GroupId
StudentId, CourseId, StudentName, GroupId, GroupName
StudentId, CourseId, StudentName, GroupId, GroupName, CourseName
StudentId, CourseId, StudentName, GroupId, GroupName, CourseName, Mark, LecturerId
StudentId, CourseId, StudentName, GroupId, GroupName, CourseName, Mark, LecturerId, LecturerName
StudentId, LecturerId
StudentId, LecturerId, StudentName
StudentId, LecturerId, StudentName, GroupId
StudentId, LecturerId, StudentName, GroupId, GroupName
StudentId, LecturerId, StudentName, GroupId, GroupName, LecturerName
Есть одна ФЗ в которой в правой части больше 1 аттрибута, расщепляем ее
StudentId -> StudentName
StudentId -> GroupId
GroupId -> GroupName
GroupName -> GroupId
CourseId -> CourseName
LecturerId -> LecturerName
StudentId, CourseId -> Mark
StudentId, CourseId -> LecturerId
GroupId, CourseId -> LecturerId
Рассмотрим ФЗ в которых потенциально можем удалить аттрибут. Рассмотрим замыкания подмножеств множеств аттрибутов левых частей
1. StudentId, CourseId -> Mark
{StudentId}* = StudentId, StudentName, GroupId, GroupName
{CourseId}* = CourseId, CourseName
Mark не встречается в замыканиях, следовательно не можем убрать ни один аттрибут из левой части
2. StudentId, CourseId -> LecturerId
{CourseId}* = CourseId, CourseName
{StudentId}* = StudentId, StudentName, GroupId, GroupName
LecturerId не встречается в замыканиях, следовательно не можем убрать ни один аттрибут из левой части
3. GroupId, CourseId -> LecturerId
{GroupId}* = GroupId, GroupName
{CourseId}* = CourseId, CourseName
LecturerId не встречается в замыканиях, следовательно не можем убрать ни один аттрибут из левой части
Остальные правило содержат по одному аттрибуту в левой части, не может удалить оттуда ни один аттрибут
StudentId -> StudentName
StudentId -> GroupId
GroupId -> GroupName
GroupName -> GroupId
CourseId -> CourseName
LecturerId -> LecturerName
StudentId, CourseId -> Mark
StudentId, CourseId -> LecturerId
GroupId, CourseId -> LecturerId
Построим замыкания аттрибутов левых частей каждой ФЗ, без этой ФЗ:
1. StudentId -> StudentName
{StudentId}* = StudentId, GroupId, GroupName
Не можем выкинуть, замыкание не содержит StudentName
2. StudentId -> GroupId
{StudentId}* = StudentId, StudentName
Не можем выкинуть, замыкание не содержит GroupId
3. GroupId -> GroupName
{GroupId}* = GroupId
Не можем выкинуть, замыкание не содержит GroupName
4. GroupName -> GroupId
{GroupName}* = GroupName
Не можем выкинуть, замыкание не содержит GroupId
5. CourseId -> CourseName
{CourseId}* = CourseId
Не можем выкинуть, замыкание не содержит CourseName
6. LecturerId -> LecturerName
{LecturerId}* = LecturerId
Не можем выкинуть, замыкание не содержит LecturerName
7. StudentId, CourseId -> Mark
{StudentId, CourseId}* = StudentId, CourseId, StudentName, GroupId, GroupName, LecturerId, LecturerName, CourseName
Не можем выкинуть, замыкание не содержит Mark
8. StudentId, CourseId -> LecturerId
{StudentId, CourseId}* = StudentId, CourseId, StudentName, GroupId, GroupName, CourseId, Mark, CourseName, LecturerId
Можем выкинуть, LecturerId входит в замыкание
9. GroupId, CourseId -> LecturerId
{GroupId, CourseId}* = GroupId, CourseId, GroupName, CourseName -- не можем выкинуть
StudentId -> StudentName
StudentId -> GroupId
GroupId -> GroupName
GroupName -> GroupId
CourseId -> CourseName
LecturerId -> LecturerName
StudentId, CourseId -> Mark
GroupId, CourseId -> LecturerId