Ответ на задание 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. Это уменьшает избыточность данных и предотвращает аномалии вставки, обновления и удаления.