Skip to content

Datenbank-Schema

Uebersicht

Schedule-Bot verwendet PostgreSQL mit Prisma 7 als ORM. Das Schema ist in prisma/schema.prisma definiert.

ER-Diagramm

┌─────────────────┐     ┌──────────────────────┐
│    Schedule      │────▶│   SchedulePlayer     │
│─────────────────│     │──────────────────────│
│ id              │     │ id                   │
│ date (unique)   │     │ scheduleId (FK)      │
│ reason          │     │ userId               │
│ focus           │     │ displayName          │
│ createdAt       │     │ role (UserRole)      │
│ updatedAt       │     │ availability         │
└─────────────────┘     │ sortOrder            │
                        └──────────────────────┘

┌─────────────────┐     ┌──────────────────────┐
│  UserMapping     │     │ RecurringAvailability │
│─────────────────│     │──────────────────────│
│ discordId (PK)  │     │ id                   │
│ discordUsername  │     │ userId               │
│ displayName     │     │ dayOfWeek (0-6)      │
│ role (UserRole) │     │ availability         │
│ timezone        │     │ active               │
│ isAdmin         │     │ unique(userId,day)   │
│ sortOrder       │     └──────────────────────┘
└─────────────────┘

┌─────────────────┐     ┌──────────────────────┐
│     Scrim       │────▶│    VodComment         │
│─────────────────│     │──────────────────────│
│ id              │     │ id                   │
│ date            │     │ scrimId (FK)         │
│ opponent        │     │ userName             │
│ result (Enum)   │     │ timestamp            │
│ scoreUs/Them    │     │ content              │
│ map             │     └──────────────────────┘
│ matchType       │
│ ourAgents       │     ┌──────────────────────┐
│ theirAgents     │     │     Absence          │
│ vodUrl          │     │──────────────────────│
│ matchLink       │     │ id                   │
│ notes           │     │ userId               │
└─────────────────┘     │ startDate            │
                        │ endDate              │
┌─────────────────┐     │ reason               │
│    Setting      │     └──────────────────────┘
│─────────────────│
│ id              │
│ key (unique)    │
│ value           │
└─────────────────┘

Strategie-Tabellen

┌──────────────────┐     ┌──────────────────────┐
│ StrategyFolder   │────▶│    Strategy           │
│──────────────────│     │──────────────────────│
│ id               │     │ id                   │
│ name             │     │ title                │
│ parentId (self)  │     │ map                  │
│ color            │     │ side                 │
│ sortOrder        │     │ tags                 │
└──────────────────┘     │ agents               │
                         │ content (JSON)       │
                         │ folderId (FK)        │
                         │ authorId             │
                         │ authorName           │
                         └──────┬──────┬────────┘
                                │      │
                    ┌───────────▼┐  ┌──▼───────────┐
                    │StrategyImage│  │StrategyFile  │
                    │────────────│  │──────────────│
                    │ id         │  │ id           │
                    │ strategyId │  │ strategyId   │
                    │ filename   │  │ filename     │
                    │ originalNm │  │ originalName │
                    │ mimeType   │  │ mimeType     │
                    │ size       │  │ size         │
                    └────────────┘  └──────────────┘

Tabellen im Detail

Schedule

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
dateString (Unique)Datum im Format DD.MM.YYYY
reasonString?Grund (Training, Premier, Off-Day, etc.)
focusString?Detail-Text
createdAtDateTimeErstellt
updatedAtDateTimeAktualisiert

SchedulePlayer

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
scheduleIdInt (FK)Referenz auf Schedule
userIdStringDiscord-ID des Spielers
displayNameStringAnzeigename
roleUserRoleMAIN, SUB oder COACH
availabilityStringZeitfenster, "x" oder ""
sortOrderIntSortierreihenfolge

Indizes: scheduleId, userId

UserMapping

SpalteTypBeschreibung
discordIdString (PK)Discord-ID (eindeutig)
discordUsernameStringDiscord Benutzername
displayNameStringAnzeigename im System
roleUserRoleMAIN, SUB oder COACH
timezoneString?IANA-Zeitzone (optional)
isAdminBooleanAdmin-Berechtigung
sortOrderIntSortierreihenfolge

Indizes: discordId, [role, sortOrder]

Scrim

SpalteTypBeschreibung
idStringUUID Primaerschluessel
dateStringDatum (DD.MM.YYYY)
opponentStringGegnername
resultScrimResultWIN, LOSS oder DRAW
scoreUsIntEigene Runden
scoreThemIntGegner-Runden
mapStringKartenname
matchTypeString?Scrim, Tournament, Premier, Custom
ourAgentsString?Eigene Agenten (kommagetrennt)
theirAgentsString?Gegner-Agenten (kommagetrennt)
vodUrlString?VOD-Link
matchLinkString?Match-Link
notesString?Notizen

VodComment

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
scrimIdString (FK)Referenz auf Scrim
userNameStringKommentar-Autor
timestampIntZeitstempel in Sekunden
contentStringKommentar-Text

Indizes: [scrimId, timestamp]Cascade: Loeschen eines Scrims loescht alle Kommentare.

Absence

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
userIdStringDiscord-ID
startDateStringBeginn (DD.MM.YYYY)
endDateStringEnde (DD.MM.YYYY), inklusive
reasonString?Optionaler Grund

Indizes: userId, [startDate, endDate]

RecurringAvailability

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
userIdStringDiscord-ID
dayOfWeekInt0 (So) bis 6 (Sa)
availabilityStringZeitfenster oder "x"
activeBooleanAktiviert/Deaktiviert

Unique: [userId, dayOfWeek]

Setting

SpalteTypBeschreibung
idInt (Auto)Primaerschluessel
keyString (Unique)Dot-Notation Key
valueStringWert als String

Enums

UserRole

prisma
enum UserRole {
  MAIN
  SUB
  COACH
}

ScrimResult

prisma
enum ScrimResult {
  WIN
  LOSS
  DRAW
}

Wichtige Hinweise

Datumsformat

Daten werden als TEXT (String) im Format DD.MM.YYYY gespeichert, nicht als DATE-Typ. Vergleiche und Sortierungen erfolgen ueber String-Operationen.

Prisma Client Output

Der generierte Client liegt in src/generated/prisma. Nach Schema-Aenderungen muss npm run db:generate ausgefuehrt werden.

MIT License