Как вы справляетесь с удалением записи базы данных, которая может быть FK? - PullRequest
3 голосов
/ 21 мая 2011

Представьте себе эту настройку:

create table ObservationType 
(
ObservationTypeId int primary key identity(1,1),
Name nvarchar(32) not null
)

create table Observation
(
ObservationId int primary key identity(1,1),
ObservationTypeId int foreign key references ObservationType(ObservationTypeId),
Title nvarchar(32) not null,
Description nvarchar(1024) not null,
StudentId int foreign key references Student(StudentId)
)

create table Student
(
 foo bar
)

Теперь представьте, что здесь полно данных, все работает нормально. Как вы справляетесь, когда пользователь хочет удалить тип наблюдения? Вы автоматически удаляете какое-либо наблюдение, которое имеет этот конкретный тип как FK?

В реальном мире, как вы справились с этой ситуацией?

Ответы [ 4 ]

2 голосов
/ 21 мая 2011

добавить каскадное удаление к внешнему ключу?Кроме того, вы действительно хотите разрешить реальное удаление из вашей базы данных?почему бы просто не отметить их как неактивные?

2 голосов
/ 21 мая 2011

Во многих случаях это правильно, поэтому ON DELETE CASCADE существует.

Это означает, что для удаленной строки любая строка в другой таблице, определенная кактакой внешний ключ в этой строке также будет удален.

Вопрос, который вам нужно задать, заключается в том, действительно ли это то, что пользователь действительно хочет?Имеет ли смысл в рамках домена приложения выполнять такие удаления?Спросите своих пользователей, что они ожидают, если они удалят тип наблюдений - что, по их мнению, должно произойти с существующими наблюдениями.

Иногда лучше пойти с мягким удалением (отмечая строку с помощьюудалить статус в поле состояния), так что вы можете восстановить / восстановить.Это не без своей доли проблем .

0 голосов
/ 23 мая 2011

Я предпочитаю использовать «мягкие» удаления, если это возможно.Что означает наличие удаленного битового столбца в таблице.Таким образом, когда вы удаляете, вы фактически запускаете оператор обновления для таблицы, чтобы установить для параметра Удалено значение 1.

Однако, если бы я хотел удалить строки, я бы использовал явный оператор удаления вместо ON DELETE CASCADE foreignключи.

delete Observation
where ObservationTypeId = 1

delete ObservationType
where ObservationTypeId = 1

Я стараюсь избегать использования неявного ON DELETE CASCADE, так как это может привести к скрытым опасным неожиданным удалениям.Если вся база данных построена на внешнем ключе каскадного удаления, кто-то по ошибке может удалить содержимое всей базы данных, просто выполнив команду удаления для одной таблицы, на которую есть ссылки во всех других таблицах.Короче говоря, я нахожу ON DELETE CASCADE склонным к ошибкам решением.

0 голосов
/ 23 мая 2011

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

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

  1. удаляет соответствующие записи наблюдений
  2. удаляет журнал ObservationType
  3. (ActivityLog?), Что было удалено и почему (комментарий).Не нужно хранить весь набор удаленных данных, но достаточно только для соответствия (иначе SOX).Кто, что, когда.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...