В целом у вас есть несколько вариантов:
Во-первых, при работе с временными данными вы должны хранить фактические значения, а не только идентификаторы в таблице транзакций. Затем другие таблицы служат в качестве справочных таблиц для создания новых записей, но вы всегда знаете, какими были реальные данные во время транзакций. Это может включать в себя вещи, которые меняются со временем, такие как цена, имя клиента и т. Д. Обратите внимание, что вы можете Также необходимо сохранить поле идентификатора на тот случай, если вам нужно посмотреть, что является текущим эквивалентом.
Или вы можете полностью запретить обновления в таблицах поиска и с помощью триггера деактивировать текущую запись и вставить новую, когда кто-то запускает оператор обновления. Теперь ваши дочерние таблицы содержат значения записи, которая была активной во время ее создания. В этом сценарии вы теряете способность искать текущую стоимость (поэтому вы можете не захотеть делать это по имени клиента или по цене).
Для данных, которые могут вас не волновать, если они изменились с течением времени, но хотели бы отразить текущую информацию, разрешить обновления, но иметь таблицу аудита или истории, поддерживаемую с помощью триггеров; так что вы можете при необходимости воссоздать то, что было бы в то время, или посмотреть, кто что изменил и когда (иногда законное требование).
Какой из этих вариантов подходит вашей текущей ситуации, знает только вы.