2015-04-14 5 views
1

я иметь следующую структуру: enter image description hereциклов или многократный каскад удаления

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

Стандарт «живой» ситуации, бизнес-логика верна. DB тоже правильная и работает нормально. Но когда я добавить каскадное удаление для каждого из этих отношений, конечно, я получаю ошибку:

'Persons' table 
- Unable to create relationship 'FK_Persons_Areas'. 
Introducing FOREIGN KEY constraint 'FK_Persons_Areas' on table 'Persons' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 
Could not create constraint or index. See previous errors. 

Я понимаю, почему это произошло (каскадное удаление). Например, если область удалена, все проекты, у которых есть этот идентификатор AreaID, должны быть удалены, и все лица, у которых есть этот идентификатор AreaID, должны быть удалены, а затем все проекты, которые удалили людей, должны быть удалены ... Как решить Эта проблема? Я пытался добавить еще одну таблицу с именем ProjectAreas:

enter image description here

, но это не решает проблему. Кроме того, не имея четкого понимания того, что проект имеет одну и только одну область.

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

ответ

1

Эта структура базы данных может быть ненормализованной. Решение этой проблемы, не связанное с удалением каскада напрямую, может решить вашу проблему.

Обратите внимание, что проект содержит внешние ключи как для человека, так и для области, в то время как у человека есть сама область. Теперь вопрос заключается в том, должен ли Проект быть связан с Областью данного лица или нет.

Если это должно быть то же самое, что и у человека, структура ненормальная - информация о том же участке содержится в записи Person и Project; иногда это может быть преднамеренным для целей оптимизации, но я сомневаюсь, что это имеет место для такой небольшой базы данных. Затем вы можете удалить поле AreaID из проекта, не нужно даже рассматривать прямое каскадное удаление между ними, а вместо этого использовать его так, чтобы как только область была удалена, его люди и их проекты также были удалены.

Если это может быть другая область, не связанная с лицом, то поле AreaID действительно необходимо; что бы создать два пути исключения:

  • Регион >> Человек, связанный с областью >> Проект, связанный с Person
  • Area >> Проект связан с Площадь

Теперь то, SQL сервер не например, когда есть несколько путей удаления каскадов (вероятно, по хорошим концептуальным или техническим причинам, которые я не могу назвать сейчас), поэтому вам нужно подумать о том, какое каскадное удаление вы предпочитаете (и выберите ON DELETE NO ACTION на других).Существует три возможности, которые предпочтительнее для вас:

  • Площадь может быть удалена только в том случае, если проекты не имеют прямой связи с ней; тем не менее, вы по-прежнему можете удалять людей всех районов вместе со своими собственными проектами.
  • Площадь может быть удалена только в том случае, если у людей нет прямой связи с ней; однако, если только проекты связаны с областью, они удаляются вместе с областью
  • Область может быть удалена только в том случае, если к ней не привязаны ни люди, ни проекты; вы должны сначала удалить всех связанных с этим людей и проектов

Надеюсь, что это очистит вас. ^^

См. Также: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths

Смежные вопросы