В туториалах эту фичу хвалят: удалил пользователя, а база сама зачистила его заказы. На практике это мина, которая может незаметно стереть половину данных.
⚠️ В чем главная опасность
🔹 Невидимая угроза. Одна неточность в запросе:
DELETE FROM users WHERE status = 'banned';
И каскад автоматически стирает связанные платежи, историю и профили.
🔹 Тишина в логах. Приложение даже не узнает, что база удалила еще сотни строк в других таблицах. Восстановить хронологию ошибки будет очень сложно.
🔹 Блокировки. Удаление одной строки тянет за собой скрытые проверки в десятках связанных таблиц, замедляя остальные операции.
🚀 Как делают правильно
🔸 Явное удаление. Сначала код приложения отдельными запросами удаляет зависимости, пишет подробные логи, и только потом удаляет самого пользователя.
🔸 Мягкое удаление (Soft Delete). Вместо
DELETE строке просто меняют статус на удаленную: is_deleted = true.🔸 Защита от ошибки. Внешние ключи настраивают с
ON DELETE RESTRICT. База физически не даст удалить родительскую строку, пока существуют дочерние.💡 Удобство автоматической зачистки не окупает риск потерять данные без следа — управляй удалением явно.



