Если требование предназначено исключительно для отчетов, рассмотрите возможность создания отдельного хранилища данных. Это позволяет вам использовать структуры данных, такие как медленно меняющиеся измерения, которые намного лучше для исторической отчетности, но плохо работают в транзакционной системе. Полученная комбинация также удаляет исторические отчеты из вашей производственной базы данных, что приведет к выигрышу в производительности и обслуживании.
Если вам нужно, чтобы эта история была доступна в приложении, вам следует реализовать какую-либо функцию управления версиями или логического удаления или сделать все полностью противоположным и пересчитанным (т.е. транзакции никогда не удаляются, просто сторнируются и пересматриваются). Подумайте очень внимательно, нужно ли вам действительно , так как это добавит много сложности. Создание транзакционного приложения, которое может корректно восстановить историческое состояние, значительно сложнее, чем кажется. Финансовое программное обеспечение (например, системы страхования страховки) не может сделать это намного больше, чем вы думаете.
Если вам нужна история исключительно для ведения журнала аудита, создайте теневые таблицы и триггеры ведения журнала аудита. Это гораздо проще и надежнее, чем пытаться правильно и всесторонне реализовать ведение журнала аудита в приложении. Триггеры также будут получать изменения в базе данных из источников вне приложения.