Ответ на задание 1
Для данной таблицы можно определить следующие функциональные
зависимости:
StudentID → StudentName
CourseID → CourseName, TeacherName
Поскольку один студент может изучать несколько дисциплин, а
одну дисциплину могут изучать несколько студентов, отдельные StudentID и
CourseID не могут однозначно определить строку регистрации.
Поэтому возможным составным ключом является:
(StudentID, CourseID)
При этом некоторые неключевые атрибуты зависят только от
части составного ключа:
StudentID → StudentName
CourseID → CourseName, TeacherName
Это указывает на наличие частичных функциональных
зависимостей и необходимость дальнейшей нормализации таблицы.
Ответ на задание 2
Таблица:
Enrollment(
StudentID,
StudentName,
CourseID,
CourseName,
Grade
)
имеет составной первичный ключ:
(StudentID, CourseID)
Функциональные зависимости:
StudentID → StudentName
CourseID → CourseName
(StudentID, CourseID) → Grade
Таблица не соответствует 2NF, поскольку StudentName зависит
только от StudentID, а CourseName — только от CourseID. Это частичные
зависимости от составного ключа.
Для приведения к 2NF таблицу можно разделить на три:
Student
----------------
StudentID (PK)
StudentName
Course
----------------
CourseID (PK)
CourseName
Enrollment
----------------
StudentID (PK, FK)
CourseID (PK, FK)
Grade
SQL-вариант:
CREATE TABLE Student (
StudentID INT
PRIMARY KEY,
StudentName
VARCHAR(100) NOT NULL
);
CREATE TABLE Course (
CourseID INT
PRIMARY KEY,
CourseName
VARCHAR(100) NOT NULL
);
CREATE TABLE Enrollment (
StudentID INT,
CourseID INT,
Grade INT,
PRIMARY KEY
(StudentID, CourseID),
FOREIGN KEY
(StudentID) REFERENCES Student(StudentID),
FOREIGN KEY
(CourseID) REFERENCES Course(CourseID)
);
Теперь каждый неключевой атрибут зависит от полного ключа
своей таблицы.
Ответ на задание 3
Исходная таблица:
Employee(
EmployeeID,
EmployeeName,
DepartmentID,
DepartmentName
)
Существуют зависимости:
EmployeeID → EmployeeName, DepartmentID
DepartmentID → DepartmentName
Следовательно, возникает транзитивная зависимость:
EmployeeID → DepartmentID → DepartmentName
DepartmentName зависит от первичного ключа EmployeeID не
напрямую, а через DepartmentID.
Поэтому таблица не соответствует 3NF.
Для приведения к третьей нормальной форме ее следует
разделить:
Department
----------------
DepartmentID (PK)
DepartmentName
Employee
----------------
EmployeeID (PK)
EmployeeName
DepartmentID (FK)
SQL:
CREATE TABLE Department (
DepartmentID INT
PRIMARY KEY,
DepartmentName
VARCHAR(100) NOT NULL
);
CREATE TABLE Employee (
EmployeeID INT
PRIMARY KEY,
EmployeeName
VARCHAR(100) NOT NULL,
DepartmentID INT,
FOREIGN KEY
(DepartmentID)
REFERENCES
Department(DepartmentID)
);
Теперь название отдела хранится только один раз в таблице
Department. Это уменьшает избыточность данных и предотвращает аномалии
вставки, обновления и удаления.