Skip to content

Linguagem de Definição de Dados (DDL)

Introdução

A Linguagem de Definição de Dados (DDL), ou Data Definition Language, é 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.

DDL - Undertale

Após a modelagem criamos todas as tabelas mapeadas com a ajuda do DD (Data Dictionary) para dar progresso ao trabalho.


CREATE TABLE IF NOT EXISTS Afinidade (
    id_afinidade SERIAL PRIMARY KEY,
    qtd_atual INT NOT NULL CHECK (qtd_atual >= 0),
    qtd_max INT NOT NULL CHECK (qtd_max > 0)
);

CREATE TABLE IF NOT EXISTS Sala (
    id_sala SERIAL PRIMARY KEY,
    nome_sala VARCHAR(255) NOT NULL,
    descricao TEXT
);

CREATE TABLE IF NOT EXISTS Missao (
    id_missao SERIAL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    descricao VARCHAR(150),
    status VARCHAR(50) NOT NULL,
    CHECK (status IN ('ativa', 'concluída', 'pendente'))
);

CREATE TABLE IF NOT EXISTS Item (
    id_item SERIAL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL,
    descricao VARCHAR(100),
    valor DECIMAL(10,2) NOT NULL CHECK (valor >= 0),
    tipo VARCHAR(50) NOT NULL,
    CHECK (tipo IN ('Ataque', 'Consumível', 'Defesa'))
);

CREATE TABLE IF NOT EXISTS Instancia_Item (
    id_instancia SERIAL PRIMARY KEY,
    item INT NOT NULL,
    FOREIGN KEY (item) REFERENCES Item(id_item)
);

CREATE TABLE IF NOT EXISTS Defesa (
    id_instancia INT PRIMARY KEY,
    protecao INT NOT NULL CHECK (protecao >= 0)
);

CREATE TABLE IF NOT EXISTS Consumivel (
    id_instancia INT PRIMARY KEY,
    qtd_cura INT NOT NULL CHECK (qtd_cura >= 0)
);

CREATE TABLE IF NOT EXISTS Ataque (
    id_instancia INT PRIMARY KEY,
    dano INT NOT NULL CHECK (dano >= 0)
);

CREATE TABLE IF NOT EXISTS Porta (
    id_porta SERIAL PRIMARY KEY,
    status VARCHAR(50) NOT NULL,
    CHECK (status IN ('Aberta', 'Fechada', 'Trancada'))
);

CREATE TABLE IF NOT EXISTS Bau (
    id_bau SERIAL PRIMARY KEY,
    sala INT NOT NULL,
    capacidade INT CHECK (capacidade >= 1),
    item INT,
    FOREIGN KEY (sala) REFERENCES Sala(id_sala),
    FOREIGN KEY (item) REFERENCES Item(id_item)
);

CREATE TABLE IF NOT EXISTS Jogador (
    id_jogador SERIAL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL UNIQUE,
    item_equipado INT,
    nivel INT NOT NULL CHECK (nivel BETWEEN 1 AND 100),
    qtd_xp INT NOT NULL CHECK (qtd_xp BETWEEN 0 AND 1000),
    vida_maxima INT NOT NULL CHECK (vida_maxima BETWEEN 1 AND 1000),
    vida_atual INT NOT NULL CHECK (vida_atual BETWEEN 0 AND 1000),
    afinidade INT NOT NULL CHECK (afinidade BETWEEN 0 AND 100),
    tipo_rota VARCHAR(50) NOT NULL,
    sala_atual INT,
    viu_introducao BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (item_equipado) REFERENCES Item(id_item),
    FOREIGN KEY (afinidade) REFERENCES Afinidade(id_afinidade),
    FOREIGN KEY (sala_atual) REFERENCES Sala(id_sala),
    CHECK (tipo_rota IN ('Pacifista', 'Genocida', 'Neutra'))
);

CREATE TABLE IF NOT EXISTS Dialogo (
    id_dialogo SERIAL PRIMARY KEY,
    texto TEXT NOT NULL,
    id_interacao INT
);

CREATE TABLE IF NOT EXISTS EscolhaDialogo (
    id_dialogo INT,
    escolha_id INT,
    escolha VARCHAR(50) NOT NULL,
    prox_dialogo INT,
    PRIMARY KEY (id_dialogo, escolha_id),
    FOREIGN KEY (id_dialogo) REFERENCES Dialogo(id_dialogo),
    FOREIGN KEY (prox_dialogo) REFERENCES Dialogo(id_dialogo)
);

