Ir para o conteúdo

DDL

Versão Atual

begin;
-- Persongens

CREATE TYPE personagem_ocupacao AS ENUM (
    'Pirata', 'Marinheiro', 'Cidadao'
);

CREATE TYPE personagem_grupo_ocupacao AS ENUM (
    'Lider', 'Membro'
);

CREATE TABLE IF NOT EXISTS personagem_principal (
    id_personagem INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(20) NOT NULL,
    ocupacao personagem_ocupacao NOT NULL,
    grupo_ocupacao TEXT NOT NULL,
    berries INTEGER NOT NULL DEFAULT 0,
    CHECK(berries >= 0),
    energia INTEGER NOT NULL DEFAULT 0,
    CHECK(energia >= 0),
    fraqueza VARCHAR(20) NOT NULL,
    experiencia INTEGER NOT NULL,
    CHECK(experiencia >= 0),
    vida INTEGER NOT NULL,
    CHECK(vida >= 0),
    capacidade_de_itens INTEGER NOT NULL,
    CHECK(capacidade_de_itens > 0),

    PRIMARY KEY (id_personagem)
);

CREATE TABLE IF NOT EXISTS inimigo (
    id_personagem INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(20) NOT NULL,
    ocupacao personagem_ocupacao NOT NULL,
    grupo_ocupacao TEXT NOT NULL,
    berries INTEGER NOT NULL DEFAULT 0,
    CHECK(berries >= 0),
    energia INTEGER NOT NULL DEFAULT 0,
    CHECK(energia >= 0),
    fraqueza VARCHAR(20) NOT NULL,
    experiencia INTEGER NOT NULL,
    CHECK(experiencia >= 0),
    vida INTEGER NOT NULL,
    CHECK(vida >= 0),

    PRIMARY KEY (id_personagem)
);

CREATE TABLE IF NOT EXISTS personagem_nao_hostil (
    id_personagem INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(20) NOT NULL,
    ocupacao personagem_ocupacao NOT NULL,
    grupo_ocupacao TEXT NOT NULL,
    is_vendedor BOOLEAN NOT NULL DEFAULT FALSE,
    is_personagem_historia BOOLEAN NOT NULL DEFAULT FALSE,
    id_missao INTEGER DEFAULT NULL,

    PRIMARY KEY (id_personagem)
);

CREATE TABLE IF NOT EXISTS barco (
    id_barco INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(20) NOT NULL,
    ocupacao personagem_ocupacao NOT NULL,
    grupo_ocupacao personagem_grupo_ocupacao NOT NULL,
    capacidade_de_itens INTEGER NOT NULL DEFAULT 0,
    CHECK(capacidade_de_itens >= 0),

    PRIMARY KEY (id_barco)
);

CREATE TABLE IF NOT EXISTS poder_especial (
    nome VARCHAR(20) NOT NULL,
    id_personagem_principal INTEGER NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',
    dano INTEGER NOT NULL,
    CHECK(dano >= 0),
    energia INTEGER NOT NULL,
    CHECK(energia >= 0),

    PRIMARY KEY (nome, id_personagem_principal),
    CONSTRAINT fk_personagem_principal FOREIGN KEY (id_personagem_principal) 
        REFERENCES personagem_principal(id_personagem) ON DELETE RESTRICT
);

-- Itens

CREATE TABLE IF NOT EXISTS item (
    id_item INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(20) NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',
    preco INTEGER NOT NULL,
    CHECK(preco >= 0),
    qtd_energia INTEGER NOT NULL,
    CHECK(qtd_energia >= 0),
    qtd_vida INTEGER NOT NULL,
    CHECK(qtd_vida >= 0),
    qtd_dano INTEGER,
    CHECK(qtd_dano >= 0),
    is_equipavel BOOLEAN NOT NULL,

    PRIMARY KEY (id_item)
);

