Що таке нормалізація баз даних?
Нормалізація баз даних — це процес організації даних у базі для зменшення надмірності та покращення цілісності даних. Це включає структурування бази у таблиці та застосування набору правил (нормальних форм) для забезпечення ефективного зберігання даних.
Цілі нормалізації
- Усунення надмірності: Уникнення збереження однакових даних у кількох місцях.
- Забезпечення цілісності даних: Підтримка узгодженості та точності даних.
- Спрощення управління даними: Полегшення вставки, оновлення та видалення даних без виникнення аномалій.
Нормальні форми (NF)
Нормалізація досягається через серію кроків, відомих як нормальні форми. Найпоширенішими є:
Перша нормальна форма (1NF)
Основні вимоги:
- Кожна клітинка таблиці повинна містити одне значення.
Це означає, що в одній клітинці не може бути списку значень, масиву або будь-якої іншої структури даних. Наприклад, якщо у вас є колонка “Телефони”, і ви зберігаєте кілька номерів через кому, це порушує 1NF. Замість цього кожен номер телефону повинен бути в окремому рядку. - Кожен запис повинен бути унікальним.
Це означає, що кожен рядок у таблиці повинен мати унікальний ідентифікатор (первинний ключ, primary key). Первинний ключ може складатися з одного або кількох стовпців, але він повинен гарантувати, що жодні два рядки не будуть однаковими.
- Приклад: У таблиці “Клієнти” може бути стовпець
customer_id
, який є унікальним для кожного клієнта. - Уточнення: Унікальними мають бути рядки, а не всі колонки. Тобто, якщо у вас є 3 колонки, то унікальним має бути первинний ключ (наприклад,
customer_id
), а не всі колонки. Інші колонки можуть містити дублікати.
Друга нормальна форма (2NF)
Основні вимоги:
- Таблиця повинна бути в 1NF.
Це означає, що всі вимоги 1NF повинні бути виконані. - Всі неключові атрибути повинні залежати від усього первинного ключа.
- Якщо первинний ключ складається з одного стовпця, то всі інші стовпці повинні залежати від нього.
- Якщо первинний ключ складається з кількох стовпців (складений ключ), то кожен неключовий атрибут повинен залежати від всього ключа, а не від його частини.
- Приклад: У таблиці “Замовлення товарів” зі стовпцями
order_id
,product_id
іquantity
, первинний ключ може бути складений (order_id
,product_id
). Стовпецьquantity
залежить від обох частин ключа, тому таблиця відповідає 2NF.
Третя нормальна форма (3NF)
Основні вимоги:
- Таблиця повинна бути в 2NF.
Всі вимоги 2NF повинні бути виконані. - Не повинно бути транзитивної залежності.
Це означає, що неключові атрибути не повинні залежати від інших неключових атрибутів. Вони повинні залежати виключно від первинного ключа.
- Приклад: У таблиці “Замовлення” зі стовпцями
order_id
,customer_id
,customer_name
,customer_address
, стовпціcustomer_name
іcustomer_address
залежать відcustomer_id
, а не відorder_id
. Це порушує 3NF. Щоб виправити це, потрібно винести дані про клієнта в окрему таблицю.
Нормальна форма Бойса-Кодда (BCNF)
Основні вимоги:
- Таблиця повинна бути в 3NF.
Всі вимоги 3NF повинні бути виконані. - Кожен детермінант повинен бути кандидатом на ключ.
- Детермінант — це стовпець або набір стовпців, які визначають значення інших стовпців.
- У BCNF вимагається, що будь-який детермінант (стовпець, який визначає інші стовпці) повинен бути потенційним ключем (кандидатом на первинний ключ).
- Приклад: У таблиці “Викладачі” зі стовпцями
teacher_id
,subject
,classroom
, якщоsubject
визначаєclassroom
, тоsubject
повинен бути кандидатом на ключ. Якщо це не так, таблиця порушує BCNF.
Четверта нормальна форма (4NF)
Основні вимоги:
- Таблиця повинна бути в BCNF.
Всі вимоги BCNF повинні бути виконані.
2.
Не повинно бути багатозначних залежностей.
- Багатозначна залежність виникає, коли один стовпець може мати кілька значень, які залежать від іншого стовпця, але не пов’язані між собою.
- Приклад: У таблиці “Студенти” зі стовпцями
student_id
,course
,hobby
, якщо студент може мати кілька курсів і кілька хобі, які не пов’язані між собою, це порушує 4NF. Щоб виправити це, потрібно розділити таблицю на дві: одну для курсів, іншу для хобі.
П’ята нормальна форма (5NF)
Основні вимоги:
- Таблиця повинна бути в 4NF.
Всі вимоги 4NF повинні бути виконані. - Не повинно бути залежностей від з’єднань.
- Ця форма вирішує проблеми, коли дані можуть бути розділені на кілька таблиць, але при цьому зберігають свою цілісність лише при з’єднанні цих таблиць.
- Приклад: У таблиці “Постачальники” зі стовпцями
supplier_id
,product_id
,customer_id
, якщо постачальник може поставляти продукт лише певному клієнту, це порушує 5NF. Щоб виправити це, потрібно розділити таблицю на дві: одну для постачальників і продуктів, іншу для продуктів і клієнтів.
Підсумок
- 1NF: Кожна клітинка має містити одне значення, і кожен запис має бути унікальним (завдяки первинному ключу).
- 2NF: Усі неключові атрибути залежать від усього первинного ключа.
- 3NF: Немає транзитивних залежностей (неключові атрибути залежать лише від первинного ключа).
- BCNF: Кожен детермінант є кандидатом на ключ.
- 4NF: Немає багатозначних залежностей.
- 5NF: Немає залежностей від з’єднань.
Ці нормальні форми допомагають уникнути надмірності, аномалій і забезпечують ефективне управління даними.
Що таке денормалізація бази даних?
Денормалізація — це процес навмисного введення надмірності у базу для покращення продуктивності читання. Це часто використовується в ситуаціях, коли операції читання важливіші за операції запису.
Коли використовувати денормалізацію
- Читання в пріоритеті: Коли база даних використовується переважно для запитів (наприклад, звіти, аналітика).
- Оптимізація продуктивності: Для зменшення кількості з’єднань, необхідних для складних запитів.
- Кешування: Попередній розрахунок та збереження агрегованих даних для пришвидшення запитів.
Недоліки денормалізації
- Збільшення обсягу зберігання: Надмірні дані займають більше місця на диску.
- Ризики цілісності даних: Оновлення та видалення можуть вимагати змін у кількох місцях, збільшуючи ризик несумісностей.
- Складність: Підтримка денормалізованих даних може ускладнити управління базою.
Перекладено з: Нормалізація та Денормалізація баз даних