| name | databases |
| description | Game data persistence with player profiles, leaderboards, inventory systems using Redis and PostgreSQL |
| sasmp_version | 1.3.0 |
| version | 2.0.0 |
| bonded_agent | 06-database-specialist |
| bond_type | PRIMARY_BOND |
| parameters | {"required":["database_type"],"optional":["connection_pool_size","cache_ttl_s","replication_mode"],"validation":{"database_type":{"type":"string","enum":["postgresql","redis","mongodb","dynamodb","cockroachdb"]},"connection_pool_size":{"type":"integer","min":5,"max":100,"default":20},"cache_ttl_s":{"type":"integer","min":60,"max":86400,"default":3600},"replication_mode":{"type":"string","enum":["single","replica","cluster"],"default":"single"}}} |
| retry_config | {"max_attempts":3,"backoff":"exponential","initial_delay_ms":100,"max_delay_ms":5000,"retryable_errors":["CONNECTION_TIMEOUT","DEADLOCK_DETECTED","REPLICA_LAG"]} |
| observability | {"logging":{"level":"info","fields":["query_type","table","duration_ms","rows_affected"]},"metrics":[{"name":"db_query_duration_seconds","type":"histogram"},{"name":"db_connections_active","type":"gauge"},{"name":"db_errors_total","type":"counter"},{"name":"cache_hit_ratio","type":"gauge"}]} |
Game Databases
Implement efficient data persistence for players, matches, and leaderboards.
Database Selection
| Database | Strength | Use Case |
|---|
| PostgreSQL | ACID, complex queries | Player data, transactions |
| Redis | Ultra-fast | Leaderboards, cache, sessions |
| MongoDB | Flexible schema | Game logs, analytics |
| DynamoDB | Infinite scale | Global leaderboards |
| CockroachDB | Distributed ACID | Multi-region |
PostgreSQL Schema
CREATE TABLE players (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
username VARCHAR(32) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
mmr INTEGER DEFAULT 1000,
level INTEGER DEFAULT 1,
xp INTEGER DEFAULT 0,
coins BIGINT DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
last_login TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_players_mmr ON players(mmr DESC);
CREATE INDEX idx_players_level ON players(level );
inventory (
id UUID gen_random_uuid(),
player_id UUID players(id) CASCADE,
item_type () ,
item_id () ,
quantity ,
metadata JSONB ,
acquired_at NOW(),
(player_id, item_type, item_id)
);
(
id UUID gen_random_uuid(),
game_mode () ,
started_at ,
ended_at ,
winner_team ,
metadata JSONB
);
match_players (
match_id UUID (id),
player_id UUID players(id),
team ,
score ,
kills ,
deaths ,
mmr_change ,
(match_id, player_id)
);