Приведи пример сценария в реляционной базе данных, где между таблицами есть логическая связь, но отсутствует ограничение FOREIGN KEY

«Приведи пример сценария в реляционной базе данных, где между таблицами есть логическая связь, но отсутствует ограничение FOREIGN KEY» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ограничение FOREIGN KEY (FK) обеспечивает ссылочную целостность на уровне СУБД. Его отсутствие означает, что связь существует только на уровне бизнес-логики приложения, что может привести к несогласованным данным.

Пример схемы без FOREIGN KEY:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    CustomerName VARCHAR(100) NOT NULL
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    OrderDate DATE NOT NULL,
    -- Поле для связи с клиентом, но без FK
    CustomerID INT
);
-- Индекс может быть создан для скорости, но целостность не контролируется
CREATE INDEX IX_Orders_CustomerID ON Orders(CustomerID);

Что происходит без FK:

  1. «Висячие» ссылки: Можно вставить заказ с CustomerID = 9999, даже если клиента с таким ID не существует.
  2. «Сироты»: Можно удалить клиента из таблицы Customers, оставив его заказы в таблице Orders без родительской записи.
  3. Отсутствие каскадных операций: При удалении клиента СУБД не предложит автоматически удалить или обнулить его заказы.

Когда это может быть оправдано?

  • Высоконагруженные OLTP-системы: В некоторых случаях FK отключают для увеличения скорости вставки/обновления, перекладывая проверку целостности на приложение.
  • Федеративные базы данных или шардирование: Когда связанные таблицы физически находятся на разных серверах.
  • Этап массовой загрузки данных (ETL): Временное отключение FK для ускорения импорта с последующей проверкой и включением.

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