Skip to content

DDL - Data Definition Language

A Linguagem de Definição de Dados, ou Data Definition Language (DDL), é um conjunto de comandos usados em sistemas de gerenciamento de banco de dados (SGBD) para criar, alterar e gerenciar a estrutura dos bancos de dados.


BEGIN TRANSACTION;

CREATE TABLE IF NOT EXISTS Personagem (
    id_personagem SERIAL PRIMARY KEY NOT NULL,
    nome VARCHAR(50) NOT NULL,
    descricao VARCHAR(50) NOT NULL,
    CHECK (tipo IN ('PC', 'NPC'))
);

CREATE TABLE IF NOT EXISTS PC (
    id_personagem SERIAL PRIMARY KEY REFERENCES Personagem(id_personagem),
    hp INT NOT NULL CHECK (hp BETWEEN 0 AND 1000),
    mp INT NOT NULL CHECK (mp BETWEEN 0 AND 1000),
    xp INT NOT NULL CHECK (xp BETWEEN 0 AND 1000),
    absorcao INT NOT NULL CHECK (absorcao BETWEEN 0 AND 1000),
    atk INT NOT NULL CHECK (atk BETWEEN 0 AND 1000),
    lvl INT NOT NULL CHECK (lvl BETWEEN 1 AND 1000),
    luck INT NOT NULL CHECK (luck BETWEEN 0 AND 1000),
    CHECK (combat_status IN ('Confuso', 'Envenenado', 'Normal')),
    coins INT NOT NULL CHECK (coins BETWEEN 0 AND 1000),
    id_sala INT NOT NULL REFERENCES Sala(id_sala)
);

CREATE TABLE IF NOT EXISTS NPC (
    id_personagem SERIAL PRIMARY KEY REFERENCES Personagem(id_personagem),
    tipo VARCHAR(50) NOT NULL
);

CREATE TABLE IF NOT EXISTS Mercador (
    id_personagem SERIAL PRIMARY KEY REFERENCES NPC(id_personagem),
    id_sala INT NOT NULL REFERENCES Sala(id_sala)
);

CREATE TABLE IF NOT EXISTS Contratante (
    id_personagem SERIAL PRIMARY KEY REFERENCES NPC(id_personagem),
    id_sala INT NOT NULL REFERENCES Sala(id_sala)
);

CREATE TABLE IF NOT EXISTS Inimigo (
    id_personagem SERIAL PRIMARY KEY REFERENCES NPC(id_personagem),
    hp INT NOT NULL CHECK (hp BETWEEN 1 AND 1000),
    xp INT NOT NULL CHECK (xp BETWEEN 1 AND 1000),
    absorcao INT NOT NULL CHECK (absorcao BETWEEN 1 AND 1000),
    atk INT NOT NULL CHECK (atk BETWEEN 1 AND 1000),
    habilidade INT NOT NULL CHECK (habilidade BETWEEN 1 AND 1000)
);

CREATE TABLE IF NOT EXISTS Chefe (
    id_personagem SERIAL PRIMARY KEY REFERENCES NPC(id_personagem),
    hp INT NOT NULL CHECK (hp BETWEEN 1 AND 1000),
    xp INT NOT NULL CHECK (xp BETWEEN 1 AND 1000),
    lvl INT NOT NULL CHECK (lvl BETWEEN 1 AND 1000),
    CHECK (combat_status IN ('Confuso', 'Envenenado', 'Normal')),
    absorcao INT NOT NULL CHECK (absorcao BETWEEN 1 AND 1000),
    atk INT NOT NULL CHECK (atk BETWEEN 1 AND 1000),
    item_especial INT NOT NULL REFERENCES Item(id_item),
    id_sala INT NOT NULL REFERENCES Sala(id_sala)
);

CREATE TABLE IF NOT EXISTS InstanciaInimigo (
    id_instancia SERIAL PRIMARY KEY NOT NULL,
    id_inimigo INT NOT NULL REFERENCES Inimigo(id_personagem),
    id_sala INT NOT NULL REFERENCES Sala(id_sala),
    vida_atual INT NOT NULL CHECK (vida_atual BETWEEN 1 AND 1000),
    absorcao INT NOT NULL CHECK (absorcao BETWEEN 1 AND 1000),
    atk INT NOT NULL CHECK (atk BETWEEN 1 AND 1000),
    habilidade INT NOT NULL CHECK (habilidade BETWEEN 1 AND 1000),
    CHECK (combat_status IN ('Confuso', 'Envenenado', 'Normal'))
);

