# Datenmodell & Struktur ## Entity-Relationship-Modell (ERM) Das Datenmodell basiert auf vier Hauptentitäten: `User`, `Ticket`, `Room` und `Comment`. ```mermaid erDiagram USER ||--o{ TICKET : "erstellt / own" USER ||--o{ COMMENT : "verfasst" USER }|--|{ ROOM : "betreut (supervises)" ROOM ||--o{ TICKET : "beinhaltet" TICKET ||--o{ COMMENT : "hat" USER { Long id PK String email String password String role String firstname String lastname String theme } ROOM { Long id PK String name } TICKET { Long id PK String title_de String title_en String description_de String description_en String status LocalDateTime createdAt Long user_id FK Long room_id FK } COMMENT { Long id PK String text LocalDateTime createdAt Long user_id FK Long ticket_id FK } ``` ### Beziehungen Erklärung 1. **User - Ticket (1:N)**: Ein Benutzer kann viele Tickets erstellen. Ein Ticket gehört immer genau einem Benutzer (Ersteller). 2. **User - Comment (1:N)**: Ein Benutzer kann viele Kommentare verfassen. 3. **User - Room (N:M)**: Ein Benutzer (z.B. Raumbetreuer) kann für mehrere Räume zuständig sein. Ein Raum kann von mehreren Benutzern betreut werden. Diese Beziehung wird über eine Join-Tabelle `user_rooms` abgebildet. 4. **Room - Ticket (1:N)**: Ein Ticket bezieht sich immer auf einen spezifischen Raum. In einem Raum können viele Tickets gemeldet werden. 5. **Ticket - Comment (1:N)**: Ein Ticket kann mehrere Kommentare enthalten (Diskussionsverlauf). --- ## Klassendiagramm (Backend Entitäten) Die Implementierung im Spring Boot Backend (`de.itsolutions.ticketsystem.entity`) spiegelt das ERM wider. ```mermaid classDiagram class User { -Long id -String name_firstname -String name_lastname -String email -String password -String role -String theme -List~Room~ supervisedRooms +getId() +getName() +getEmail() +getRole() } class Ticket { -Long id -String title_de -String title_en -String description_de -String description_en -String status -LocalDateTime createdAt -User owner -Room room +getTitle() +getDescription() +getStatus() +getOwner() } class Room { -Long id -String name +getId() +getName() } class Comment { -Long id -String text -LocalDateTime createdAt -User author -Ticket ticket +getText() +getAuthor() } User "1" --> "*" Ticket : owner User "1" --> "*" Comment : author User "*" --> "*" Room : supervisedRooms Room "1" --> "*" Ticket : room Ticket "1" --> "*" Comment : comments ``` ### Anmerkungen zur Implementierung * **Mehrsprachigkeit**: Die Entität `Ticket` speichert Titel und Beschreibung sowohl in Deutsch (`_de`) als auch in Englisch (`_en`), um Mehrsprachigkeit direkt auf Datenbankebene zu unterstützen. * **Sicherheit**: Das Passwort im `User` Objekt wird gehasht gespeichert (BCrypt). * **Zeitstempel**: `createdAt` Felder werden automatisch bei der Instanziierung (`LocalDateTime.now()`) gesetzt.