Pular para conteúdo

Data Definition Language

Data Definition Language (DDL)

Introdução

O Data Definition Language (DDL) é um subconjunto da linguagem SQL, responsável pela definição e manipulação da estrutura de um banco de dados. Segundo Elmasri e Navathe, no livro "Sistemas de Banco de Dados", o DDL permite criar, modificar e remover elementos da estrutura de um banco, como tabelas, esquemas, visões e restrições de integridade. Esse conjunto de comandos define o formato e a organização dos dados, garantindo coerência e segurança na manipulação das informações.

Objetivos

Este documento descreve a implementação e o uso da linguagem DDL no sistema, explicando suas funções, vantagens e aplicabilidade no contexto da administração de dados. As migrações realizadas por meio do DDL viabilizam uma estrutura sólida para o banco, permitindo a criação, atualização e gerenciamento das tabelas e demais componentes essenciais para o funcionamento do jogo.

V0_init

Define o papel "user" com permissões no banco de dados e no esquema "public".

Migrações
-- Cria um usuário de aplicação com superpoderes (para facilitar o desenvolvimento)
CREATE ROLE "aplicacao" WITH SUPERUSER LOGIN PASSWORD 'sbd1_2024.2@munchkin';

-- Permite que ele se conecte ao banco munchkin
GRANT CONNECT ON DATABASE munchkin TO "aplicacao";

-- Permite que ele use o schema public (onde as tabelas serão criadas)
GRANT USAGE ON SCHEMA public TO "aplicacao";

-- Dá permissões totais sobre tabelas, sequências e funções
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "aplicacao";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "aplicacao";
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO "aplicacao";

-- Garante que novas tabelas criadas automaticamente deem esses mesmos privilégios
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT ALL ON TABLES TO "aplicacao";

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT ALL ON SEQUENCES TO "aplicacao";

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT ALL ON FUNCTIONS TO "aplicacao";

V1_create_core_game_tables

Cria as tabelas principais do sistema de gerenciamento de partidas: Jogador, Partida e Carta, com seus respectivos atributos e relacionamentos via chave estrangeira.

Migrações
CREATE TABLE jogador (
    id_jogador SERIAL PRIMARY KEY,
    nome VARCHAR(255) NOT NULL);

CREATE TABLE partida (
    id_partida SERIAL PRIMARY KEY, -- substitui AUTO_INCREMENT por SERIAL
    id_jogador INT,
    data_inicio TIMESTAMP NOT NULL, -- substitui DATETIME
    turno_atual INT DEFAULT 1,
    estado_partida VARCHAR(20) CHECK (estado_partida IN ('em andamento', 'encerrada')),
    finalizada BOOLEAN DEFAULT FALSE,
    vitoria BOOLEAN DEFAULT FALSE,
    nivel INT DEFAULT 1,
    vida_restantes SMALLINT CHECK (vida_restantes BETWEEN 0 AND 3), -- substitui TINYINT por SMALLINT
    ouro_acumulado INT DEFAULT 0,
    limite_mao_atual INT DEFAULT 5,
    FOREIGN KEY (id_jogador) REFERENCES jogador(id_jogador));

-- restrição parcial para que não possa existir mais de uma partida em andamento para o mesmo jogador
CREATE UNIQUE INDEX idx_unico_jogador_partida_em_andamento
    ON partida(id_jogador)
    WHERE estado_partida = 'em andamento';

CREATE TYPE tipo_carta_enum AS ENUM ('porta', 'tesouro');
CREATE TYPE subtipo_carta_enum AS ENUM ('classe', 'raca', 'item', 'monstro');

CREATE TABLE carta (
    id_carta SERIAL PRIMARY KEY,
    nome VARCHAR(255) NOT NULL,
    tipo_carta tipo_carta_enum NOT NULL,
    subtipo subtipo_carta_enum NOT NULL,
    disponivel_para_virar BOOLEAN NOT NULL);

CREATE TABLE slot_equipamento (
    nome VARCHAR PRIMARY KEY, 
    capacidade INT NOT NULL,  
    grupo_exclusao VARCHAR,   
    descricao TEXT
);

V2_create_carta_partida_table

Cria a tabela CartaPartida e define o relacionamento com Carta e Partida.

Migrações
CREATE TYPE enum_zona AS ENUM ('mao', 'equipado', 'mochila', 'descartada');