CREATE TABLE IF NOT EXISTS Loja (
    id_loja SERIAL PRIMARY KEY,
    nome VARCHAR(100),
    sala INT,
    item INT,
    FOREIGN KEY (sala) REFERENCES Sala(id_sala),
    FOREIGN KEY (item) REFERENCES Item(id_item)
);

CREATE TABLE IF NOT EXISTS NPC (
    id_npc SERIAL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL UNIQUE,
    sala INT,
    tipo VARCHAR(50) NOT NULL,
    FOREIGN KEY (sala) REFERENCES Sala(id_sala),
    CHECK (tipo IN ('Mercador', 'Aliado', 'Monstro'))
);

CREATE TABLE IF NOT EXISTS Mercador (
    loja INT PRIMARY KEY,
    FOREIGN KEY (loja) REFERENCES Loja(id_loja)
) INHERITS (NPC);

CREATE TABLE IF NOT EXISTS Aliado (
    gold_drop INT NOT NULL CHECK (gold_drop >= 0),
    xp_drop INT NOT NULL CHECK (xp_drop >= 0),
    dano_ataque INT NOT NULL CHECK (dano_ataque >= 0)
) INHERITS (NPC);

CREATE TABLE IF NOT EXISTS Monstro (
    dano_ataque INT NOT NULL CHECK (dano_ataque >= 0),
    xp_drop INT NOT NULL CHECK (xp_drop >= 0),
    gold_drop INT NOT NULL CHECK (gold_drop >= 0),
    item_drop INT
) INHERITS (NPC);


CREATE TABLE IF NOT EXISTS Conexao (
    id_conexao SERIAL PRIMARY KEY,
    id_sala_origem INT NOT NULL,
    id_sala_destino INT NOT NULL,
    direcao VARCHAR(20) NOT NULL,
    descricao_conexao TEXT,
    porta INT NOT NULL,
    FOREIGN KEY (porta) REFERENCES Porta(id_porta),
    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 Jogador (
    id_jogador SERIAL PRIMARY KEY,
    nome VARCHAR(50) NOT NULL UNIQUE,
    item_equipado INT,
    nivel INT NOT NULL CHECK (nivel BETWEEN 1 AND 100),
    qtd_xp INT NOT NULL CHECK (qtd_xp BETWEEN 0 AND 1000),
    vida_maxima INT NOT NULL CHECK (vida_maxima BETWEEN 1 AND 1000),
    vida_atual INT NOT NULL CHECK (vida_atual BETWEEN 0 AND 1000),
    afinidade INT NOT NULL CHECK (afinidade BETWEEN 0 AND 100),
    tipo_rota VARCHAR(50) NOT NULL,
    sala_atual INT,
    FOREIGN KEY (item_equipado) REFERENCES Item(id_item),
    FOREIGN KEY (afinidade) REFERENCES Afinidade(id_afinidade),
    FOREIGN KEY (sala_atual) REFERENCES Sala(id_sala),
    CHECK (tipo_rota IN ('Pacifista', 'Genocida', 'Neutra'))
);

CREATE TABLE IF NOT EXISTS Inventario (
    qtd_item INT NOT NULL CHECK (qtd_item BETWEEN 0 AND 10000),
    tamanho_total DECIMAL(10,2) NOT NULL CHECK (tamanho_total >= 0),
    qtd_gold INT NOT NULL CHECK (qtd_gold >= 0),
    id_jogador INT PRIMARY KEY,
    FOREIGN KEY (id_jogador) REFERENCES Jogador(id_jogador)
);


CREATE TABLE IF NOT EXISTS Interacao (
    id_interacao SERIAL PRIMARY KEY,
    npc VARCHAR(50) NOT NULL,
    jogador INT NOT NULL,
    dialogo INT,
    --FOREIGN KEY (npc) REFERENCES NPC(id_npc),
    FOREIGN KEY (jogador) REFERENCES Jogador(id_jogador),
    FOREIGN KEY (dialogo) REFERENCES Dialogo(id_dialogo)
);

Histórico de Versão

Versão Data Descrição Autor(es)
1.0 07/08/2024 Primeira versão do DDL Bianca Castro
1.1 17/08/2024 Correção dos dados do DDL Bianca Castro
1.2 19/08/2024 Correção das ordens das tabelas Bianca Castro
1.3 09/09/2024 Atualização como Banco Bianca Castro