Обязательно ли поле, которое ссылается на другую таблицу, делать внешним ключом (FOREIGN KEY)?

«Обязательно ли поле, которое ссылается на другую таблицу, делать внешним ключом (FOREIGN KEY)?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, с точки зрения синтаксиса SQL это не обязательно. База данных позволит создать столбец user_id без объявления внешнего ключа. Однако, настоятельно рекомендуется всегда использовать FOREIGN KEY, если СУБД их поддерживает.

Преимущества использования внешних ключей:

  • Целостность данных (Referential Integrity): Гарантирует, что значение в столбце ссылается на существующую запись в родительской таблице. Без FK можно вставить user_id = 999999, даже если такого пользователя нет.
  • Защита от каскадных удалений/обновлений: Позволяет автоматически управлять зависимыми записями.
  • Ясность схемы: Явно документирует связи между таблицами для других разработчиков и инструментов.

Пример без FK (проблемный):

CREATE TABLE users (id INT PRIMARY KEY);
CREATE TABLE orders (id INT PRIMARY KEY, user_id INT);
-- В orders можно вставить любой user_id, даже несуществующий
INSERT INTO orders (id, user_id) VALUES (1, 999); -- Ошибки не будет

Пример с FK (рекомендуемый):

CREATE TABLE users (id INT PRIMARY KEY);
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT
);
-- Попытка вставить несуществующий user_id вызовет ошибку
INSERT INTO orders (id, user_id) VALUES (1, 999); -- ОШИБКА: нарушение внешнего ключа

Редкие исключения, когда FK могут не использоваться:

  1. Временные таблицы или кэши: Данные носят временный характер.
  2. Сверхвысоконагруженные OLTP-системы: Где каждая миллисекунда задержки критична, а целостность обеспечивается на уровне приложения. Это продвинутая и рискованная оптимизация.
  3. Работа с полиморфными связями (когда parent_id может ссылаться на одну из нескольких таблиц) — в реляционных БД это антипаттерн, и FK здесь не применимы.

В 99% случаев использование FOREIGN KEY — это best practice для надежности данных.