Estruturando tabelas para um servidor de roleplay
Um servidor de roleplay guarda muitas informações relacionadas: quem é dono de qual casa, quais veículos pertencem a quem, quem está em qual facção. Um banco bem modelado evita dados duplicados e facilita novos sistemas.
Contas x personagens
Muitos servidores RP permitem vários personagens por conta. Separe:
CREATE TABLE contas (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario VARCHAR(24) NOT NULL UNIQUE,
senha_hash VARCHAR(255) NOT NULL,
admin TINYINT NOT NULL DEFAULT 0,
criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE personagens (
id INT AUTO_INCREMENT PRIMARY KEY,
conta_id INT NOT NULL,
nome VARCHAR(24) NOT NULL UNIQUE,
dinheiro INT NOT NULL DEFAULT 0,
banco INT NOT NULL DEFAULT 0,
skin SMALLINT NOT NULL DEFAULT 0,
pos_x FLOAT, pos_y FLOAT, pos_z FLOAT,
faccao_id INT NULL,
FOREIGN KEY (conta_id) REFERENCES contas(id)
);
Propriedades
CREATE TABLE casas (
id INT AUTO_INCREMENT PRIMARY KEY,
dono_id INT NULL,
preco INT NOT NULL,
entrada_x FLOAT, entrada_y FLOAT, entrada_z FLOAT,
interior_id INT NOT NULL,
trancada TINYINT NOT NULL DEFAULT 1,
INDEX (dono_id)
);
CREATE TABLE veiculos (
id INT AUTO_INCREMENT PRIMARY KEY,
dono_id INT NULL,
modelo SMALLINT NOT NULL,
cor1 TINYINT, cor2 TINYINT,
pos_x FLOAT, pos_y FLOAT, pos_z FLOAT, angulo FLOAT,
placa VARCHAR(16),
INDEX (dono_id)
);
dono_id NULL significa "sem dono, à venda".
Facções
CREATE TABLE faccoes (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(48) NOT NULL,
tipo TINYINT NOT NULL -- polícia, gangue, empresa...
);
CREATE TABLE faccao_membros (
personagem_id INT PRIMARY KEY,
faccao_id INT NOT NULL,
cargo TINYINT NOT NULL DEFAULT 0
);
Inventário
CREATE TABLE inventario (
id INT AUTO_INCREMENT PRIMARY KEY,
personagem_id INT NOT NULL,
item_id SMALLINT NOT NULL,
quantidade INT NOT NULL,
INDEX (personagem_id)
);
Uma linha por item é mais flexível que 20 colunas item1, item2...
Logs
CREATE TABLE logs_transacoes (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
de_id INT, para_id INT,
valor INT,
tipo VARCHAR(32),
criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX (de_id), INDEX (para_id)
);
Logs de dinheiro, itens e ações de admin são essenciais para investigar dupes e abusos.
Boas práticas
- IDs numéricos como chave, nunca o nome (nomes mudam);
- Índices nas colunas de busca;
- InnoDB e utf8mb4;
- Tipos adequados (não use
VARCHARpara números); - Scripts de criação e alteração (migrations) versionados no Git.
Hospede seu servidor com a VittHost
Os planos OPENMP-BR da VittHost incluem de 1 a 5 bancos MySQL, conforme o plano. Servidores no Brasil, painel Pterodactyl, proteção DDoS, compatibilidade total com scripts SA-MP e teste grátis de 3 dias.