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