wiki/z-archive/db-structure-model-comparison.md

8 KiB

Detaillierte Analyse: Datenbankstruktur vs. Pydantic-Modelle

Export-Datum: 2026-01-19T20:12:28.176720Z
Export-Quelle: Production Instance

Zusammenfassung

Von 19 Tabellen haben alle ein entsprechendes Pydantic-Modell, aber es wurden Unterschiede gefunden. Die meisten Unterschiede sind erwartbar (z.B. ID-Felder mit default_factory sind im Modell optional, aber in der DB NOT NULL), aber es gibt einige wichtige Inkonsistenzen, die behoben werden sollten.


Kritische Unterschiede (müssen behoben werden)

1. UserInDB (datamodelUam.py)

Felder nur in DB (fehlen im Modell):

  • privilege (text, nullable)
    • Problem: Feld existiert in der Datenbank, aber nicht im Pydantic-Modell
    • Empfehlung: Entweder Feld zum Modell hinzufügen oder aus der DB entfernen

Typ-Mismatches:

  1. roleLabels

    • DB: jsonb (dict) - nullable
    • Modell: List[str] - optional
    • Problem: Datenbank speichert JSONB (wird als dict interpretiert), Modell erwartet Liste von Strings
    • Empfehlung: Prüfen, wie die Daten tatsächlich gespeichert werden. Wenn es eine Liste ist, sollte der Typ in der DB korrekt sein. Wenn es ein dict ist, sollte das Modell angepasst werden.
  2. resetTokenExpires

    • DB: text - nullable
    • Modell: float (UTC timestamp in seconds) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float (Unix-Timestamp)
    • Empfehlung: DB-Typ sollte double precision (float8) sein, nicht text

2. ChatLog (datamodelChat.py)

Felder nur im Modell (fehlen in DB):

  • actionNumber (Optional[int])
  • roundNumber (Optional[int])
  • taskNumber (Optional[int])
  • Problem: Diese Felder sind im Modell definiert, aber nicht in der Datenbank vorhanden
  • Empfehlung: Entweder Migration erstellen, um diese Spalten hinzuzufügen, oder aus dem Modell entfernen

Typ-Mismatches:

  1. progress

    • DB: text - nullable
    • Modell: float (0.0 to 1.0) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float
    • Empfehlung: DB-Typ sollte double precision (float8) sein
  2. performance

    • DB: text - nullable
    • Modell: Dict[str, Any] - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Dictionary (JSON)
    • Empfehlung: DB-Typ sollte jsonb sein

3. Token (datamodelSecurity.py)

Typ-Mismatches:

  1. userId

    • DB: text - nullable
    • Modell: str - required (nicht optional)
    • Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
    • Empfehlung: DB sollte NOT NULL sein, da es ein required Feld ist
  2. authority

    • DB: text - nullable
    • Modell: AuthAuthority (Enum) - required
    • Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
    • Empfehlung: DB sollte NOT NULL sein
  3. tokenAccess

    • DB: text - nullable
    • Modell: str - required
    • Problem: Datenbank erlaubt NULL, Modell erwartet zwingend einen Wert
    • Empfehlung: DB sollte NOT NULL sein
  4. createdAt

    • DB: text - nullable
    • Modell: float (UTC timestamp) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float
    • Empfehlung: DB-Typ sollte double precision (float8) sein
  5. revokedAt

    • DB: text - nullable
    • Modell: float (UTC timestamp) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float
    • Empfehlung: DB-Typ sollte double precision (float8) sein

4. UserConnection (datamodelUam.py)

Typ-Mismatches:

  1. expiresAt

    • DB: text - nullable
    • Modell: float (UTC timestamp) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float
    • Empfehlung: DB-Typ sollte double precision (float8) sein
  2. tokenExpiresAt

    • DB: text - nullable
    • Modell: float (UTC timestamp) - optional
    • Problem: Datenbank speichert als Text, Modell erwartet Float
    • Empfehlung: DB-Typ sollte double precision (float8) sein

5. ChatWorkflow (datamodelChat.py)

Typ-Mismatches (JSONB vs. List):

