Ce que vous devez faire, c'est laisser la table telle qu'elle est. Vous avez raison, vous devriez stocker les informations client dans la facture pour l'historique de l'endroit où les articles ont été expédiés. Lorsqu'elles changent, vous ne devez PAS mettre à jour ces informations, sauf pour les factures qui n'ont pas encore été expédiées. Pour conserver ce type d'informations, vous avez besoin d'un déclencheur sur la table des clients qui recherche les factures qui n'ont pas été expédiées et met à jour ces adresses automatiquement.
Si vous souhaitez enregistrer des versions historiques des informations client, le processus correct consiste à créer une table d'audit et à la remplir via un déclencheur.
Dans ce cas, l'intégrité des données passe simplement par une clé étrangère à l'identifiant client. L'identifiant lui-même ne doit jamais changer ou être autorisé à changer par l'utilisateur et doit être un nombre de substitution tel qu'un entier. Parce que vous ne devriez pas changer les informations d'adresse dans la facture réelle (sauf si elle n'a pas été expédiée, auquel cas vous feriez mieux de la changer ou le produit sera expédié au mauvais endroit), cela suffit pour maintenir l'intégrité des données. Cela vous permet également de voir où le matériel a été réellement expédié, mais toujours de rechercher les informations actuelles sur le client grâce à l'utilisation de la clé étrangère.
Si vous avez des clients qui changent (sociétés achetées par d'autres sociétés), vous pouvez soit exécuter un processus sur le serveur pour mettre à jour l'identifiant client des anciens enregistrements, soit créer une structure de table indiquant quels identifiants client appartiennent à un identifiant parent actuel. La première est plus facile à faire si vous ne parlez pas de modifier des millions d'enregistrements.