Ключі та нормалізація даних (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 — завжди, бо часткова залежність можлива лише при складеному ключі.