← Назад к вопросам

Что такое ForeignKey?

1.3 Junior🔥 172 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое ForeignKey?

ForeignKey (внешний ключ) — это ограничение целостности данных в реляционных базах данных, которое устанавливает и поддерживает связь между двумя таблицами. Эта связь реализует отношение «один ко многим» (One-to-Many), где запись в одной таблице (таблица-родитель) может быть связана с одной или несколькими записями в другой таблице (таблица-потомок). Основная цель — обеспечение ссылочной целостности, то есть гарантия того, что данные в связанных таблицах остаются согласованными и непротиворечивыми.

Ключевые аспекты ForeignKey:

  • Родительская и дочерняя таблицы:
    *   **Родительская таблица** содержит первичный ключ (`PRIMARY KEY`), на который ссылаются.
    *   **Дочерняя таблица** содержит столбец (или группу столбцов) — внешний ключ (`FOREIGN KEY`), значения которого должны соответствовать значениям первичного ключа родительской таблицы.

  • Обеспечение целостности: При настройке ограничений (ON DELETE и ON UPDATE) СУБД автоматически проверяет и управляет связанными данными, предотвращая «висячие» ссылки. Например, нельзя удалить запись в родительской таблице, если на неё есть ссылки в дочерней.

Пример в SQL (PostgreSQL)

-- 1. Создаём родительскую таблицу "Авторы"
CREATE TABLE authors (
    author_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

-- 2. Создаём дочернюю таблицу "Книги".
--    Поле 'author_id' будет внешним ключом, ссылающимся на 'author_id' в таблице 'authors'.
CREATE TABLE books (
    book_id SERIAL PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    -- Объявление внешнего ключа с ограничениями целостности
    author_id INTEGER NOT NULL,
    FOREIGN KEY (author_id)
        REFERENCES authors (author_id)
        ON DELETE CASCADE  -- При удалении автора все его книги будут удалены автоматически.
        ON UPDATE CASCADE  -- При изменении id автора в таблице books оно также изменится.
);

Пример в Django ORM (Python)

from django.db import models

class Author(models.Model):  # Родительская модель (родительская таблица)
    name = models.CharField(max_length=100)

class Book(models.Model):  # Дочерняя модель (дочерняя таблица)
    title = models.CharField(max_length=200)
    # Поле 'author' - это ForeignKey.
    # Параметр 'on_delete' - это аналог ограничения 'ON DELETE' из SQL.
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

Зачем это нужно QA-инженеру?

Понимание ForeignKey критически важно для тестировщика по нескольким причинам:

  1. Тестирование бизнес-логики и целостности данных:
    *   Проверка сценариев удаления (`DELETE`). Например, что происходит с заказами при удалении пользователя? Они должны либо удаляться (`CASCADE`), либо запрещать удаление (`RESTRICT`), либо обнуляться (`SET NULL`).
    *   Проверка сценариев обновления (`UPDATE`). Например, корректно ли меняется категория у товара?
    *   Валидация создания данных. Можно ли создать запись в дочерней таблице с несуществующим `id` родителя? Система должна предотвращать это.

  1. Анализ и составление тест-кейсов:
    *   Знание связей помогает выявить **критичные цепочки зависимостей**. Удаление одной сущности может привести к каскадному удалению десятков других. Это нужно проверять.
    *   Позволяет проектировать **комбинаторные тесты** (например, состояния заказа, связанного с конкретным пользователем и товаром).

  1. Понимание структуры приложения:
    *   Чтение и анализ моделей данных (как в примере с Django) или ER-диаграмм.
    *   Эффективное общение с разработчиками на одном языке при обсуждении дефектов, связанных с нарушением целостности данных.

  1. Написание сложных запросов для проверки данных:
    *   Для глубокой проверки состояния базы данных после выполнения тестов часто требуются `JOIN-запросы`, основанные как раз на связях через внешние ключи.

Пример тест-кейса, основанного на знании ForeignKey:

Заголовок: Проверка каскадного удаления Автора (связь Author <- Book, ON DELETE CASCADE). Шаги:

  1. Создать автора (Author) в системе.
  2. Создать несколько книг (Book), связанных с этим автором.
  3. Удалить автора через UI или API.
  4. Проверить, что автор отсутствует в таблице authors.
  5. Проверить (через БД или API), что все книги, связанные с этим автором, также были удалены из таблицы books. Ожидаемый результат: Автор и все его книги удалены. Запрос SELECT * FROM books WHERE author_id = <id_удаленного_автора> должен вернуть пустой набор.

Таким образом, ForeignKey — это не просто техническая деталь реализации базы данных, а фундаментальная концепция, определяющая поведение данных в приложении. Для QA-специалиста владение этой концепцией напрямую влияет на глубину и качество тестирования, позволяя находить сложные, связанные дефекты и проектировать тесты, которые проверяют систему на прочность в условиях реального использования.

Что такое ForeignKey? | PrepBro