Nun ja, anstatt sich an mehreren typisierten Dateien festzuklammern würde ich die einzelnen Bestandteile selbst speichern. Dann musst du die Daten nicht auf mehrere Dateien verteilen und kannst den Inhalt von TFile z.B. direkt in TTier legen.
Ich mache das, wenn ich keine echte Datenbank verwende, meistens so, dass ich jeder Klasse die Methoden SaveToStream und LoadToStream verpasse. In der Datei speichere ich dann zuerst einen Header mit Informationen über die Programmversion etc. und speichere danach den Inhalt.
Wenn ich dann in einer späteren Version das Dateiformat verändere, dann erkenne ich das am Header und kann ggf. eine Konvertierung in das neue Format durchführen.
Bei einem meiner Programme habe ich das Dateiformat zudem so aufgebaut, dass eine ältere Version die Daten ohne Probleme noch lesen konnte und die neue zusätzliche Informationen so darin gespeichert hat, dass die alte Version das nicht gestört hat. Dafür hatte ich bereits für ggf. neue Versionen entsprechende Kompatibilitätsinformationen vorgesehen. Das nur als Beispiel was bei einem eigenen Format alles möglich ist.
Ich finde diese Lösung jedenfalls sehr viel einfacher und trotzdem flexibler, zudem müssen z.B. Strings so keine feste Länge haben. Außerdem wird die Datenstruktur im Programm so kompakter und übersichtlicher, da man nicht auf die Speicherung achten muss sondern auf logische Zusammenhänge achten kann beim Entwurf der Strukturen.