У меня есть база данных MySQL с таблицами, некоторые из которых связаны с внешними ключами.Ну, вы можете проверить пример ниже.
Мне нужно убедиться, что оба родитель-потомка могут быть удалены при необходимости.Но мне также нужно убедиться, что система выполнит мягкое удаление (просто отметьте как удалено без физического их удаления), чтобы мы могли восстановить данные или использовать их для анализа.
Я знаю, что могу легко удалить обоих родителей и детей, включив ON DELETE CASCADE
.Но здесь я могу потерять тысячи данных навсегда и не смогу восстановить.Будет случайным, если удаление будет случайным.
Я знаю, что могу отключить ON DELETE CASCADE
и добавить еще одно поле в таблицы базы данных, чтобы пометить записи deleted
.Таким образом, если запись удалена, она будет просто помечена как удаленная и не будет отображаться в приложении, пока она будет представлена в базе данных.Проблема в этом сценарии заключается в том, что если parent
помечен как удаленный, то мне придется пометить все children
как удаленные, по крайней мере, в моей системе.С другой стороны, если я физически захочу удалить записи, это будет довольно большой беспорядок, мне придется сначала удалить все child
записей.
Так что должно быть лучшевариант?Я не очень заинтересован в том, чтобы усложнять создание теневых таблиц, архивных таблиц, представлений и т. Д.
Наилучший вариант, который я могу придумать, представлен ниже.
Включить DELETE ON CASCADE
.Но не выставляйте методы записи delete
обычным пользователям.Предоставляйте эти методы только администраторам.
Добавьте delete_flag
поле в таблицы.В этом поле будет указано, удалена запись или нет.Предоставьте эти методы как обычным пользователям, так и администраторам, так как это физически ничего не удалит.
Пожалуйста, дайте мне знать, хорош ли этот способ или у вас есть лучшие варианты?Также, если мой путь лучше, как обновить delete_flag
ребенка, когда delete_flag
родителей изменился?