DBMS - Нормализация базы данных
Здравствуйте, начинающие энтузиасты баз данных! Сегодня мы отправимся в увлекательное путешествие в мир нормализации баз данных. Как ваш доброжелательный邻居-преподаватель информатики, я рад помочь вам освоить этот важный concept в设计中 баз данных. Не волнуйтесь, если вы новички в программировании – мы начнем с азов и постепенно поднимемся!
Введение в нормализацию базы данных
Представьте, что вы организуете свой шкаф. Вы бы просто бросили все свои вещи в одну большую кучу? Конечно нет! Вы бы организовали их по типу, цвету или сезону. Нормализация базы данных очень похожа – это все о том, чтобы организовать данные эффективно и уменьшить избыточность.
Функциональная зависимость
Давайте начнем с основного понятия: функциональная зависимость.
Что такое функциональная зависимость?
Функциональная зависимость (ФЗ) – это отношение между двумя атрибутами в отношении, где один атрибут определяет другой.
Представьте, что у вас есть база данных студентов:
Student_ID | Name | Age | Course |
---|---|---|---|
101 | Alice | 20 | Math |
102 | Bob | 21 | Physics |
103 | Charlie | 19 | Chemistry |
Здесь Student_ID функционально определяет Name, Age и Course. Мы записываем это так:
Student_ID → Name, Age, Course
Это означает, что если мы знаем Student_ID, мы можем определить Name, Age и Course студента.
Аксиомы Армстронга
Теперь давайте поговорим о аксиомах Армстронга. Это основные правила для функциональных зависимостей. Представьте их как "законы физики" для отношений в базе данных!
- Рефлексивность: Если Y является подмножеством X, то X → Y
- Увеличение: Если X → Y, то XZ → YZ
- Транзитивность: Если X → Y и Y → Z, то X → Z
Это может показаться сложным, но это просто формальные способы описания логических отношений. Мы увидим, как они применяются по мере продвижения!
Тривиальная функциональная зависимость
Тривиальная функциональная зависимость возникает, когда атрибут правой части является подмножеством левой части. Например:
Student_ID, Name → Student_ID
Это тривиально, потому что зная Student_ID и Name, вы всегда сможете определить Student_ID (он уже там!).
Нормализация
Теперь давайте погрузимся в сердце нашего урока: нормализация. Нормализация – это процесс организации данных для минимизации избыточности и зависимости. Это как наведение порядка в вашей базе данных!
Первая нормальная форма (1NF)
Первая нормальная форма – это базовый уровень нормализации. Чтобы достичь 1NF:
- Устраните повторяющиеся группы
- Создайте отдельную таблицу для каждого набора связанных данных
- Определите каждый набор связанных данных с помощью основного ключа
Давайте рассмотрим пример:
До 1NF:
Order_ID | Product | Quantity |
---|---|---|
1 | Apple, Banana | 2, 3 |
2 | Orange, Grape | 1, 4 |
После 1NF:
Order_ID | Product | Quantity |
---|---|---|
1 | Apple | 2 |
1 | Banana | 3 |
2 | Orange | 1 |
2 | Grape | 4 |
Смотрите, как мы устранили повторяющиеся группы? Much cleaner!
Вторая нормальная форма (2NF)
Чтобы достичь 2NF, мы должны:
- Быть в 1NF
- Устранить частичные зависимости
Давайте рассмотрим пример:
Student_ID | Course_ID | Course_Name | Instructor |
---|---|---|---|
101 | C1 | Math | Prof. Smith |
102 | C2 | Physics | Prof. Johnson |
Здесь Course_Name и Instructor зависят от Course_ID, а не от Student_ID. Мы должны разделить это на две таблицы:
Таблица 1: Student_Course
Student_ID | Course_ID |
---|---|
101 | C1 |
102 | C2 |
Таблица 2: Course
Course_ID | Course_Name | Instructor |
---|---|---|
C1 | Math | Prof. Smith |
C2 | Physics | Prof. Johnson |
Третья нормальная форма (3NF)
Чтобы достичь 3NF, мы должны:
- Быть в 2NF
- Устранить транзитивные зависимости
Давайте рассмотрим пример:
Employee_ID | Department | Department_Head |
---|---|---|
101 | Sales | John |
102 | Marketing | Sarah |
Здесь Department_Head зависит от Department, который зависит от Employee_ID. Мы должны разделить это:
Таблица 1: Employee
Employee_ID | Department |
---|---|
101 | Sales |
102 | Marketing |
Таблица 2: Department
Department | Department_Head |
---|---|
Sales | John |
Marketing | Sarah |
Форма BCNF (Boyce-Codd Normal Form)
BCNF – это немного более сильная версия 3NF. Чтобы быть в BCNF:
- Быть в 3NF
- Для каждой зависимости X → Y, X должен быть super key
Вот пример:
Student | Subject | Professor |
---|---|---|
Alice | Math | Prof. Smith |
Bob | Physics | Prof. Johnson |
В этом случае и (Student, Subject) → Professor и Professor → Subject. Чтобы достичь BCNF, мы разделяем это:
Таблица 1: Student_Professor
Student | Professor |
---|---|
Alice | Prof. Smith |
Bob | Prof. Johnson |
Таблица 2: Professor_Subject
Professor | Subject |
---|---|
Prof. Smith | Math |
Prof. Johnson | Physics |
И вот мы и добрались до basics нормализации базы данных. Помните, хотя нормализация важна, иногда денormalization может быть полезна для производительности. Все дело в том, чтобы найти правильный баланс для ваших конкретных потребностей.
Надеюсь, это руководство было полезным. Помните, что практика делает мастера! Попробуйте нормализовать некоторые образцовые базы данных самостоятельно. Если у вас есть вопросы, не стесняйтесь задавать их. Счастливого нормирования!
Credits: Image by storyset