Задача грубо: для ORM реализовать хранение истории версий некоторых объектов.
Задача в лоб: ввести в БД доп. поле version. Вместо поиска объекта по первичному ключу ID=<value> запрашивать WHERE ID=<value> ORDER BY version DESC LIMIT 1.
Плюс - простота реализации.
Минусы - архив малонужных версий лежит в общей куче, жрёт место и ресуры
- Тяжелеют запросы
- Теряется общая прозрачность системы.
Другой вариант: Заведение параллельной таблицы для версий. Всё то же самое, но version добавляется лишь к альтернативной таблице, куда и сваливается архив.
Плюс - нет потери производительности.
Минусы - придётся вводить новые сущности в виде архивных объектов.
- Снижается общая наглядность.
- Для каждого версионного объекта требуется лишняя таблица.
Третий вариант - одна таблица из полей типа `original_class_name`, `original_id`, `version`, `original_field`, `original_value`.
Т.е. каждое поле версионного объекта лежит в отдельной таблице общей записью.
Плюсы - можно реализовать единый интерфейс бэкапа объектов.
- Нужна только одна лишняя таблица.
Минусы - уродливая таблица
- Усложнение структуры запросов.
...
Есть ещё какие-то мысли?
Как такое во «взрослых системах» делают? :)
Форум —
Development


