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.