CREATE TABLE IF NOT EXISTS Checkpoint (
    id_checkpoint SERIAL PRIMARY KEY NOT NULL,
    id_sala INT NOT NULL REFERENCES Sala(id_sala),
    id_pc INT NOT NULL REFERENCES PC(id_personagem)
);

CREATE TABLE IF NOT EXISTS Bau (
    id_bau SERIAL PRIMARY KEY NOT NULL,
    itens INT NOT NULL REFERENCES Item(id_item)
);

CREATE TABLE IF NOT EXISTS SalaBau (
    id_bau INT NOT NULL REFERENCES Bau(id_bau),
    id_sala INT NOT NULL REFERENCES Sala(id_sala),
    SERIAL PRIMARY KEY (id_bau, id_sala)
    UNIQUE (id_bau) -- Garante que um baú só esteja em uma sala
);

CREATE TABLE IF NOT EXISTS Sala (
    id_sala SERIAL NOT NULL PRIMARY KEY,
    id_regiao INT NOT NULL,
    nome VARCHAR(200) NOT NULL,
    descricao VARCHAR(200) NOT NULL,
    FOREIGN KEY (id_regiao) REFERENCES Regiao(id_regiao)
);

CREATE TABLE IF NOT EXISTS Conexao (
    id_conexao SERIAL PRIMARY KEY NOT NULL,
    id_sala_origem INT NOT NULL,
    id_sala_destino INT NOT NULL,
    direcao VARCHAR(20) NOT NULL,
    descricao_conexao TEXT,
    FOREIGN KEY (id_sala_origem) REFERENCES Sala(id_sala),
    FOREIGN KEY (id_sala_destino) REFERENCES Sala(id_sala),
    CHECK (direcao IN ('Norte', 'Sul', 'Leste', 'Oeste'))
);

CREATE TABLE IF NOT EXISTS Regiao (
    id_regiao SERIAL NOT NULL PRIMARY KEY,
    id_regiao_conectada INT NOT NULL,
    id_mundo INT NOT NULL,
    nome VARCHAR(200) NOT NULL,
    descricao VARCHAR(200) NOT NULL,
    dificuldade VARCHAR(50) NOT NULL,
    FOREIGN KEY (id_regiao_conectada) REFERENCES Regiao(id_regiao),
    FOREIGN KEY (id_mundo) REFERENCES Mundo(id_mundo)
    CHECK (id_regiao != id_regiao_conectada) -- Evita loops
);

CREATE TABLE IF NOT EXISTS Mundo (
    id_mundo SERIAL NOT NULL PRIMARY KEY,
    nome VARCHAR(200) NOT NULL,
    data DATE NOT NULL
);

CREATE TABLE IF NOT EXISTS Dialogo (
    id_dialogo SERIAL NOT NULL PRIMARY KEY,
    id_personagem INT NOT NULL,
    texto VARCHAR(200) NOT NULL,
    FOREIGN KEY (id_personagem) REFERENCES Personagem(id_personagem)
);

CREATE TABLE IF NOT EXISTS Transacao (
    id_transacao SERIAL NOT NULL PRIMARY KEY,
    id_mercador INT NOT NULL,
    id_pc INT NOT NULL,
    valor INT NOT NULL,
    CHECK (tipo IN ('venda', 'compra')),
    FOREIGN KEY (id_mercador) REFERENCES Mercador(id_mercador),
    FOREIGN KEY (id_pc) REFERENCES PC(id_pc)
);

CREATE TABLE IF NOT EXISTS Combate (
    id_combate SERIAL NOT NULL PRIMARY KEY,
    id_pc INT NOT NULL,
    id_inimigo INT NOT NULL,
    CHECK (resultado IN ('venceu', 'derrotado', 'fugiu')),
    FOREIGN KEY (id_pc) REFERENCES PC(id_pc),
    FOREIGN KEY (id_inimigo) REFERENCES InstanciaInimigo(id_inimigo)
);

CREATE TABLE IF NOT EXISTS Inventario (
    id_inventario SERIAL NOT NULL PRIMARY KEY REFERENCES PC(id_personagem),
    id_instancia_item INT NOT NULL,
    FOREIGN KEY (id_instancia_item) REFERENCES InstanciaItem(id_instancia_item)
);

CREATE TABLE IF NOT EXISTS Loja (
    id_loja SERIAL NOT NULL PRIMARY KEY,
    id_mercador INT NOT NULL,
    id_instancia_item INT NOT NULL,
    FOREIGN KEY (id_mercador) REFERENCES Mercador(id_mercador),
    FOREIGN KEY (id_instancia_item) REFERENCES InstanciaItem(id_instancia_item)
);