CREATE TABLE carta_partida (
    id_carta_partida SERIAL PRIMARY KEY,
    id_partida INT NOT NULL,
    id_carta INT NOT NULL,
    zona enum_zona NOT NULL,
    FOREIGN KEY (id_partida) REFERENCES partida(id_partida),
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta));

V3_create_cartas_especificas_table

Cria as tabelas especializadas CartaRaca, CartaClasse, CartaItem e CartaMonstro, relacionando cada uma delas à tabela Carta.

Migrações
CREATE TABLE carta_classe (
    id_carta INT PRIMARY KEY,
    nome_classe VARCHAR(20) NOT NULL,
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta));

CREATE TABLE carta_raca (
    id_carta INT PRIMARY KEY,
    nome_raca VARCHAR(20) NOT NULL,
    descricao VARCHAR(200),
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta));

CREATE TABLE carta_item (
    id_carta INT PRIMARY KEY,
    bonus_combate INT,
    valor_ouro INT,
    tipo_item VARCHAR(20) CHECK (tipo_item IN ('arma', 'armadura', 'acessório')),
    ocupacao_dupla BOOLEAN DEFAULT FALSE,
    slot VARCHAR(20),
    FOREIGN KEY (slot) REFERENCES slot_equipamento(nome),
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta));

CREATE TABLE carta_monstro (
    id_carta_monstro SERIAL PRIMARY KEY,
    id_carta INT UNIQUE NOT NULL,
    nivel INT,
    pode_fugir BOOLEAN,
    recompensa INT,
    tipo_monstro VARCHAR(50) CHECK (tipo_monstro IN ('morto_vivo', 'sem_tipo')),
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta));

V4_create_poder_raca_tables

Cria a tabela PoderRaca que possui relação com a CartaRaca.

Migrações
CREATE TABLE poder_raca (
    id_poder_raca SERIAL PRIMARY KEY,
    id_carta INT NOT NULL,
    descricao VARCHAR(200),
    FOREIGN KEY (id_carta) REFERENCES carta_raca(id_carta));

V5_create_poderes_raca_especificos_table

Cria as tabelas especializadas de poder_raca, que detalham os tipos específicos de habilidades que podem estar associadas a uma raça. Todas elas herdam o id_poder_raca como chave primária e estrangeira.

Migrações
-- Recompensa condicional (ex: Elfo e Orc)
CREATE TABLE poder_recompensa_condicional (
    id_poder_raca INT PRIMARY KEY,
    bonus_tipo VARCHAR(20) CHECK (bonus_tipo IN ('nivel', 'tesouro_extra')),
    bonus_quantidade INT NOT NULL,
    condicao_tipo VARCHAR(30) CHECK (condicao_tipo IN (
        'matar_monstro',
        'nivel_monstro_maior_10'
    )),
    FOREIGN KEY (id_poder_raca) REFERENCES poder_raca(id_poder_raca)
);

-- Limite de mão extra (Anão)
CREATE TABLE poder_limite_de_mao (
    id_poder_raca INT PRIMARY KEY,
    limite_cartas_mao INT NOT NULL,
    FOREIGN KEY (id_poder_raca) REFERENCES poder_raca(id_poder_raca)
);

-- Venda multiplicada (Halfling)
CREATE TABLE poder_venda_multiplicada (
    id_poder_raca INT PRIMARY KEY,
    multiplicador INT NOT NULL DEFAULT 2,
    limite_vezes_por_turno INT NOT NULL DEFAULT 1,
    FOREIGN KEY (id_poder_raca) REFERENCES poder_raca(id_poder_raca)
);

-- Controle de uso do poder de venda multiplicada por turno
CREATE TABLE uso_poder_venda (
    id_partida INT REFERENCES partida(id_partida),
    id_carta INT REFERENCES carta(id_carta),
    turno INT,
    usos INT DEFAULT 0,
    PRIMARY KEY (id_partida, id_carta, turno)
);

V6_create_poder_classe

Cria a tabela poder_classe, associada às cartas do subtipo classe, e define o relacionamento com carta_classe.

Migrações
CREATE TABLE poder_classe (
    id_poder_classe INT PRIMARY KEY,
    id_carta_classe INT,
    descricao VARCHAR(200),

    FOREIGN KEY (id_carta_classe) REFERENCES carta_classe(id_carta)
);

V7_create_poder_classe_especificos_table