CREATE TABLE IF NOT EXISTS inventario (
    id_personagem INTEGER NOT NULL,
    id_item INTEGER DEFAULT NULL,
    qtd_item INTEGER DEFAULT NULL,

    CONSTRAINT fk_personagem_inventario FOREIGN KEY (id_personagem) 
        REFERENCES personagem_principal(id_personagem) ON DELETE RESTRICT,
    CONSTRAINT fk_item FOREIGN KEY (id_item)
        REFERENCES item(id_item) ON DELETE RESTRICT,
    CONSTRAINT pk_inventario PRIMARY KEY (id_personagem, id_item)
);

-- Missão

CREATE TABLE IF NOT EXISTS missao (
    id_missao INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(35) NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',
    qtd_experiencia INTEGER NOT NULL,
    CHECK(qtd_experiencia >= 0),
    dificuldade INTEGER NOT NULL,
    CHECK(dificuldade >= 0),
    id_personagem INTEGER NOT NULL,

    CONSTRAINT fk_personagem FOREIGN KEY (id_personagem)
        REFERENCES personagem_nao_hostil(id_personagem) ON DELETE RESTRICT,
    PRIMARY KEY (id_missao)
);

CREATE TYPE objetivo_tipo AS ENUM (
    'PegarItem', 'DerrotarInimigo', 'FalarComNPC'
);

CREATE TABLE IF NOT EXISTS objetivo (
    id_missao INTEGER NOT NULL,
    id_objetivo INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(35) NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',
    tipo objetivo_tipo NOT NULL,
    id_item INTEGER NULL,
    id_inimigo INTEGER NULL,
    id_nao_hostil INTEGER NULL,
    is_active BOOLEAN NOT NULL DEFAULT FALSE,
    is_completed BOOLEAN NOT NULL DEFAULT FALSE,

    PRIMARY KEY (id_missao, id_objetivo),
    CONSTRAINT fk_missao FOREIGN KEY (id_missao) 
        REFERENCES missao(id_missao) ON DELETE RESTRICT,
    CONSTRAINT fk_item FOREIGN KEY (id_item)
        REFERENCES item(id_item) ON DELETE RESTRICT,
    CONSTRAINT fk_inimigo FOREIGN KEY (id_inimigo)
        REFERENCES inimigo(id_personagem) ON DELETE RESTRICT,
    CONSTRAINT fk_nao_hostil FOREIGN KEY (id_nao_hostil)
        REFERENCES personagem_nao_hostil(id_personagem) ON DELETE RESTRICT
);

-- Região

CREATE TABLE IF NOT EXISTS ilha (
    id_ilha INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    nome VARCHAR(30) NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',

    PRIMARY KEY (id_ilha)
);

CREATE TYPE regiao_tipo AS ENUM (
    'Cidade', 'Floresta', 'Deserto', 'Montanha'
);

CREATE TABLE IF NOT EXISTS regiao (
    id_regiao INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
    descricao TEXT NOT NULL DEFAULT '',
    tipo regiao_tipo,
    norte INTEGER,
    sul INTEGER,
    leste INTEGER,
    oeste INTEGER,
    id_ilha INTEGER,

    CONSTRAINT pk_regiao PRIMARY KEY (id_regiao),
    CONSTRAINT fk_regiao_norte FOREIGN KEY (norte) 
        REFERENCES regiao(id_regiao) ON DELETE RESTRICT,
    CONSTRAINT fk_regiao_sul FOREIGN KEY (sul)
        REFERENCES regiao(id_regiao) ON DELETE RESTRICT,
    CONSTRAINT fk_regiao_leste FOREIGN KEY (leste)
        REFERENCES regiao(id_regiao) ON DELETE RESTRICT,
    CONSTRAINT fk_regiao_oeste FOREIGN KEY (oeste)
        REFERENCES regiao(id_regiao) ON DELETE RESTRICT,
    CONSTRAINT fk_regiao_ilha FOREIGN KEY (id_ilha)
        REFERENCES ilha(id_ilha) ON DELETE RESTRICT
);

commit;

Versões Anteriores