Как правильнее поступать с ненужными записями в БД — удалять или помечать их флагом "deleted"?

Удаление ненужных записей можно сделать так:

1. Удалять физически. Периодически делать OPTIMIZE TABLE.
2. Не удалять. Присваивать флаг, например, «deleted», и в дальнейшем не выбирать записи с этим флагом

Как правильнее и оптимальнее сделать, если удаляться записи будут немного, но регулярно?
  • Вопрос задан
  • 11167 просмотров
Пригласить эксперта
Ответы на вопрос 7
Tujh
@Tujh
2. Не удалять. Присваивать флаг, например, «deleted», и в дальнейшем не выбирать записи с этим флагом

2. не удалять, присваивать флаг, а потом перезаписывать снимая флаг «deleted»
Ответ написан
mark_ablov
@mark_ablov
зависит от размера БД, конечно.
Если база велика я бы комбинировал флаг + удаление по крону + OPTIMIZE во время простоя ночью.
Ответ написан
@ChemAli
Физический смысл.

Запсись БД делается, грубо говоря, в файл. Если запись физически из файла удалить, нужно произвести операцию по усечению файла и его перезаписи, что на многих файловых системах и СУБД — ресурсозатратная (и опасная — вдруг сбой?) операция, поэтому ее стараются избегать. Плюс часто при перезаписи (оптимизации) БД становится недоступна совсем или для некоторых операций, что тоже нехорошо. Отсюда пошла практика пометок «удаленными». Решайте сами, исходя из задачи и необходимости.

Встречал как-то альтерантивный вариант: периодический слив БД в дамп без «помеченных» записей и замена им старой БД. Благодаря тому, что чтение дампа происходило без остановки работы, а заливка нового была достаточно быстрой, решение жило и было приемлемым. Побочный продукт — бекапы.
Ответ написан
Комментировать
CrazySquirrel
@CrazySquirrel
Зависит от того, нужны ли Вам этим записи в будущем, если 100% не понадобятся, я бы ставил флаг на удаление, и по крону удалял.
Ответ написан
Всё зависит от типа таблицы, из которой удаляются записи.
Если это MySQL, то делать пометку deleted и удалять потом.
Если innodb, то удалять физически.
Ответ написан
@rPman
Ответы очевидны.
Помечать флагом — растет база, удалять — понижение производительности (фрагментация, сама операция удаления может оказаться дорогой) и часто усложнение бизнеслогики.

Я бы не рекомендовал удалять данные из сложных баз данных, особенно если это справочники, например выставив в freign key — RESTRICT, чтобы разрешить удаление только для 'свободных' записей. Удаление записей в сложных базах данных, обычно очень сложная операция, обычно перед этим приходится проводить кучу проверок и изменений для связанных данных, поэтому флаг 'deleted' используется как упрощение или даже часть механизма для введения временной составляющей в хранение данных (база данных может являться как средством для хранения текущего состояния, так и для хранения лога изменений данных во времени)

В зависимости от задач:
1. Если удаление происходит сравнительно редко, т.е. если оверхед на размер базы незначителен — то лучше помечать флагом.
2. Если удаления и создания записей очень частые (в результате база не очень растет), то лучше удалять, плюсы от отсутствия фрагментации может оказаться недостаточным, чтобы перебить рост индексов (кстати и кэш в оперативной памяти будет зря занят).
3. Если и скорость и данные критичны, то лучше помечать флагом и удалять по крону, а чтобы минимизировать вероятность задержек на время обслуживания — разделить таблицу на кластеры (можно 'вручную' в классе работы с БД) и очищать каждый кусок отдельно, а разделение сделать с целью отделить часто используемые данные от редко используемых.
Ответ написан
Комментировать
Hoorsh
@Hoorsh
Digital-специалист, веб-разработчик
Компромисс. Помечать на удаление. И удалять небольшими порциями по крону самые старые записи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы