Was Sie tun müssen, ist, den Tisch so zu lassen, wie er ist. Sie haben Recht, Sie sollten die Kundeninformationen in der Rechnung speichern, um zu erfahren, wohin die Artikel geliefert wurden. Wenn es sich ändert, sollten Sie diese Informationen NICHT aktualisieren, außer für Rechnungen, die noch nicht versandt wurden. Um diese Art von Informationen zu verwalten, benötigen Sie einen Trigger in der Kundentabelle, der nach Rechnungen sucht, die noch nicht versandt wurden, und diese Adressen automatisch aktualisiert.
Wenn Sie historische Versionen der Client-Informationen speichern möchten, besteht der richtige Prozess darin, eine Audit-Tabelle zu erstellen und sie durch einen Trigger zu füllen.
Die Datenintegrität erfolgt in diesem Fall einfach durch einen Fremdschlüssel zur Kunden-ID. Die ID selbst sollte sich niemals ändern oder vom Benutzer geändert werden dürfen und sollte eine Ersatznummer sein, z. B. eine ganze Zahl. Da Sie die Adressinformationen in der eigentlichen Rechnung nicht ändern sollten (es sei denn, sie wurde nicht versandt, in diesem Fall sollten Sie sie besser ändern oder das Produkt wird an den falschen Ort versandt), ist dies ausreichend, um die Datenintegrität zu wahren. Dadurch können Sie auch sehen, wohin das Zeug tatsächlich geliefert wurde, aber dennoch die aktuellen Informationen über den Kunden durch die Verwendung des Fremdschlüssels nachschlagen.
Wenn Sie Kunden haben, die sich ändern (Unternehmen, die von anderen Unternehmen gekauft wurden), können Sie entweder einen Prozess auf dem Server ausführen, um die Kunden-ID alter Datensätze zu aktualisieren, oder eine Tabellenstruktur erstellen, die zeigt, welche Kunden-IDs zu einer aktuellen übergeordneten ID gehören. Ersteres ist einfacher, wenn Sie nicht über das Ändern von Millionen von Datensätzen sprechen.