124 lines
3.4 KiB
Markdown
124 lines
3.4 KiB
Markdown
# 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.
|