CREATE TABLE IF NOT EXISTS InstanciaItem (
    id_instancia_item SERIAL NOT NULL PRIMARY KEY,
    id_item INT NOT NULL,
    id_sala INT NOT NULL,
    FOREIGN KEY (id_item) REFERENCES Item(id_item),
    FOREIGN KEY (id_sala) REFERENCES Sala(id_sala)
);

CREATE TABLE IF NOT EXISTS MissoesRealizadas (
    id_missao SERIAL NOT NULL,
    id_pc INT NOT NULL,
    SERIAL PRIMARY KEY (id_missao, id_pc),
    FOREIGN KEY (id_missao) REFERENCES Missao(id_missao),
    FOREIGN KEY (id_pc) REFERENCES PC(id_pc)
);

CREATE TABLE IF NOT EXISTS Missao (
    id_missao SERIAL NOT NULL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    qnt_xp INT NOT NULL,
    descricao VARCHAR(200) NOT NULL
);

CREATE TABLE IF NOT EXISTS MissaoPrincipal (
    id_missao SERIAL NOT NULL PRIMARY KEY REFERENCES Missao(id_missao),
    id_dependencia INT NOT NULL,
    FOREIGN KEY (id_dependencia) REFERENCES Missao(id_missao)
);

CREATE TABLE IF NOT EXISTS Contrato (
    id_missao SERIAL NOT NULL PRIMARY KEY REFERENCES Missao(id_missao),
    id_dependencia INT NOT NULL,
    id_contratante INT NOT NULL,
    FOREIGN KEY (id_dependencia) REFERENCES Contrato(id_missao),
    FOREIGN KEY (id_contratante) REFERENCES Contratante(id_contratante)
    CHECK (id_missao != id_dependencia) -- Evita loops
);

CREATE TABLE IF NOT EXISTS Item (
    id_item SERIAL NOT NULL PRIMARY KEY,
    nome VARCHAR(200) NOT NULL,
    descricao VARCHAR(200) NOT NULL
);

CREATE TABLE IF NOT EXISTS Chave (
    id_item SERIAL PRIMARY KEY REFERENCES Item(id_item),
    bau_requerido VARCHAR(50) NOT NULL
);

CREATE TABLE IF NOT EXISTS Arma (
    id_item SERIAL PRIMARY KEY REFERENCES Item(id_item),
    dano INT NOT NULL CHECK (dano BETWEEN 1 AND 1000)
);

CREATE TABLE  IF NOT EXISTS Consumivel (
    id_item SERIAL PRIMARY KEY REFERENCES Item(id_item),
    id_efeito INT NOT NULL,
    quantidade INT NOT NULL CHECK (quantidade BETWEEN 1 AND 1000),
    FOREIGN KEY (id_efeito) REFERENCES Efeito(id_efeito)
);

CREATE TABLE IF NOT EXISTS Grimorio (
    id_item SERIAL PRIMARY KEY REFERENCES Item(id_item),
    xp_necessario INT NOT NULL CHECK (xp_necessario BETWEEN 1 AND 1000),
    id_habilidade INT NOT NULL,
    FOREIGN KEY (id_habilidade) REFERENCES Habilidade(id_habilidade)
);

CREATE TABLE IF NOT EXISTS Habilidade (
    id_habilidade SERIAL PRIMARY KEY NOT NULL CHECK (id_habilidade BETWEEN 1 AND 1000),
    id_habilidade_dependente INT NOT NULL,
    id_grimorio INT NOT NULL,
    efeito VARCHAR(50) NOT NULL,
    tipo VARCHAR(50) NOT NULL,
    custo_mp INT NOT NULL CHECK (custo_mp BETWEEN 1 AND 1000),
    FOREIGN KEY (id_habilidade_dependente) REFERENCES Habilidade(id_habilidade),
    FOREIGN KEY (id_grimorio) REFERENCES Grimorio(id_grimorio)
);

CREATE TABLE IF NOT EXISTS Efeito (
    id_efeito SERIAL PRIMARY KEY NOT NULL CHECK (id_efeito BETWEEN 1 AND 1000),
    alcance INT NOT NULL CHECK (alcance BETWEEN 0 AND 1000),
    duracao INT NOT NULL CHECK (duracao BETWEEN 1 AND 1000)
);

COMMIT;

Histórico de Versão

Versão Data Descrição Autor(es)
1.0 22/12/2024 Primeira versão do DDL Diego Carlito e Filipe Carvalho
1.1 22/12/2024 Adiciona Tabelas do DD Diego Carlito
2.0 01/02/2025 Segunda versão do DDL Diego Carlito