Aus dem Bauch heraus hätte ich gesagt, eine Tabelle mit den Zuständen und allen zustandsspezifischen Felder. Kommt ein neuer Zustand hinzu, musst halt neue Felder hinzufügen, sonst halt gleich mal eine neue Tabelle. Da du im Code vermutlich eh auf eine unterschiedliche Logik je Zustand eingehen wirst müssen, kannst dort dann auf die entsprechenden Felder zugreifen.
DB-seitig hätte ich die gültigen Kombinationen aus Zustand und zustandsspezifischen Daten über einen Constraint sichergestellt. Mit dem Constraint läuft man dann halt ev. in das Problem, dass der Constraint
DB-seitig geändert werden muss, wenn sich in der Logik etwas ändert. Hier ist halt die Frage, ob sich mehrere Applikationen diese Datenbank teilen oder ob jemand mit einem
SQL-Tool direkt draufgehen kann und dort dann Änderungen vornimmt, die die Anwendung dann nicht mehr verarbeiten kann etc. Ist schnell mal eine Glaubensfrage und wahrscheinlich stellt sich später heraus, dass es anders besser gewesen wäre.