Leider zieht bei uns die Form der Modernisierung ein, die alles alte schlecht findet. Es soll nur noch mit SQL gearbeitet werden und die Schwächen vom SQL aber auch Java + (teilweise) Php werden als Designfehler der > 40 Jahre alten Anwendung verkauft.
Nicht alles was früher geklappt hat war auch gut! Da könnte man tausende von Beispielen nennen.
... allerdings habt Ihr m.E. mit der Modernisierung an der falschen Stelle angefangen.
Ihr hättet zuerst die Dateien/Tabellen bereinigen sollen.
So etwas geht und wenn gewährleistet werden soll, dass auch die alten Schinken noch weiterhin laufen, kann man in 2 Schritten vorgehen:
1. Zusätzliche Spalten in denen die aufgedrößelten Werte stehen
2. ein zusätzlicher Trigger, der die alten und neuen Spalten beim Ändern der Schlüssel-Werte oder beim Einfügen der Schlüssel-Wert beim Insert automatisch gerade zieht.

Dann könnt Ihr Zugriffswege über die neuen Spalten legen. Die alten Programme funktionieren wie bisher und in den neuen Programmen wird nur noch auf die neuen Spalten zugegriffen.
... dann könnt Ihr gemütlich alles umstellen und zum Zeitpunkt x, wenn kein Zugriff mehr auf die alten Spalten erfolgt können die alten Spalten, sowie die Trigger entfernt werden.

Für die JOINs wäre es allerdings besser wenn in den Tabellen mit künstlichen Schlüssel (z.B. Identity Columns) gearbeitet wird, die auch in den abh. Dateien integriert werden.
Auch hier muss man natürlich Zwischenschritte machen um sicherzustellen, dass die Anwendung weiterläuft. Wenn die Joins jedoch in entsprechenden Views hinterlegt werden und die Zugriffe nur noch über diese Views erfolgen, kann man auch hier nach und nach (richtig) umstellen. Es muss lediglich die Verknüpfung in der View angepasst werden. Eine Kompilierung ist nicht erforderlich, so lange die Spalten gezielt ausgewählt wurden.
Dem Benutzer/Programmierer, der die View verwendet ist es egal ob und wie die Verknüpfung erfolgt, Hauptsache er bekommt die richtigen Daten.