diff --git a/SQL-Server-Tabellen.md b/SQL-Server-Tabellen.md new file mode 100644 index 0000000..7537499 --- /dev/null +++ b/SQL-Server-Tabellen.md @@ -0,0 +1,270 @@ +# SQL Server Tabellen fuer die Poker-Plattform + +## Uebersicht + +Das folgende Diagramm zeigt die wichtigsten Tabellen fuer: + +- Benutzer +- Sessions +- Freundschaften +- private Lobbys +- Pokerhaende +- Notifications +- Wallet +- Logging + +## ER-Diagramm + +```mermaid +erDiagram + USERS ||--o{ USER_SESSIONS : "hat" + USERS ||--o{ FRIEND_REQUESTS : "sendet" + USERS ||--o{ FRIEND_REQUESTS : "empfaengt" + USERS ||--o{ FRIENDSHIPS : "ist beteiligt" + USERS ||--o{ LOBBIES : "hostet" + USERS ||--o{ LOBBY_MEMBERS : "tritt bei" + USERS ||--o{ LOBBY_INVITES : "sendet" + USERS ||--o{ LOBBY_INVITES : "empfaengt" + USERS ||--o{ HAND_PLAYERS : "spielt" + USERS ||--o{ HAND_ACTIONS : "fuehrt aus" + USERS ||--|| WALLETS : "hat" + USERS ||--o{ NOTIFICATIONS : "erhaelt" + USERS ||--o{ APP_LOGS : "verursacht" + + LOBBIES ||--o{ LOBBY_MEMBERS : "enthaelt" + LOBBIES ||--o{ LOBBY_INVITES : "hat" + LOBBIES ||--o| TABLES : "startet Tisch" + + TABLES ||--o{ HANDS : "enthaelt" + HANDS ||--o{ HAND_PLAYERS : "enthaelt" + HANDS ||--o{ HAND_ACTIONS : "enthaelt" + + USERS { + bigint Id PK + nvarchar Username + nvarchar Email + nvarchar PasswordHash + datetime2 CreatedAt + nvarchar Status + } + + USER_SESSIONS { + bigint Id PK + bigint UserId FK + nvarchar SessionToken + datetime2 CreatedAt + datetime2 ExpiresAt + datetime2 LastSeenAt + bit IsRevoked + } + + FRIEND_REQUESTS { + bigint Id PK + bigint FromUserId FK + bigint ToUserId FK + nvarchar Status + datetime2 CreatedAt + datetime2 RespondedAt + } + + FRIENDSHIPS { + bigint Id PK + bigint UserAId FK + bigint UserBId FK + datetime2 CreatedAt + nvarchar Status + } + + LOBBIES { + bigint Id PK + bigint HostUserId FK + nvarchar LobbyCode + nvarchar Name + nvarchar Status + datetime2 CreatedAt + datetime2 StartedAt + } + + LOBBY_MEMBERS { + bigint Id PK + bigint LobbyId FK + bigint UserId FK + nvarchar Role + nvarchar Status + datetime2 JoinedAt + } + + LOBBY_INVITES { + bigint Id PK + bigint LobbyId FK + bigint FromUserId FK + bigint ToUserId FK + nvarchar Status + datetime2 CreatedAt + datetime2 RespondedAt + } + + TABLES { + bigint Id PK + bigint LobbyId FK + nvarchar Name + int SmallBlind + int BigBlind + int MaxSeats + nvarchar Status + } + + HANDS { + bigint Id PK + bigint TableId FK + int DealerSeat + int ActiveSeat + nvarchar CurrentRound + int PotAmount + int CurrentBetToCall + nvarchar Status + datetime2 StartedAt + datetime2 CompletedAt + } + + HAND_PLAYERS { + bigint Id PK + bigint HandId FK + bigint UserId FK + int SeatIndex + int Stack + int CurrentBet + bit Folded + bit AllIn + bit HasActed + } + + HAND_ACTIONS { + bigint Id PK + bigint HandId FK + bigint UserId FK + int SequenceNumber + nvarchar Round + nvarchar ActionType + int Amount + datetime2 CreatedAt + } + + WALLETS { + bigint UserId PK + int SoftCurrencyBalance + datetime2 UpdatedAt + } + + NOTIFICATIONS { + bigint Id PK + bigint UserId FK + nvarchar Type + nvarchar PayloadJson + bit IsRead + datetime2 CreatedAt + } + + APP_LOGS { + bigint Id PK + bigint UserId FK + nvarchar EventType + nvarchar ReferenceType + bigint ReferenceId + nvarchar PayloadJson + datetime2 CreatedAt + } +``` + +## Tabellen kurz erklaert + +### `Users` + +Speichert Benutzerkonto, Login-Informationen und Basisstatus. + +### `UserSessions` + +Speichert aktive oder historische Sessions nach Login. + +### `FriendRequests` + +Speichert offene, angenommene oder abgelehnte Freundschaftsanfragen. + +### `Friendships` + +Speichert bestaetigte Freundschaften zwischen zwei Benutzern. + +### `Lobbies` + +Private Lobby, die von einem Host erstellt wird. + +### `LobbyMembers` + +Liste aller Benutzer, die aktuell oder historisch Teil einer Lobby sind. + +### `LobbyInvites` + +Einladungen zu privaten Lobbys. + +### `Tables` + +Definition des eigentlichen Pokertisches, der aus einer Lobby hervorgehen kann. + +### `Hands` + +Globaler Zustand einer einzelnen Pokerhand. + +### `HandPlayers` + +Status eines Spielers innerhalb einer Hand. + +### `HandActions` + +Historie aller Aktionen innerhalb einer Hand. + +### `Wallets` + +Soft-Currency oder Chips pro Benutzer. + +### `Notifications` + +Persistente Benutzerbenachrichtigungen. + +### `AppLogs` + +Technische und fachliche Logs zur Nachvollziehbarkeit. + +## Wichtige Beziehungen + +- Ein Benutzer kann viele Sessions haben. +- Ein Benutzer kann viele Freundschaftsanfragen senden und empfangen. +- Eine Lobby hat genau einen Host, aber viele Mitglieder. +- Eine Lobby kann viele Einladungen haben. +- Eine Lobby kann genau einen aktiven Pokertisch erzeugen. +- Ein Tisch hat viele Haende. +- Eine Hand hat viele Spieler und viele Aktionen. +- Ein Benutzer hat genau ein Wallet. +- Ein Benutzer kann viele Notifications und Logs haben. + +## Empfohlene Indizes + +- `Users(Username)` eindeutig +- `Users(Email)` eindeutig +- `UserSessions(SessionToken)` eindeutig +- `FriendRequests(ToUserId, Status)` +- `Friendships(UserAId, UserBId)` +- `Lobbies(LobbyCode)` eindeutig +- `LobbyMembers(LobbyId, UserId)` +- `Hands(TableId, Status)` +- `HandPlayers(HandId, UserId)` +- `HandActions(HandId, SequenceNumber)` +- `Notifications(UserId, IsRead, CreatedAt)` + +## Hinweis zur Umsetzung + +Fuer dein Projekt ist dieses Modell die fachliche Grundlage. +Als naechster Schritt kann ich dir daraus direkt eines von drei Dingen bauen: + +1. das echte `CREATE TABLE` SQL-Skript fuer SQL Server +2. die passenden C# Model-Klassen +3. die ADO.NET Repository-Klassen