Назад к вопросам
Junior
77
questionbank

Как настраиваются связи между таблицами в реляционных базах данных?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В реляционных базах данных связи между таблицами настраиваются с помощью внешних ключей (Foreign Keys).

Внешний ключ — это колонка или набор колонок в одной таблице, которые ссылаются на первичный ключ (Primary Key) другой таблицы. Он устанавливает логическую связь между записями в двух таблицах.

При настройке связи:

  1. Определяется первичный ключ в "родительской" (Parent) таблице. Первичный ключ уникально идентифицирует каждую запись.
  2. В "дочерней" (Child) таблице создается колонка (или набор колонок), которая будет служить внешним ключом.
  3. Эта колонка в "дочерней" таблице связывается с первичным ключом "родительской" таблицы.
  4. Устанавливаются ограничения целостности данных (Constraint):
    • REFERENCES: Указывает, на какую таблицу и какой столбец (первичный ключ) ссылается внешний ключ.
    • ON UPDATE behavior: Определяет, что происходит с записями в дочерней таблице при изменении первичного ключа в родительской. Возможные варианты:
      • CASCADE: Изменения каскадно применяются к дочерним записям.
      • SET NULL: Значения внешнего ключа в дочерней таблице устанавливаются в NULL.
      • RESTRICT: Операция изменения запрещается, если существуют связанные дочерние записи.
      • NO ACTION: Аналогично RESTRICT в большинстве СУБД.
      • SET DEFAULT: Значения внешнего ключа устанавливаются в значение по умолчанию.
    • ON DELETE behavior: Определяет, что происходит с записями в дочерней таблице при удалении записей в родительской. Варианты поведения те же, что и для ON UPDATE.

Пример синтаксиса SQL для создания связи:

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY, // Первичный ключ в таблице Customer
    customer_name VARCHAR(255)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT, // Внешний ключ, ссылающийся на customer_id в таблице Customers
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
    ON UPDATE CASCADE // При изменении customer_id в Customers, он изменится и в Orders
    ON DELETE CASCADE // При удалении Customer, удалятся и связанные Order
);

Типы связей между таблицами:

Тип связи Описание Пример
One-to-One (1:1) Одна запись в первой таблице соответствует одной записи во второй и наоборот. Редкий случай для реляционных БД. Пользователь и его профиль.
One-to-Many (1:N) Одна запись в первой таблице соответствует множеству записей во второй, но каждая запись во второй соответствует только одной записи в первой. Клиент и его заказы.
Many-to-Many (N:M) Множество записей в первой таблице соответствует множеству записей во второй, и наоборот. Реализуется через промежуточную (связующую) таблицу. Продукты и категории.

Для связи Many-to-Many создается третья таблица, содержащая внешние ключи к обеим таблицам, которые нужно связать.

CREATE TABLE Products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(255)
);

CREATE TABLE Categories (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(255)
);

CREATE TABLE ProductCategories ( // Связующая таблица
    product_id INT,
    category_id INT,
    PRIMARY KEY (product_id, category_id), // Составной первичный ключ
    FOREIGN KEY (product_id) REFERENCES Products(product_id),
    FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);