Раньше я работал в системе с историческими данными, и у нас было логическое значение, чтобы указать, какая из них была последней версией данных. Конечно, вам нужно поддерживать постоянство флага на аппликативном уровне. Затем вы можете создать индексы, которые используют флаг, и если вы предоставите его в предложении where, это быстро.
Pro:
- легко понять
- не требует серьезных изменений в вашей (существующей) схеме базы данных
- нет необходимости копировать старые данные в другую таблицу, обновляется только флаг.
Минусы:
- необходимо поддерживать на аппликативном уровне
В противном случае вы можете положиться на отдельную таблицу истории, как предлагается в нескольких ответах.
Pro:
- чистое разделение истории от фактических данных
- возможно каскадное удаление на уровне базы данных между фактическими данными и их историей в случае удаления объекта
Минусы:
- нужно 2 запроса (или объединение), если вам нужна полная история (то есть старые данные + текущие данные)
- строка, соответствующая последней версии данных, будет обновлена. Я слышал, что обновление выполняется медленнее, чем вставка, в зависимости от "размера" данных, которые изменились.
Что лучше, будет зависеть от вашего варианта использования. Мне пришлось иметь дело с системой управления документами, где мы хотели иметь возможность версии документа. Но у нас также была функция возврата к старой версии. Было проще использовать логическое значение для ускорения только той операции, которая требовала последней. Если у вас есть реальные исторические данные (которые никогда не меняются), возможно, лучше использовать отдельную таблицу истории.
Подходит ли понятие истории в вашей доменной модели? Если нет, то у вас есть схема БД, которая отличается от вашей концептуальной модели предметной области. Если на уровне домена фактические данные и старые данные должны обрабатываться одинаково, наличие двух таблиц усложняет проект. Просто рассмотрите случай, когда вам нужно вернуть полную историю (старая + новая). Самым простым решением было бы иметь один класс для каждой таблицы, но тогда вы не можете вернуть список так же легко, как если бы у вас была только одна таблица. Но если это две разные концепции, то хорошо, чтобы история была первоклассной в вашем дизайне.
Я бы также рекомендовал эту статью М. Фаулера, которая также интересна, когда речь идет о временных данных: Шаблоны для вещей, которые меняются со временем