Os Pilares dos Reis!
Frodo, olhando para a frente, viu na distância duas grandes rochas se aproximando: pareciam dois grandes pináculos ou pilares de pedra. Altos, íngremes e agourentos, erguiam-se dos dois lados da correnteza. Uma pequena abertura apareceu entre eles, e o Rio levou os barcos naquela direção:
– Olhem os Argonath, os Pilares dos Reis! – gritou Aragorn. – Vamos passar por eles em breve. Mantenham os barcos em fila e o mais separados que puderem. Fiquem no meio da correnteza.
Agora, vamos organizar e expandir nosso modelo de banco de dados. Apresentaremos as tabelas em formato Markdown, adicionando novas tabelas essenciais para um jogo RPG, como quests, tarefas, itens e inventário.
Tabelas
Regioes
| id | nome | imagem | coordenadas | bio | tipo | pai |
|---|---|---|---|---|---|---|
| 1 | Bree | <> | 10,20 | Cidade próspera no Norte | cidade | 0 |
| 2 | Condado | <> | 5,15 | Terra dos Hobbits | região | 0 |
| 3 | Gondor | <> | 50,60 | Reino do Sul | reino | 0 |
Racas
| id | nome | imagem |
|---|---|---|
| 1 | Humano | <> |
| 2 | Hobbit | <> |
| 3 | Elfo | <> |
| 4 | Anão | <> |
Classes
| id | nome | imagem | historia |
|---|---|---|---|
| 1 | Guerreiro | <> | Mestres do combate físico, especializados em armas e armaduras. |
| 2 | Mago | <> | Estudiosos da magia arcana, lançando feitiços poderosos. |
| 3 | Paladino | <> | Guerreiros sagrados dedicados à proteção e justiça. |
| 4 | Ladino | <> | Especialistas em furtividade, armadilhas e exploração. |
Sexos
| id | nome | imagem |
|---|---|---|
| 1 | Masculino | <> |
| 2 | Feminino | <> |
Especializacoes
| id | nome | classe_id |
|---|---|---|
| 1 | Guerreiro DPS | 1 |
| 2 | Tank | 1 |
| 3 | Mago DPS | 2 |
| 4 | Curandeiro | 2 |
Niveis
| id | nome | xp | categoria_id |
|---|---|---|---|
| 1 | Nível 1 | 0 | 1 |
| 2 | Nível 2 | 100 | 1 |
| 3 | Nível 3 | 300 | 1 |
Categorias
| id | nome |
|---|---|
| 1 | Iniciante |
| 2 | Intermediário |
| 3 | Avançado |
PersonagemBase
| id | nome | esqueleto | raca_id | classe_id | cor | sexo_id | vitalidade | forca | agilidade | resistencia | inteligencia | protecao | bio | imagem_pequena | imagem_grande | nivel | regiao_id | pontos_atuais | pontos_proximo_nivel |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Cevado Carrapicho | mannequim | 1 | 3 | azul | 1 | 120 | 90 | 70 | 100 | 80 | 90 | Proprietário hospitaleiro | <> | <> | 5 | 1 | 450 | 550 |
| 2 | Aragorn | mannequim | 1 | 1 | cinza | 1 | 110 | 100 | 95 | 90 | 85 | 85 | Ranger errante | <> | <> | 10 | 1 | 1200 | 1400 |
| 3 | Gandalf | mannequim | 1 | 2 | cinza | 1 | 100 | 70 | 80 | 80 | 120 | 70 | Mago sábio | <> | <> | 15 | 1 | 2000 | 2300 |
| 4 | Frodo Bolseiro | mannequim | 2 | 4 | verde | 1 | 80 | 60 | 100 | 70 | 90 | 60 | Hobbit aventureiro | <> | <> | 8 | 2 | 800 | 950 |
PersonagemEspecializacoes
| personagem_id | especializacao_id | pontos_aprendidos | nivel_maturidade |
|---|---|---|---|
| 1 | 2 | 50 | 3 |
| 2 | 1 | 80 | 5 |
PersonagemHabilidades
| personagem_id | habilidade_id |
|---|---|
| 1 | 1 |
| 2 | 2 |
Habilidades
| id | nome | descricao |
|---|---|---|
| 1 | Ataque Poderoso | Causa dano extra |
| 2 | Cura | Restaura vida |
Animacoes
| id | nome | animacao |
|---|---|---|
| 1 | Ataque | gif1 |
| 2 | Defesa | gif2 |
PersonagemAnimacoes
| personagem_id | animacao_id |
|---|---|
| 1 | 1 |
Quests
| id | nome | descricao | recompensa_xp | recompensa_ouro | nivel_requerido | regiao_id |
|---|---|---|---|---|---|---|
| 1 | Limpar Taverna | Expulsar bêbados | 50 | 10 | 1 | 1 |
| 2 | Entregar Carta | Levar mensagem | 100 | 20 | 2 | 1 |
Tarefas
| id | quest_id | nome | descricao | concluida |
|---|---|---|---|---|
| 1 | 1 | Conversar | Falar com Cevado | false |
| 2 | 1 | Lutar | Derrotar inimigos | false |
Itens
| id | nome | tipo | descricao | valor |
|---|---|---|---|---|
| 1 | Espada | Arma | Arma afiada | 50 |
| 2 | Poção | Consumível | Cura vida | 10 |
Personagem_Itens
| personagem_id | item_id | quantidade |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 5 |
Inventario
| id | personagem_id | item_id | quantidade | equipado |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | true |
Diagrama do Modelo de Dados (Mermaid)
Aqui está um diagrama ER simplificado do nosso modelo de banco de dados, representando as relações entre as tabelas principais.
Comandos SQL: CREATE TABLE
Agora, vamos implementar os comandos CREATE TABLE em PostgreSQL para criar nossas tabelas. Lembre-se de executar estes comandos em sequência, considerando as dependências de chaves estrangeiras.
-- Tabela Regioes
CREATE TABLE Regioes (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
imagem VARCHAR(255),
coordenadas VARCHAR(50),
bio TEXT,
tipo VARCHAR(50),
pai INTEGER REFERENCES Regioes(id)
);
-- Tabela Racas
CREATE TABLE Racas (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
imagem VARCHAR(255)
);
-- Tabela Classes
CREATE TABLE Classes (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
imagem VARCHAR(255),
historia TEXT
);
-- Tabela Sexos
CREATE TABLE Sexos (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
imagem VARCHAR(255)
);
-- Tabela Especializacoes
CREATE TABLE Especializacoes (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
classe_id INTEGER REFERENCES Classes(id)
);
-- Tabela Categorias
CREATE TABLE Categorias (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL
);
-- Tabela Niveis
CREATE TABLE Niveis (
id SERIAL PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
xp INTEGER NOT NULL,
categoria_id INTEGER REFERENCES Categorias(id)
);
-- Tabela PersonagemBase
CREATE TABLE PersonagemBase (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
esqueleto VARCHAR(50),
raca_id INTEGER REFERENCES Racas(id),
classe_id INTEGER REFERENCES Classes(id),
cor VARCHAR(50),
sexo_id INTEGER REFERENCES Sexos(id),
vitalidade INTEGER,
forca INTEGER,
agilidade INTEGER,
resistencia INTEGER,
inteligencia INTEGER,
protecao INTEGER,
bio TEXT,
imagem_pequena VARCHAR(255),
imagem_grande VARCHAR(255),
nivel INTEGER,
regiao_id INTEGER REFERENCES Regioes(id),
pontos_atuais INTEGER,
pontos_proximo_nivel INTEGER
);
-- Tabela PersonagemEspecializacoes
CREATE TABLE PersonagemEspecializacoes (
personagem_id INTEGER REFERENCES PersonagemBase(id),
especializacao_id INTEGER REFERENCES Especializacoes(id),
pontos_aprendidos INTEGER,
nivel_maturidade INTEGER,
PRIMARY KEY (personagem_id, especializacao_id)
);
-- Tabela Habilidades
CREATE TABLE Habilidades (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
descricao TEXT
);
-- Tabela PersonagemHabilidades
CREATE TABLE PersonagemHabilidades (
personagem_id INTEGER REFERENCES PersonagemBase(id),
habilidade_id INTEGER REFERENCES Habilidades(id),
PRIMARY KEY (personagem_id, habilidade_id)
);
-- Tabela Animacoes
CREATE TABLE Animacoes (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
animacao VARCHAR(255)
);
-- Tabela PersonagemAnimacoes
CREATE TABLE PersonagemAnimacoes (
personagem_id INTEGER REFERENCES PersonagemBase(id),
animacao_id INTEGER REFERENCES Animacoes(id),
PRIMARY KEY (personagem_id, animacao_id)
);
-- Tabela Itens
CREATE TABLE Itens (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
tipo VARCHAR(50),
descricao TEXT,
valor INTEGER
);
-- Tabela Personagem_Itens
CREATE TABLE Personagem_Itens (
personagem_id INTEGER REFERENCES PersonagemBase(id),
item_id INTEGER REFERENCES Itens(id),
quantidade INTEGER,
PRIMARY KEY (personagem_id, item_id)
);
-- Tabela Inventario
CREATE TABLE Inventario (
id SERIAL PRIMARY KEY,
personagem_id INTEGER REFERENCES PersonagemBase(id),
item_id INTEGER REFERENCES Itens(id),
quantidade INTEGER,
equipado BOOLEAN DEFAULT FALSE
);
-- Tabela Quests
CREATE TABLE Quests (
id SERIAL PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
descricao TEXT,
recompensa_xp INTEGER,
recompensa_ouro INTEGER,
nivel_requerido INTEGER,
regiao_id INTEGER REFERENCES Regioes(id)
);
-- Tabela Tarefas
CREATE TABLE Tarefas (
id SERIAL PRIMARY KEY,
quest_id INTEGER REFERENCES Quests(id),
nome VARCHAR(100) NOT NULL,
descricao TEXT,
concluida BOOLEAN DEFAULT FALSE
);
Comandos SQL: INSERT INTO
Agora, vamos inserir dados iniciais em nossas tabelas, usando personagens e elementos do Senhor dos Anéis para tornar o exemplo mais imersivo.
-- Inserir Regioes
INSERT INTO Regioes (nome, coordenadas, bio, tipo, pai) VALUES
('Bree', '10,20', 'Cidade próspera no Norte da Terra-média', 'cidade', NULL),
('Condado', '5,15', 'Terra pacífica dos Hobbits', 'região', NULL),
('Gondor', '50,60', 'Reino do Sul, lar dos Homens', 'reino', NULL);
-- Inserir Racas
INSERT INTO Racas (nome) VALUES
('Humano'),
('Hobbit'),
('Elfo'),
('Anão');
-- Inserir Classes
INSERT INTO Classes (nome, historia) VALUES
('Guerreiro', 'Mestres do combate físico, especializados em armas e armaduras.'),
('Mago', 'Estudiosos da magia arcana, lançando feitiços poderosos.'),
('Paladino', 'Guerreiros sagrados dedicados à proteção e justiça.'),
('Ladino', 'Especialistas em furtividade, armadilhas e exploração.');
-- Inserir Sexos
INSERT INTO Sexos (nome) VALUES
('Masculino'),
('Feminino');
-- Inserir Especializacoes
INSERT INTO Especializacoes (nome, classe_id) VALUES
('Guerreiro DPS', 1),
('Tank', 1),
('Mago DPS', 2),
('Curandeiro', 2);
-- Inserir Categorias
INSERT INTO Categorias (nome) VALUES
('Iniciante'),
('Intermediário'),
('Avançado');
-- Inserir Niveis
INSERT INTO Niveis (nome, xp, categoria_id) VALUES
('Nível 1', 0, 1),
('Nível 2', 100, 1),
('Nível 3', 300, 1),
('Nível 5', 700, 2),
('Nível 8', 1200, 2),
('Nível 10', 1800, 2),
('Nível 15', 3000, 3);
-- Inserir Personagens
INSERT INTO PersonagemBase (nome, esqueleto, raca_id, classe_id, cor, sexo_id, vitalidade, forca, agilidade, resistencia, inteligencia, protecao, bio, nivel, regiao_id, pontos_atuais, pontos_proximo_nivel) VALUES
('Cevado Carrapicho', 'mannequim', 1, 3, 'azul', 1, 120, 90, 70, 100, 80, 90, 'Proprietário hospitaleiro da Taberna do Pônei Saltitante, dedicado à paz em Bree.', 5, 1, 450, 550),
('Aragorn', 'mannequim', 1, 1, 'cinza', 1, 110, 100, 95, 90, 85, 85, 'Ranger errante, herdeiro do trono de Gondor, protetor das estradas.', 10, 1, 1200, 1400),
('Gandalf', 'mannequim', 1, 2, 'cinza', 1, 100, 70, 80, 80, 120, 70, 'Mago sábio, Istari enviado para combater o mal na Terra-média.', 15, 1, 2000, 2300),
('Frodo Bolseiro', 'mannequim', 2, 4, 'verde', 1, 80, 60, 100, 70, 90, 60, 'Hobbit aventureiro, portador do Anel, sobrevivente de grandes jornadas.', 8, 2, 800, 950);
-- Inserir Habilidades
INSERT INTO Habilidades (nome, descricao) VALUES
('Ataque Poderoso', 'Causa dano extra com armas'),
('Cura', 'Restaura pontos de vida'),
('Invisibilidade', 'Torna o personagem invisível temporariamente'),
('Teleporte', 'Move o personagem instantaneamente');
-- Inserir PersonagemHabilidades
INSERT INTO PersonagemHabilidades (personagem_id, habilidade_id) VALUES
(1, 1),
(2, 1),
(3, 4),
(4, 3);
-- Inserir Itens
INSERT INTO Itens (nome, tipo, descricao, valor) VALUES
('Espada de Aragorn', 'Arma', 'Espada ancestral dos reis de Gondor', 200),
('Cajado de Gandalf', 'Arma', 'Cajado mágico com poderes arcanos', 300),
('Anel Único', 'Artefato', 'O Anel do Poder, fonte de grande mal', 10000),
('Poção de Cura', 'Consumível', 'Restaura 50 pontos de vida', 20);
-- Inserir Personagem_Itens
INSERT INTO Personagem_Itens (personagem_id, item_id, quantidade) VALUES
(2, 1, 1),
(3, 2, 1),
(4, 3, 1),
(1, 4, 10);
-- Inserir Inventario
INSERT INTO Inventario (personagem_id, item_id, quantidade, equipado) VALUES
(2, 1, 1, TRUE),
(3, 2, 1, TRUE),
(4, 3, 1, TRUE),
(1, 4, 10, FALSE);
-- Inserir Quests
INSERT INTO Quests (nome, descricao, recompensa_xp, recompensa_ouro, nivel_requerido, regiao_id) VALUES
('Limpar a Taverna', 'Expulsar bêbados e manter a ordem na Taberna do Pônei Saltitante', 50, 10, 1, 1),
('Entregar Mensagem', 'Levar uma carta importante de Bree ao Condado', 100, 20, 2, 1),
('Derrotar Orcs', 'Eliminar uma patrulha de Orcs nas estradas próximas', 200, 50, 5, 1);
-- Inserir Tarefas
INSERT INTO Tarefas (quest_id, nome, descricao, concluida) VALUES
(1, 'Conversar com Cevado', 'Falar com o proprietário sobre a situação', FALSE),
(1, 'Lutar contra bêbados', 'Derrotar os perturbadores', FALSE),
(2, 'Pegar a carta', 'Receber a carta de Cevado', FALSE),
(2, 'Viajar ao Condado', 'Entregar a carta em Bolsão', FALSE);
Conclusão da Aula
Parabéns, alunos! Vocês deram o primeiro passo para organizar o caos da Taberna do Pônei Saltitante. Agora, pratiquem criando o banco de dados no PostgreSQL:
- Conecte-se ao seu servidor PostgreSQL (usando psql ou uma ferramenta como pgAdmin).
- Execute os comandos CREATE TABLE em ordem.
- Insira os dados com os INSERTs.
- Façam consultas SELECT para explorar os dados, como
SELECT * FROM PersonagemBase;. - Experimentem JOINs, como
SELECT p.nome, c.nome AS classe FROM PersonagemBase p JOIN Classes c ON p.classe_id = c.id;.