EMZETT.
Увійти

Первинні та зовнішні ключі: надійний зв’язок таблиць

Коротко: Первинний ключ однозначно ідентифікує кожен рядок таблиці; зовнішній ключ вказує на первинний ключ іншої таблиці й тим самим запобігає «висячим» посиланням.

Докладніше: Реляційні бази даних зберігають дані в окремих таблицях (клієнти, замовлення). Щоб знати, яке замовлення якому клієнту належить, кожному рядку потрібен унікальний ідентифікатор (первинний ключ), а зв’язувальній таблиці — посилання на нього (зовнішній ключ).

Подробиці

Первинний ключ (PRIMARY KEY)

Він унікальний і ніколи не порожній (NOT NULL). Типовий вибір — послідовний номер (SERIAL/IDENTITY) або UUID. Сурогатні ключі ніколи не змінюються. Природні ключі (адреса пошти, податковий номер) можуть змінюватися чи повторюватися й тому ризиковані. Первинний ключ може охоплювати кілька стовпців (складений ключ), наприклад у зв’язувальних таблицях. База даних автоматично створює для нього індекс.

Зовнішній ключ (FOREIGN KEY)

Приклад: orders.customer_id REFERENCES customers(id). База даних відхиляє рядки, чий customer_id не існує (посилальна цілісність). Під час видалення або зміни батьківського рядка ви визначаєте поведінку: RESTRICT/NO ACTION (заборонити), CASCADE (видалити разом), SET NULL (очистити посилання). CASCADE зручний, але може видалити несподівано багато рядків.

Практика та підводні камені

  • Індексуйте стовпці зовнішніх ключів самі (PostgreSQL автоматично цього не робить); інакше з’єднання та видалення сповільнюються.
  • Типи зв’язків: 1:n (зовнішній ключ у таблиці n), n:m (окрема зв’язувальна таблиця з двома зовнішніми ключами).
  • UUID чи число? Числа компактні й швидкі, UUID можна генерувати розподілено без координації, і вони нічого не розкривають про кількість записів.
  • Під час масового імпорту не вимикайте зовнішні ключі; завантажуйте дані в правильному порядку.
  • Запити працюють і без зовнішніх ключів, але сміття в даних просочується.

Погляд іспиту

Ключі належать до реляційної моделі та нормалізації. Запам’ятайте: первинний ключ = унікальний + не NULL; зовнішній ключ = посилання, забезпечує цілісність. В ER-моделі зв’язки реалізуються зовнішніми ключами.

Див. також: З’єднання (join), ER-модель, Нормальні форми