Как эти ограничения могут вызвать циклы или несколько каскадных путей? - PullRequest
1 голос
/ 13 апреля 2020

Примечание: этот вопрос больше касается дизайна базы данных и SQL сервера, чем указано c ORMDB, как EF Core.

У меня есть схема базы данных, которая выглядит следующим образом:

enter image description here

При использовании EF Core Migration все операторы SQL могут выполняться до самого последнего ограничения (FK_BookReleases_Nicknames_NicknameId). Можно добавить предыдущий FK FK_BookReleases_Books_BookId.

Я получаю сообщение об ошибке (как и многие другие статьи о SO):

Введение ограничения FOREIGN KEY 'FK_BookReleases_Nicknames_NicknameId' для таблицы 'BookReleases 'может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY.

Мой вопрос: в чем недостаток этого дизайна? Я не могу понять ни под каким логом c такая ситуация случается. И как правильно исправить? Я вижу, что многие предлагали изменить действие ON DELETE, но не указали c, какой FK и какое другое действие я должен использовать.

Хуже, даже уже прочитал эту статью Я до сих пор не понимаю понять, как это может быть проблемой, и как его предложенное решение вписывается в приведенную выше схему.

1 Ответ

1 голос
/ 13 апреля 2020

Проблема связана с несколькими каскадными путями от Author (Grand Parent) к BookRelease (Grand Child). Существует два каскадных пути:

  1. Автор -> Книга -> BookRelease
  2. Автор -> Псевдоним -> BookRelease

Это подробно обсуждается в сообщение в MSSQLTips

Multiple Cascading Paths

Итак, способ справиться с этим:

  1. Отключите ON DELETE CASCAE и выберите NOACTION в качестве создания внешнего ключа.

  2. Создать INSTEAD OF DELETE TRIGGERS в таблицах Author (GrandParent), Book (Child1), Nickname (Child2) для обработки удаления родительских ключей в дочерних таблицах.

  • Удаление Grand Parent: Удалить в GrandChild, затем Child1, затем Child2,
  • Child1 удаление: Удалить в GrandChild, затем Child1
  • Child2, удаление: Удалить в GrandChild, затем Child2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...