Sobes.tech
Назад к вопросам
Junior — Middle
59

Можешь перечислить типы связей, существующие между таблицами в базе данных?

Компании, где спрашивали
Титул-2005

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

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что известны базовые типы связей между таблицами и когда они используются. Обычно ожидают упоминание one-to-one, one-to-many и many-to-many, а также понимание, как они реализуются через ключи и таблицы-связки. Важно уметь отличить логическую связь от физической реализации в БД.

Определение:

Связи между таблицами в реляционной базе данных описывают, как строки одной таблицы соотносятся со строками другой. Основные типы: один к одному, один ко многим и многие ко многим. Реализуются они обычно через первичный и внешний ключи, а для связи многие ко многим — через промежуточную таблицу.

Пример использования:

Например, в интернет-магазине:

  • Users и UserProfiles — связь один к одному: у пользователя один профиль.
  • Orders и OrderItems — связь один ко многим: у одного заказа много позиций.
  • Products и Orders — связь многие ко многим: один товар может входить в разные заказы, а заказ содержит много товаров.
-- One-to-one
CREATE TABLE Users (
    Id INT PRIMARY KEY,
    Name NVARCHAR(100)
);

CREATE TABLE UserProfiles (
    UserId INT PRIMARY KEY,
    Address NVARCHAR(200),
    CONSTRAINT FK_UserProfiles_Users
        FOREIGN KEY (UserId) REFERENCES Users(Id)
);

-- One-to-many
CREATE TABLE Orders (
    Id INT PRIMARY KEY,
    UserId INT NOT NULL,
    CreatedAt DATETIME NOT NULL,
    CONSTRAINT FK_Orders_Users
        FOREIGN KEY (UserId) REFERENCES Users(Id)
);

CREATE TABLE OrderItems (
    Id INT PRIMARY KEY,
    OrderId INT NOT NULL,
    ProductName NVARCHAR(100),
    Quantity INT NOT NULL,
    CONSTRAINT FK_OrderItems_Orders
        FOREIGN KEY (OrderId) REFERENCES Orders(Id)
);

-- Many-to-many
CREATE TABLE Products (
    Id INT PRIMARY KEY,
    Name NVARCHAR(100)
);

CREATE TABLE OrderProducts (
    OrderId INT NOT NULL,
    ProductId INT NOT NULL,
    Quantity INT NOT NULL,
    PRIMARY KEY (OrderId, ProductId),
    CONSTRAINT FK_OrderProducts_Orders
        FOREIGN KEY (OrderId) REFERENCES Orders(Id),
    CONSTRAINT FK_OrderProducts_Products
        FOREIGN KEY (ProductId) REFERENCES Products(Id)
);

Пояснение кода:

Код показывает три типовых варианта:

  1. В UserProfiles поле UserId одновременно является первичным ключом и внешним ключом на Users(Id). Это означает, что каждой записи пользователя соответствует не более одного профиля.
  2. В Orders поле UserId — внешний ключ. Один пользователь может иметь много заказов, но каждый заказ принадлежит одному пользователю.
  3. В OrderProducts хранятся связи между заказами и товарами. Составной первичный ключ (OrderId, ProductId) не позволяет записать одну и ту же пару дважды, а дополнительные поля вроде Quantity позволяют хранить атрибуты самой связи.

Ключевые моменты:

  • Основные связи: 1:1, 1:N, N:M.
  • Связь реализуется через PRIMARY KEY и FOREIGN KEY.
  • Для N:M почти всегда нужна промежуточная таблица.
  • 1:1 часто используют для разнесения данных по смыслу или по безопасности.
  • 1:N — самая распространённая связь в реальных системах.
  • Важно отличать саму связь от способа хранения данных в таблицах.