Наверное, самое оптимальное сделать поле с временем изменений. Если оно заполнено, то это история, если не заполнено, то актуальное состояние. Чтобы не усложнять запросы, создать триггеры на выборку, update/delete, выполняющие операции с этим полем, а для пользователя его как бы и нет, кроме специфических вопросов по истории. И, конечно, настроить партиционирование таблицы чтобы актуальное и история хранились физически отдельно.