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