Quello che devi fare è lasciare il tavolo così com'è. Hai ragione, dovresti memorizzare le informazioni sul cliente nella fattura per la cronologia di dove sono stati spediti gli articoli. Quando cambia, NON dovresti aggiornare queste informazioni ad eccezione di eventuali fatture che non sono state ancora spedite. Per mantenere questo tipo di informazioni, è necessario un attivatore nella tabella del cliente che cerchi le fatture che non sono state spedite e aggiorni tali indirizzi automaticamente.
Se desideri salvare le versioni storiche delle informazioni sul client, il processo corretto consiste nel creare una tabella di controllo e popolarla tramite un trigger.
L'integrità dei dati in questo caso avviene semplicemente attraverso una chiave esterna all'ID cliente. L'id stesso non dovrebbe mai cambiare o essere autorizzato a cambiare dall'utente e dovrebbe essere un numero surrogato come un intero. Poiché non dovresti modificare le informazioni sull'indirizzo nella fattura effettiva (a meno che non sia stata spedita, nel qual caso è meglio cambiarla o il prodotto verrà spedito nel posto sbagliato), questo è sufficiente per mantenere l'integrità dei dati. Ciò ti consente anche di vedere dove è stato effettivamente spedito il materiale, ma cercare comunque le informazioni correnti sul cliente attraverso l'uso della chiave esterna.
Se hai clienti che cambiano (aziende acquistate da altre società), puoi eseguire un processo sul server per aggiornare l'ID cliente dei vecchi record o creare una struttura di tabella che mostri quali ID client appartengono a un ID padre corrente. Il primo è più facile da fare se non stai parlando di modificare milioni di record.