# 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