Всем привет! Уже неделю не могу решиться на конкретный способ удаления информации с сохранением целостности данных...
Решил рассуждать по максимуму... т.е. пользователь может удалять любую свою инфу с сайта в любое время (как в социальных сетях).
Перебрал идеи:
- не удаление, а скрытие информации - этот подход наверное самый плохой ибо во всех запроса сайта придется отсеивать эти лишние данные. К тому же, если к статье написан комментарий, то при просмотре своих комментариев пользователь будет видеть часть статьи, но не сможет её открыть. Поэтому лучше удалять все вместе с комментариями.
- каскадное удаление с помощью внешних ключей, не понравилось ибо нельзя создать зависимости от нескольких полей в таблице, актуально для таких таблиц как комментарии, где есть флаг "news", "posts" и т.д..
- триггеры, огромная часть логики ложится в базу, что не удобно, ибо не находится перед глазами и скорее всего через пол года просто забудется, в итоге сама идея целостности данных заранее провальна. При этом при добавлении функционала на сайт придется вспоминать что там и где нужно прописать дополнительно. Скорее всего что-то упустится т.к. опять же - все не перед глазами а где-то там.
И вот сейчас думаю об удалении уже в самих модулях (классах) реализующих вывод или изменение информации. Вот и вопрос... как поступить? какие подводные камни?
- Сделать отдельный класс для удаления любой информации с сайта и как и в триггерах всю логику скрывать именно в этом классе. (каждый метод - удаление из одной таблицы, для связанных данных вызываем другие методы и все так удаляется по цепочке) Это немного удобное чем в триггерах, но смысл тот же - логика отделена от проекта.
Или вот еще.... в основном классе модуля (news, posts и т.д.) делаем метод удаления. Для связанных данных подключаем другие классы и уже там вызываем свой метод удаления.
Большой получился, вопрос, но по-другому не выходит... уже несколько раз в разном контексте задавал этот вопрос, решил уместить все в одном месте с наработанным опытом и мыслями о конкретном методе.
Нет, не планировщик, а обычная генерация событий (как в js). Для примера можете посмотреть в документацию Laravel, там событиям отдельная глава посвящена.
Чем? Я привел пример с комментарием... Я скрываю статью, поэтому мне нужно будет скрыть и комментарии к ней (чтобы они не были видны в блоке "последние комментарии"), лайки к комментариям и т.д.? Чтобы все это было не видно в других модулях. Выходит что запросы обрастут кучей where и join только для проверки не скрыта ли статья...