Раздел 10 · Databases

Функциональные зависимости и аксиомы Армстронга

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

ER-моделирование помогает нарисовать хорошую схему, но не доказывает, что она хорошая. Бывает, что таблица выглядит разумно, а в ней один и тот же факт записан в сотне строк и рано или поздно разъедется. Чтобы ловить такое строго, а не на глаз, нужен инструмент: функциональные зависимости. С этого урока начинается серия о нормализации.

Таблица, где всё в одной куче

Представь, что школа ведёт учёт в одной большой таблице, как в Excel:

enrollments_flat
student_id | student_name | course_id | course_title | teacher  | grade
-----------+--------------+-----------+--------------+----------+------
         1 | Петя         |        10 | SQL          | Иванова  |     5
         1 | Петя         |        20 | Python       | Смирнов  |     3
         2 | Аня          |        10 | SQL          | Иванова  |     4
         3 | Олег         |        10 | SQL          | Иванова  |  NULL

Посмотри на колонки и спроси себя: что из чего следует? Если знаешь student_id, ты знаешь и имя студента: у студента 1 имя всегда «Петя». Если знаешь course_id, знаешь название и преподавателя. А оценку по одному student_id не узнаешь: у Пети оценки разные. Оценка определяется только парой «студент и курс».

Эти «если знаешь одно, знаешь и другое» и есть функциональные зависимости.

Определение

Аналогия: номер паспорта и ФИО. Назови номер паспорта, и ФИО определено однозначно. Двух людей с одним номером, но разными фамилиями не бывает. Обратное неверно: по ФИО номер не найдёшь, тёзки встречаются.

Функциональная зависимость X → Y читается «X определяет Y» и означает: если две строки совпадают по колонкам X, они обязаны совпадать и по колонкам Y. Левую часть называют детерминантом.

Зависимости нашей таблицы:

student_id            → student_name
course_id             → course_title, teacher
student_id, course_id → grade

Если две строки совпали по course_id, у них обязаны совпасть и название, и преподаватель. Если какая-то строка нарушит это правило, например у курса 10 в одной строке преподаватель «Иванова», а в другой «Петрова», значит, данные испорчены.

Важное правило, знакомое по уроку про ключи: зависимость определяется смыслом, а не тем, что сейчас лежит в таблице. Сейчас у всех студентов разные имена, но student_name → student_id неверно: завтра придёт второй Петя.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.