Перша нормальна форма (First Normal Form, 1NF) — це початковий етап нормалізації бази даних, який накладає жорсткі обмеження на структуру таблиць. Таблиця знаходиться у 1NF, якщо:
- Усі дані атомарні. Кожне значення в комірці таблиці має бути неподільним. Прощавайте, "списки в одній комірці"! У базі даних таке робити не можна.
- Кожен рядок унікальний. Тобто таблиця повинна містити первинний ключ (Primary Key) або унікальний ідентифікатор.
- Відсутні повторювані групи даних. Значення однієї й тієї ж сутності не повинні бути представлені в одному й тому ж стовпці.
Простіше кажучи, уяви, що таблиця бази даних — це твоя кімната, а атомарні значення — це окремі речі: лампа, стіл, книжка. Якщо кімната захаращена (наприклад, усі речі звалені в купу), ти не зможеш знайти лампу або швидко дізнатися, чи є у тебе запасний стіл. Нормалізація допомагає "розкласти все по поличках".
Приклад порушення 1NF
Уявімо, що у нас є таблиця студентів, де ми зберігаємо інформацію про курси, які вони відвідують:
| student_id | name | courses |
|---|---|---|
| 1 | Maria | "Математика, Фізика" |
| 2 | Rob | "Біологія, Хімія" |
Чим погана ця структура? Курси (стовпець courses) записані через кому в одній комірці. Це означає, що якщо ми захочемо, наприклад, знайти всіх студентів, які вивчають фізику, то запит стане кошмаром: доведеться робити складні текстові перетворення. А якщо один зі студентів захоче видалити фізику зі списку — виникне нова проблема. Такі дані не є атомарними, що порушує головне правило 1NF.
Як привести таблицю до 1NF?
Щоб вирішити проблему, ми розділимо дані на окремі рядки, де кожне значення таблиці буде атомарним:
| student_id | name | course |
|---|---|---|
| 1 | Maria | Математика |
| 1 | Maria | Фізика |
| 2 | Rob | Біологія |
| 2 | Rob | Хімія |
Тепер усе окей. Ми перетворили нашу таблицю так, щоб кожне значення в комірці було неподільним. Це відповідає принципам 1NF.
Детальний приклад порушення 1NF та виправлення
Припустимо, у нас є таблиця замовлень інтернет-магазину:
| order_id | customer_name | items |
|---|---|---|
| 1001 | Otto Lin | "Ноутбук, Миша, Клавіатура" |
| 1002 | Anna Song | "Смартфон, Чохол" |
Очевидно, що тут items містить одразу кілька значень через кому, що порушує 1NF.
Щоб привести дані до 1NF, ми будемо зберігати один рядок на кожен товар у замовленні:
| order_id | customer_name | item |
|---|---|---|
| 1001 | Otto Lin | Ноутбук |
| 1001 | Otto Lin | Миша |
| 1001 | Otto Lin | Клавіатура |
| 1002 | Anna Song | Смартфон |
| 1002 | Anna Song | Чохол |
Тепер структура таблиці відповідає принципам 1NF. Кожне замовлення і товар представлені у вигляді окремого рядка, а значення атомарні.
Додавання первинного ключа
Після перетворення таблиці важливо додати унікальний ідентифікатор (первинний ключ) для кожного рядка, щоб гарантувати їх унікальність. У прикладі вище можна використати комбінацію order_id і item як складовий первинний ключ. Але в реальному житті частіше створюють окреме поле id.
| id | order_id | customer_name | item |
|---|---|---|---|
| 1 | 1001 | Otto Lin | Ноутбук |
| 2 | 1001 | Otto Lin | Миша |
| 3 | 1001 | Otto Lin | Клавіатура |
| 4 | 1002 | Anna Song | Смартфон |
| 5 | 1002 | Anna Song | Чохол |
Практичне завдання
У тебе є таблиця студентів з предметами, які вони вивчають, представленими в одній комірці:
| student_id | name | subjects |
|---|---|---|
| 1 | Polly | "Математика, Хімія" |
| 2 | Peter | "Фізика, Інформатика" |
Приведи таблицю до форми, що відповідає 1NF.
Після перетворення таблиця має виглядати так:
| student_id | name | subject |
|---|---|---|
| 1 | Polly | Математика |
| 1 | Polly | Хімія |
| 2 | Peter | Фізика |
| 2 | Peter | Інформатика |
Найчастіші помилки при роботі з 1NF
Коли ти працюєш із базою даних, порушення 1NF можуть проявлятися в таких ситуаціях:
- Зберігання списків або масивів прямо в таблиці. Це найпоширеніша помилка.
- Відсутність унікального ідентифікатора для рядків (первинного ключа). Це робить твою таблицю вразливою до дублювання даних.
- Використання кількох стовпців для зберігання однакової інформації. Наприклад, "course_1", "course_2", "course_3" — замість правильної структури.
Тримай ці моменти в голові, і твоя база даних буде відповідати першій нормальній формі.
Практичне застосування 1NF
У реальних проєктах 1NF має фундаментальне значення. Наприклад:
- У застосунках для керування клієнтами (CRM) дані про клієнтів і їх дії мають бути атомарними. Це спрощує аналіз і пошук.
- В інтернет-магазинах 1NF використовується, щоб ефективно зберігати інформацію про замовлення, товари та покупців.
- У банківських системах дані про клієнтів, їх рахунки й транзакції обов'язково мають бути атомарними, щоб уникнути плутанини між різними операціями.
Дотримання принципів 1NF допомагає проєктувати бази даних, які витримують великі навантаження й залишаються зручними у використанні. Все круто, але з'явилося дублювання даних. Тому ми переходимо до другої нормальної форми (2NF), де стане зрозуміліше, як вирішувати часткові залежності в таблицях.
Чому важливо дотримуватися першої нормальної форми (1NF)? Уяви, що ти зберігаєш дані в таблиці, де в одній комірці може бути одразу кілька значень — наприклад, список товарів, замовлених покупцем. У такому вигляді стає складно працювати з даними: спроба знайти всіх, хто замовив "Клавіатуру", перетворюється на муку. А якщо потрібно змінити або видалити частину інформації, легко припуститися помилки. Коли дані зберігаються в атомарному вигляді — тобто кожне поле містить лише одне значення — робота з ними стає надійнішою й зрозумілішою. До того ж, такі таблиці легше масштабувати, оновлювати й перебудовувати за потреби.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