Cria as tabelas especializadas de poder_classe, detalhando os tipos específicos de habilidades relacionadas a classe.

Migrações
CREATE TABLE descarta_para_efeito (
    id_poder_classe INT PRIMARY KEY,
    efeito VARCHAR(100),
    max_cartas INT,

    FOREIGN KEY (id_poder_classe) REFERENCES poder_classe(id_poder_classe)
);

CREATE TABLE empata_vence (
    id_poder_classe INT PRIMARY KEY,
    vence_empata BOOLEAN DEFAULT FALSE,

    FOREIGN KEY (id_poder_classe) REFERENCES poder_classe(id_poder_classe)
);

V8_create_restricao_item_table

Cria a tabela restricao_item, que define as restrições de uso dos itens com base em raça ou classe. Relaciona-se diretamente com a tabela carta_item.

Migrações
CREATE TABLE restricao_item (
    id_restricao SERIAL PRIMARY KEY,
    id_carta_item INT REFERENCES carta_item(id_carta),
    tipo_alvo VARCHAR(20) CHECK (tipo_alvo IN ('raca', 'classe')),
    valor_alvo VARCHAR(50) CHECK (valor_alvo IN ('mago', 'anao', 'guerreiro', 'orc')),
    permitido BOOLEAN
);

V9_create_efeito_monstro_table

Cria a tabela efeito_monstro, que define os efeitos associados a cartas de monstro.

Migrações
CREATE TABLE efeito_monstro (
    id_efeito_monstro SERIAL PRIMARY KEY,
    id_carta_monstro INTEGER REFERENCES carta_monstro(id_carta),
    descricao TEXT
);

V10_create_efeitos_monstros_especificos_table

Cria tabelas especializadas para os efeitos de monstro, como modificadores, penalidades e condições específicas.

Migrações
CREATE TABLE penalidade_perda_nivel (
    id_efeito_monstro INTEGER PRIMARY KEY REFERENCES efeito_monstro(id_efeito_monstro),
    niveis INT NOT NULL
);

CREATE TABLE penalidade_item (
    id_efeito_monstro INTEGER PRIMARY KEY REFERENCES efeito_monstro(id_efeito_monstro),
    local_item VARCHAR(50) CHECK (local_item IN ('mao', 'corpo', 'cabeca', 'todos')) NOT NULL
);

CREATE TABLE penalidade_transformacao (
    id_efeito_monstro INTEGER PRIMARY KEY REFERENCES efeito_monstro(id_efeito_monstro),
    perde_classe BOOLEAN NOT NULL DEFAULT FALSE,
    perde_raca BOOLEAN NOT NULL DEFAULT FALSE,
    vira_humano BOOLEAN NOT NULL DEFAULT FALSE
);

CREATE TABLE penalidade_morte (
    id_efeito_monstro INTEGER PRIMARY KEY REFERENCES efeito_monstro(id_efeito_monstro),
    morte BOOLEAN NOT NULL DEFAULT FALSE
);

V11_create_combate_table

Cria a tabela combate, que registra os dados dos combates entre jogadores e monstros durante as partidas.

Migrações
CREATE TABLE combate (
    id_combate SERIAL PRIMARY KEY,
    id_partida INT NOT NULL,
    id_carta INT NOT NULL,
    monstro_vindo_do_baralho BOOLEAN,
    vitoria BOOLEAN,
    coisa_ruim_aplicada BOOLEAN,
    nivel_ganho INT,
    data_ocorrido TIMESTAMP,
    FOREIGN KEY (id_partida) REFERENCES partida(id_partida),
    FOREIGN KEY (id_carta) REFERENCES carta(id_carta)
    );

Referência Bibliográfica

[1] ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. Tradução: Daniel Vieira. Revisão técnica: Enzo Seraphim; Thatyana de Faria Piola Seraphim. 6. ed. São Paulo: Pearson Addison Wesley, 2011.


Versionamento

Versão Data Modificação Autor
0.1 14/05/2025 Criação do Documento Maria Clara
1.0 26/05/2025 Atualização do DDL Maria Clara e Breno Fernandes
2.0 03/06/2025 Atualização do DDL Ana Luiza Komatsu
3.0 11/06/2025 Ajustes do DDL Mylena Mendonça
4.0 16/06/2025 Ajustes do DDL para a segunda entrega Breno Fernandes