Создание один-к-одному связи в SQL Server и Entity Framework

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Один-к-одному отношение в SQL Server достигается путем использования УНИКАЛЬНОГО внешнего ключа в зависимой таблице, который ссылается на первичный ключ главной таблицы. Такой подход обеспечивает соответствие каждой строки в LinkedTable только одной строке в MainTable.

SQL
Скопировать код
CREATE TABLE MainTable (
    MainID INT PRIMARY KEY
);

CREATE TABLE LinkedTable (
    LinkedID INT PRIMARY KEY,
    MainID INT UNIQUE REFERENCES MainTable(MainID)
);

Гарантирование строгого один-к-одному отношения

Строгое один-к-одному отношение в SQL Server выполняет требование общей парности записей в TableA и TableB. Для обеспечения такого отношения можно использовать триггеры SQL или проводить контроль на уровне приложения.

Использование триггеров для поддержания отношений

Триггер AFTER INSERT для TableA может создавать связанные записи в TableB, исключая возможность существования строк в TableA без соответствующих пар:

SQL
Скопировать код
CREATE TRIGGER CreateLinkedRecord
ON MainTable
AFTER INSERT
AS
BEGIN
   INSERT INTO LinkedTable(LinkedID, MainID)
   SELECT i.MainID, i.MainID FROM inserted i
END;

Но будьте осторожны с триггерами: хоть они и являются эффективными инструментами, но могут усложнять понимание и контроль модели данных.

Форсирование связи на уровне приложения

В Entity Framework Core 5.0 можно установить ограничение на уровне приложения, гарантирующее присутствие связанной записи:

csharp
Скопировать код
modelBuilder.Entity<MainEntity>()
    .HasOne<LinkedEntity>(e => e.LinkedEntity)
    .WithOne(l => l.MainEntity)
    .IsRequired();

Здесь Entity Framework выступает в роли строгого регулятора, исключающего возможность существования MainEntity без соответствующего LinkedEntity.

Визуализация

Представьте один-к-одному отношение в SQL как хорошо организованный бальный танец:

Ведущий (MainTable)🕺🏻🕺🏻🕺🏻
Партнёр (LinkedTable)💃🏻💃🏻💃🏻

Идеальное один-к-одному отношение выглядит следующим образом:

🕺🏻💃🏻 = Каждый танцор 🕺🏻 из MainTable танцует только с одним танцором 💃🏻 из LinkedTable

УНИКАЛЬНЫЕ ограничения и ограничения ВНЕШНЕГО КЛЮЧА служат строгими посредниками, не позволяющими менять партнёра:

🕺🏻1 ↔️ 💃🏻1 – каждая пара уникальна 🕺🏻2 ↔️ 💃🏻2 – гарантируется, что каждый ведущий танцует только с одним партнёром 🕺🏻3 ↔️ 💃🏻3 – исключается возможность танца в одиночку.

Суть заключается в эксклюзивности и идеальном соответствии.

Проверка один-к-одному отношения

Для проверки корректности своих отношений используйте тесты на наборах примерных данных. Выполняйте CRUD-операции и убедитесь, что правила отношений стабильно выполняются.

Тест операций CRUD

Важность понимания операций CRUD:

  1. Create (Создание): Добавляйте данные с одновременным учётом связей.
  2. Read (Чтение): Проводите проверку данных через представление, отображая соответствие один-к-одному.
  3. Update (Обновление): Вносите изменения, сохраняя целостность отношений.
  4. Delete (Удаление): Удаляйте данные так, чтобы не оставались "сиротские" записи.

Связи должны сохранять свой характер при каждой из операций, в противном случае SQL-система сигнализирует вас об ошибках, вызванных ограничениями или триггерами.

Полезные материалы

  1. Создание связей внешнего ключа – SQL Server | Microsoft Learnофициальное руководство по использованию внешних ключей в SQL Server.
  2. SQL Server: Уникальные ограничения – инструкция по применению уникальных ограничений в SQL Server.
  3. Ограничение FOREIGN KEY в SQL – руководство по работе с ограничениями внешних ключей, ключевыми для реляционного проектирования.
  4. Отношения в Entity Framework – обсуждение один-к-одному отношений на Stack Overflow, которое поможет ознакомиться с дополнительными аспектами.