Mehrere Felder haben das Problem, dass die DB jsonb (als dict interpretiert) speichert, aber das Modell List[...] erwartet:

  • logs: DB=jsonb (dict), Modell=List[ChatLog]
  • messages: DB=jsonb (dict), Modell=List[ChatMessage]
  • stats: DB=jsonb (dict), Modell=List[ChatStat]
  • tasks: DB=jsonb (dict), Modell=List[...]
  • expectedFormats: DB=text, Modell=List[...]

Problem: JSONB-Felder werden als Dictionary interpretiert, aber das Modell erwartet Listen. Dies deutet darauf hin, dass die Daten möglicherweise als Arrays im JSONB gespeichert werden sollten, oder dass die Serialisierung/Deserialisierung angepasst werden muss.

Empfehlung: Prüfen, wie diese Daten tatsächlich gespeichert und geladen werden. Möglicherweise benötigt die Anwendung eine Custom Serialisierung für JSONB-Arrays.


Erwartbare Unterschiede (keine Aktion erforderlich)

ID-Felder mit default_factory

Viele Tabellen haben ID-Felder, die im Modell als optional=True markiert sind (wegen default_factory=lambda: str(uuid.uuid4())), aber in der DB als NOT NULL definiert sind. Dies ist erwartbar und korrekt, da:

  • Pydantic-Felder mit default_factory sind technisch optional (können beim Erstellen weggelassen werden)
  • Die Datenbank erwartet jedoch immer einen Wert (NOT NULL)

Betroffene Tabellen: AccessRule, AuthEvent, DataNeutraliserConfig, DataNeutralizerAttributes, Mandate, Role, ChatDocument, FileData, FileItem, Prompt


Weitere Typ-Mismatches (möglicherweise erwartbar)

Role.description

  • DB: jsonb (dict) - nullable
  • Modell: str - optional
  • Hinweis: Möglicherweise wird hier ein mehrsprachiges Dictionary gespeichert, während das Modell einen String erwartet. Prüfen, ob eine Custom Serialisierung verwendet wird.

ActionItem.expectedDocumentFormats

  • DB: jsonb (dict) - nullable
  • Modell: List[...] - optional
  • Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List

AutomationDefinition.executionLogs

  • DB: jsonb (dict) - nullable
  • Modell: List[...] - optional
  • Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List

ChatMessage.documents

  • DB: jsonb (dict) - nullable
  • Modell: List[...] - optional
  • Hinweis: Ähnlich wie bei ChatWorkflow - JSONB vs. List

Empfohlene Maßnahmen

Priorität 1 (Kritisch - Datenintegrität):

  1. UserInDB.privilege: Feld hinzufügen oder entfernen
  2. ChatLog: actionNumber, roundNumber, taskNumber hinzufügen oder aus Modell entfernen
  3. Token: Required-Felder (userId, authority, tokenAccess) sollten NOT NULL in DB sein
  4. Timestamp-Felder: Alle Timestamp-Felder sollten double precision sein, nicht text

Priorität 2 (Wichtig - Typ-Konsistenz):

  1. JSONB vs. List: Prüfen und korrigieren der Serialisierung für alle JSONB-Felder, die Listen enthalten sollen
  2. UserInDB.roleLabels: Prüfen, ob es wirklich eine Liste oder ein Dictionary ist

Priorität 3 (Optional - Code-Qualität):

  1. ID-Felder: Optional können die Modelle angepasst werden, um explizit NOT NULL zu reflektieren (aber nicht notwendig)

Technische Details

Typ-Mapping-Probleme

Das Vergleichstool mappt PostgreSQL-Typen wie folgt:

  • character varying / varchar / textstr
  • boolean / boolbool
  • integer / int / bigintint
  • double precision / float8float
  • jsonb / jsondict

Problem: JSONB kann sowohl Dictionaries als auch Arrays enthalten. Das Tool interpretiert JSONB immer als dict, auch wenn es tatsächlich ein Array ist. Dies führt zu falschen Mismatch-Meldungen bei Listen-Feldern.

Lösung: Für eine genauere Analyse müsste das Tool die tatsächlichen JSONB-Werte prüfen oder die Datenbank-Schema-Definitionen genauer analysieren.