Blackjack Schema ERD¶
The blackjack Postgres schema (libs/_prisma/src/schema/blackjack.prisma) isolates all
multiplayer blackjack state from the main public schema. The bj app
(apps/bj/) owns these tables exclusively; the api app never writes to them
directly — it interacts via Redis transport events
(libs/shared/src/events/bj.events.ts:9-38).
Key design choices: BlackjackUser.id is a string containing the
currencyId suffix (e.g. "42-DBC") to reduce schema changes from the legacy
codebase (blackjack.prisma:46-47). All game state lives in the BlackjackGame.data
JSON column (blackjack.prisma:116), keeping the relational schema small.
erDiagram
BlackjackTable {
int id PK
int maxPlayersCount
float minBet
float maxBet
float minPerfectPairsBet
float maxPerfectPairsBet
datetime waitBetUntilUtc
string activeProvablyFairSeedId FK
string gameId
boolean isActive
}
BlackjackGame {
string id PK
int tableId FK
enum status
string provablyFairSeedId FK
datetime waitActionUntilUtc
json data
}
BlackjackPlayerHand {
string id PK
string gameId FK
enum status
}
BlackjackBet {
string id PK
datetime createdAt
datetime settledAt
string userId FK
string gameId
decimal amount
decimal payout
json betData
string blackjackPlayerHandId
}
BlackjackUser {
string id PK
string username
boolean isPrivate
string avatar
int vipLevel
}
BlackjackUserOnTable {
string userId PK,FK
int tableId PK,FK
int position PK
int countOfSkippedGames
}
BlackjackGameConfig {
int id PK
datetime updatedAt
float minBet
float maxBet
int numberOfDecks
float timeToPlaceBetsSec
float timeToMakeActionSec
boolean isInsuranceEnabled
boolean isSplitEnabled
boolean isSurrenderEnabled
}
BlackjackProvablyFairSeed {
string id PK
string serverSeed
string hashedServerSeed
json externalSeedData
}
BlackjackTable ||--o| BlackjackProvablyFairSeed : "active seed"
BlackjackTable ||--o{ BlackjackGame : "hosts"
BlackjackTable ||--o{ BlackjackUserOnTable : "seats"
BlackjackGame ||--|| BlackjackProvablyFairSeed : "uses"
BlackjackGame ||--o{ BlackjackPlayerHand : "contains"
BlackjackUser ||--o{ BlackjackBet : "places"
BlackjackUser ||--o{ BlackjackUserOnTable : "sits at"
Table reference¶
| Table | PK | Row count driver | Prisma line |
|---|---|---|---|
BlackjackTable |
id (autoincrement) |
Static config, ~1-10 rows | blackjack.prisma:59 |
BlackjackGame |
id (string) |
One per round per table | blackjack.prisma:105 |
BlackjackPlayerHand |
id (string) |
One per player per game (+ splits) | blackjack.prisma:94 |
BlackjackBet |
id (string) |
One per hand per player | blackjack.prisma:23 |
BlackjackUser |
id (string, "userId-currencyId") |
Mirrors public.user subset |
blackjack.prisma:44 |
BlackjackUserOnTable |
(userId, tableId, position) |
Active seated players | blackjack.prisma:79 |
BlackjackGameConfig |
id (default 1) |
Singleton row | blackjack.prisma:123 |
BlackjackProvablyFairSeed |
id (uuid) |
One per game + one pending per table | blackjack.prisma:146 |
Cross-references¶
- Blackjack round results sync to
public.Betvia the bet-settled queue (apps/api/src/bet/queue/). BlackjackUseris populated by thebjapp on table-join, copying fields frompublic.User.- Provably-fair seeds here are separate from
public.UserFairnessSeeds— blackjack manages its own seed lifecycle. - Flow doc:
docs/flows/blackjack.md.