JavaRush /Курси /SQL SELF /Принципи першої нормальної форми (1NF)

Принципи першої нормальної форми (1NF)

SQL SELF
Рівень 25 , Лекція 1
Відкрита

Перша нормальна форма (First Normal Form, 1NF) — це початковий етап нормалізації бази даних, який накладає жорсткі обмеження на структуру таблиць. Таблиця знаходиться у 1NF, якщо:

  1. Усі дані атомарні. Кожне значення в комірці таблиці має бути неподільним. Прощавайте, "списки в одній комірці"! У базі даних таке робити не можна.
  2. Кожен рядок унікальний. Тобто таблиця повинна містити первинний ключ (Primary Key) або унікальний ідентифікатор.
  3. Відсутні повторювані групи даних. Значення однієї й тієї ж сутності не повинні бути представлені в одному й тому ж стовпці.

Простіше кажучи, уяви, що таблиця бази даних — це твоя кімната, а атомарні значення — це окремі речі: лампа, стіл, книжка. Якщо кімната захаращена (наприклад, усі речі звалені в купу), ти не зможеш знайти лампу або швидко дізнатися, чи є у тебе запасний стіл. Нормалізація допомагає "розкласти все по поличках".

Приклад порушення 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)? Уяви, що ти зберігаєш дані в таблиці, де в одній комірці може бути одразу кілька значень — наприклад, список товарів, замовлених покупцем. У такому вигляді стає складно працювати з даними: спроба знайти всіх, хто замовив "Клавіатуру", перетворюється на муку. А якщо потрібно змінити або видалити частину інформації, легко припуститися помилки. Коли дані зберігаються в атомарному вигляді — тобто кожне поле містить лише одне значення — робота з ними стає надійнішою й зрозумілішою. До того ж, такі таблиці легше масштабувати, оновлювати й перебудовувати за потреби.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