Ключі та нормалізація даних (1NF, 2NF, 3NF, BCNF)

Розділ: Бази та сховища даних

📌 Про що ця тема

Тут перевіряють, як правильно організувати дані в реляційній базі, щоб уникнути дублювання та аномалій під час додавання, видалення й оновлення записів. Ключові поняття: ключ (primary, candidate, foreign) і нормальні форми (1NF, 2NF, 3NF, BCNF).


📖 Головне

• Відношення (relation) — це таблиця з рядками (записами) і стовпцями (атрибутами).

• Первинний ключ (primary key) — атрибут або набір атрибутів, що однозначно ідентифікує кожен рядок. Не може бути порожнім (NULL) і не повторюється.

• Потенційний (candidate) ключ — будь-який атрибут/набір, що теж міг би бути первинним. Один з них обирають первинним.

• Складений ключ — ключ із двох і більше атрибутів.

• Зовнішній ключ (foreign key) — атрибут, що посилається на первинний ключ іншої таблиці; забезпечує звʼязок між таблицями.

• Функціональна залежність: атрибут B залежить від A (A → B), якщо кожному значенню A відповідає одне значення B.

• Нормалізація — поетапне розбиття таблиць для усунення надлишковості й аномалій.

• 1NF (перша нормальна форма): усі значення атомарні (одне значення в клітинці), немає повторюваних груп і масивів у клітинці.

• 2NF: таблиця вже в 1NF І немає часткової залежності — кожен неключовий атрибут залежить від ПОВНОГО складеного ключа, а не від його частини. Актуально лише коли ключ складений.

• 3NF: таблиця в 2NF І немає транзитивної залежності — неключовий атрибут не залежить від іншого неключового (A → B, B → C).

• BCNF (посилена 3NF): для КОЖНОЇ залежності X → Y ліва частина X має бути потенційним ключем. Строгіша за 3NF.


🔢 Як це працює на прикладі

Таблиця Замовлення(НомерЗамовлення, Товар, КількістьТовару, НазваКлієнта, МістоКлієнта).

• 1NF: якщо в клітинці «Товар» записано кілька товарів через кому — порушення. Розбиваємо так, щоб у кожному рядку був один товар. Ключ стає складеним: (НомерЗамовлення, Товар).

• 2NF: НазваКлієнта залежить лише від НомерЗамовлення (частина ключа) — це часткова залежність. Виносимо в окрему таблицю Замовлення(НомерЗамовлення, НазваКлієнта), а деталі — Позиції(НомерЗамовлення, Товар, Кількість).

• 3NF: якщо МістоКлієнта залежить від НазваКлієнта (неключовий → неключовий) — транзитивна залежність. Виносимо Клієнти(НазваКлієнта, Місто).


⚠️ Типові помилки

• Плутають первинний і зовнішній ключ: первинний ідентифікує рядок у СВОЇЙ таблиці, зовнішній — посилається на ІНШУ.

• Шукають часткову залежність у таблиці з простим (одноатрибутним) ключем — там 2NF виконується автоматично.

• Вважають, що 1NF — це просто «таблиця»; насправді головне — атомарність і відсутність повторюваних груп.

• Плутають часткову (2NF) і транзитивну (3NF) залежність.

• Думають, що BCNF завжди відрізняється від 3NF — часто вони збігаються.


🎯 Що завчити напамʼять

• Порядок: 1NF → 2NF → 3NF → BCNF (кожна наступна включає попередню).

• 1NF — атомарність. 2NF — нема часткових залежностей. 3NF — нема транзитивних. BCNF — ліва частина кожної залежності є ключем.

• Первинний ключ: унікальний, не NULL. Зовнішній ключ — звʼязок між таблицями.


🧠 Перевір себе

1. Що усуває 2NF?

2. Чим відрізняється зовнішній ключ від первинного?

3. Яка умова 1NF головна?

4. Коли таблиця з простим ключем автоматично в 2NF?


Відповіді: 1 — часткові залежності неключових атрибутів від частини складеного ключа; 2 — зовнішній посилається на первинний ключ іншої таблиці, а первинний ідентифікує рядок у своїй; 3 — атомарність значень і відсутність повторюваних груп; 4 — завжди, бо часткова залежність можлива лише при складеному ключі.

Перевірити себе на практиці

Прочитати — половина справи. Далі потрібні завдання цієї ж теми з розбором кожної відповіді: саме на них видно, чи справді тема закрита.