Exposição
Digamos que nosso sistema tenha usuários e alguns jogos . Vamos chamar esses jogos de A , B e C.
Para simplificar, nossas tabelas iniciais ficam assim:
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS games (
id SERIAL PRIMARY KEY
);
Problema
Sempre que jogamos esses jogos e os terminamos, temos que registrar estatísticas relacionadas ao jogo para o usuário específico. Por exemplo, para o jogo A, temos que registrar total_jumps e total_crouches porque a mecânica do jogo permite tal acumulação, no entanto, os jogos B e C podem exigir que registremos outros campos total_* (embora o prefixo total_ não seja necessário). Como armazeno essas informações?
Estou preocupado com a solução para esse problema. Eu criei 2 abordagens:
Solução 1
Tenha uma única tabela para isso:
CREATE TABLE IF NOT EXISTS statistics (
user_id SERIAL REFERENCES users (id) ON DELETE CASCADE,
game_id SERIAL REFERENCES games (id) ON DELETE CASCADE,
fields JSONB,
PRIMARY KEY (user_id, game_id)
);
Dessa forma, deixamos para o nível do aplicativo analisar dados arbitrários provenientes da coluna de campos .
Solução 2
Tenha várias mesas, uma para cada jogo:
CREATE TABLE IF NOT EXISTS A_statistics (
user_id SERIAL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE,
total_jumps INTEGER,
total_crouches INTEGER
);
Pessoalmente, a solução #2 parece melhor para mim, mas... esse problema ainda me incomoda muito. Como se eu estivesse esquecendo de algo, porque nenhuma das opções torna a extensão (adicionar novos jogos) mais fácil? Digamos que adicionamos os jogos D , E e F . Ambas as soluções exigem que, de alguma forma, manipulemos campos específicos (no nível do aplicativo) necessários para esses jogos. Isso é algo com o qual eu simplesmente tenho que me conformar? Ou há uma terceira solução melhor para isso que eu simplesmente não vejo?