Pular para conteúdo

Algebra Relacional

Introdução

A Álgebra Relacional é um modelo teórico e formal de manipulação de dados em bancos de dados relacionais. Ela define um conjunto de operações matemáticas aplicadas a relações (tabelas), permitindo a criação de novas relações a partir de dados existentes. Essas operações incluem seleção (σ), projeção (π), união (∪), diferença (-), produto cartesiano (×), junção (⨝), entre outras.

Ao contrário da SQL, que é uma linguagem prática e implementável, a Álgebra Relacional oferece uma base teórica que permite analisar, validar e prever os resultados de consultas e manipulações de forma precisa e lógica

Metodologia

A aplicação da Álgebra Relacional neste projeto foi realizada com base na estrutura conceitual do banco de dados relacional desenvolvido previamente, a partir do modelo Entidade-Relacionamento. As operações foram construídas em notação algébrica, simulando a execução de consultas sobre as tabelas do jogo, como Jogador, Prisioneiro, Gangue, Sala e Missao.

Foram utilizadas operações fundamentais como seleção (σ) para aplicar filtros, projeção (π) para escolher colunas específicas, e junção natural (⨝) para unir informações relacionadas entre diferentes tabelas.

Álgebra Relacional por tabela

Consulta_Personagem

  • Lista todos os personagens cadastrados:
    T ← π(*)(consulta_personagem)

  • Exibe o tipo de um personagem específico:
    R ← σ(id_personagem = 5)(consulta_personagem)
    T ← π(tipo_personagem)(R)

Agente_Penitenciario

  • Consulta todas as informações de um agente penitenciário:
    T ← σ(id_personagem = 2)(agente_penitenciario)

  • Verifica se um policial específico é corrupto e qual o seu preço:
    R ← σ(id_personagem = 2)(agente_penitenciario)
    T ← π(corrupto, preco)(R)

  • Exibe os agentes penitenciários que estão na sala, ordenados pelo seu nível de perigo:
    R ← σ(id_sala = 2)(agente_penitenciario)
    T ← π(id_personagem, id_sala, nome, velocidade, nivel_de_perigo, nivel_de_alerta, cargo)(R)

  • Exibe a quantidade de agentes na sala:
    R ← σ(id_sala = 2)(agente_penitenciario)
    S ← γ(id_sala, COUNT(∗) → agentes_na_sala(R))
    T ← π(id_sala, agentes_na_sala)(S)

  • Exibe os agentes penitenciarios e as informações referentes as salas em que eles estão:
    AP ← ρ AP(nome → nome_agente) (agente_penitenciario)
    S ← ρ S(nome → nome_sala, nivel_perigo → nivel_perigo_sala) (sala)

    R ← AP ⨝ (AP.id_sala = S.id_sala) S
    T ← π(AP.id_personagem, nome_agente, S.id_sala, nome_sala, nivel_perigo_sala)(R)

Agente_Penitenciario_Jogador

  • Exibe todos os agentes penitenciários que capturaram um jogador específico:
    APJ ← ρ APJ(agente_penitenciario_jogador)
    AP ← ρ AP(agente_penitenciario)

    W ← APJ ⨝ (APJ.id_personagem_agente_penitenciario = AP.id_personagem) AP
    T ← σ(APJ.id_personagem_jogador = 1) W

  • Exibe quantas vezes um jogador foi capturado:
    R ← σ(id_personagem_jogador = 1)(agente_penitenciario_jogador)
    S ← γ(id_personagem_jogador, COUNT(∗) → qtdd_capturas(R))
    T ← π(id_personagem_jogador, qtdd_capturas)(S)

  • Exibe quantas vezes um jogador foi capturado por um agente específico:
    R ← σ(id_personagem_jogador = 1 AND id_personagem_agente_penitenciario = 2)(agente_penitenciario_jogador)
    S ← γ(id_personagem_jogador, id_personagem_agente_penitenciario, COUNT(∗) → qtdd_capturas(R))
    T ← π(id_personagem_jogador, id_personagem_agente_penitenciario, qtdd_capturas)(S)

Missao_Sala

  • Exibe todas as salas que uma missão desbloqueia:
    T ← σ(nome_missao = 'Rota Segura')(missao_sala)

  • Exibe as missões necessárias para desbloquear uma sala:
    R ← σ(id_sala = 3)(missao_sala)
    T ← π(nome_missao)(R)

Jogador

  • Consultar todas as informações de um jogador em especifico:
    T ← σ(nome = 'Mauricio')(Jogador)

  • Consultar dados importantes para o jogador:
    T ← σ(nome = 'Mauricio')(Jogador)
    R ← π(nome, velocidade, vida, qtded_recurso, qtded_captura, nome_gangue, id_sala)(T)

  • Consultar objetivo da missão do jogador:
    T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.nome_missao = missao.nome_missao missao)
    R ← π(jogador.nome_missao, missao.descricao, missao.status)(T)

  • Consultar objetivo principal do jogador:
    T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.titulo_objetivo = objetivo_principal.titulo_objetivo objetivo_principal)
    R ← π(jogador.titulo_objetivo, objetivo_principal.descricao)(T)

  • Consultar missão do jogador:
    T ← σ(jogador.nome = 'Mauricio')(jogador ⨝ jogador.nome_missao = missao.nome_missao missao)
    R ← π(jogador.nome_missao, missao.descricao, missao.status)

  • Consultar informações de um item especifico que esta no inventario:
    T ← σ(jogador.nome = 'Mauricio' ∧ item.nome_item = 'Chave inglesa')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item)⨝ instancia_item.nome_item = item.nome_item item)
    R ← π(item.nome_item, item.descricao, item.durabilidade, item.pode_ser_vendido,item.utilidade, item.beneficio, instancia_item.nivel_de_gasto)(T)

  • Consultar itens que estão no inventario:
    T ← σ(jogador.nome = 'Mauricio')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item) ⨝ instancia_item.nome_item = item.nome_item item)
    R ← π(item.nome_item)(T)

  • Consultar informações dos itens do inventario:
    T ← σ(jogador.nome = 'Mauricio')((jogador ⨝ jogador.id_inventario = instancia_item.id_inventario instancia_item) ⨝ instancia_item.nome_item = item.nome_item item)
    R ← π(item.nome_item, item.descricao, item.durabilidade, item.pode_ser_vendido, item.utilidade, item.beneficio, instancia_item.nivel_de_gasto)(T)

Prisioneiro

  • Consultar informação de todos os prisioneiros em ordem alfabetica:
    T ← π(*)(prisioneiro)
    R ← τ_{nome ASC}(T)

  • Consultar todas as informações de um prisioneiro em especifico:
    T ← σ(nome = 'Michael Scofield')(prisioneiro)

  • Consultar todos os dados dos prisioneiros que estão na sala:
    T ← σ(id_sala = 1)(prisioneiro)

  • Consultar apenas nome e gangue dos prisioneiros que estão na sala:
    T ← σ(id_sala = 1)(prisioneiro)
    R ← π(nome, nome_gangue)(T)

  • Consultar todas as gangues que estão na sala:
    T ← σ(id_sala = 1)(prisioneiro)
    R ← π(nome_gangue)(T)

  • Consultar onde esta o prisioneiro:
    T ← (prisioneiro ⨝ prisioneiro.id_sala = sala.id_sala sala)
    R ← σ(prisioneiro.nome = 'Michael Scofield')(T)
    Z ← π(prisioneiro.nome, sala.nome)(R)

  • Consultar localização de todos os prisioneiros em ordem alfabetica:
    T ← π(prisioneiro.nome, sala.nome)(prisioneiro ⨝ prisioneiro.id_sala = sala.id_sala sala)
    R ← τ_{prisioneiro.nome ASC}(T)

Gangue

  • Consultar informação de todas as gangues ordenados por quantidade de membros:
    T ← π(*)(gangue)
    R ← τ_{qtdd_membros DESC}(T)

  • Consultar gangues ordenadas pelo mais fortes (maiores recursos):
    T ← π(*)(gangue)
    R ← τ_{qtdd_recurso_gangue DESC}(T)

  • Consultar todas as informações de uma gangue em especifico:
    T ← σ(nome_gangue = 'Os Fox River Eight')(gangue)

Objetivo_principal

  • Exibe todos os objetivos:
    T ← π(*)(Objetivo_Principal)

  • Exibe algum objetivo específico com descrição
    R ← σ(titulo_objetivo = 'Libertar o prisioneiro')(Objetivo_Principal)
    T ← π(titulo_objetivo, descricao)(R)

  • Exibe apenas os títulos dos objetivos
    T ← π(titulo_objetivo)(Objetivo_Principal)

  • Exibe quantos objetivos existem
    T ← γ(COUNT(∗) → total_objetivos)(Objetivo_Principal)

  • Exibe objetivos com determinada específica
    T ← σ(descricao LIKE '%família%')(Objetivo_Principal)

  • Exibe se há objetivos duplicados
    R ← γ(titulo_objetivo, COUNT(∗) → contagem)(Objetivo_Principal)
    T ← σ(contagem > 1)(R)

Objetivo_Principal_Missao

  • Exibe todos os objetivos e suas missoes relacionadas
    OPM ← ρ OPM(Objetivo_Principal_Missao)
    OP ← ρ OP(Objetivo_Principal)
    M ← ρ M(Missao)
    R ← OPM ⨝ (OPM.titulo_objetivo = OP.titulo_objetivo) OP
    S ← R ⨝ (OPM.nome_missao = M.nome_missao) M
    T ← π(OPM.titulo_objetivo, OP.descricao → descricao_objetivo, M.nome_missao, M.descricao → descricao_missao)(S)

  • Exibe quantas missoes estão associadas a cada objetivo
    OPM ← ρ OPM(Objetivo_Principal_Missao)
    M ← ρ M(Missao)
    R ← OPM ⨝ (OPM.nome_missao = M.nome_missao) M
    S ← γ(M.nome_missao, COUNT(∗) → total_objetivos)(R)
    T ← τ(total_objetivos DESC)(S)

  • Exibe objetivos que possuem pelo menos uma missao associada
    OP ← ρ OP(Objetivo_Principal)
    OPM ← ρ OPM(Objetivo_Principal_Missao)
    M ← ρ M(Missao)
    R ← OP ⨝ (OP.titulo_objetivo = OPM.titulo_objetivo) OPM
    S ← R ⨝ (OPM.nome_missao = M.nome_missao) M
    W ← σ(M.status = TRUE)(S)
    T ← π(OP.titulo_objetivo, OP.descricao)(W)
    U ← δ(T) -- Operador de distinção (DISTINCT)

  • Exibe diálogos com nome da missao em ordem
    T ← π(nome_missao, ordem, texto)(Dialogo)
    U ← τ(nome_missao ASC, ordem ASC)(T)

  • Exibe diálogos de uma missao específica
    R ← σ(nome_missao = 'Fuga de Fox River')(Dialogo)
    T ← τ(ordem ASC)(R)

  • Exibe diálogos de um personagem específico
    R ← σ(id_personagem = '9')(Dialogo)
    T ← τ(ordem ASC)(R)

  • Exibe quantos diálogos cada personagem tem
    T ← γ(id_personagem, COUNT(∗) → qtd_dialogos)(Dialogo)

  • Exibe quantos diálogos existe por missao
    T ← γ(nome_missao, COUNT(∗) → qtd_dialogos)(Dialogo)

  • Exibe diálogos como nome e descricao da missao
    D ← ρ D(Dialogo)
    M ← ρ M(Missao)
    R ← D ⨝ (D.nome_missao = M.nome_missao) M
    T ← π(D.id_dialogo, D.texto, D.ordem, D.nome_missao, M.descricao → descricao_missao)(R)
    U ← τ(D.ordem ASC)(T)

  • Exibe diálogos e o tipo do personagem de cada um
    D ← ρ D(Dialogo)
    CP ← ρ CP(Consulta_Personagem)
    R ← D ⨝ (D.id_personagem = CP.id_personagem) CP
    T ← π(D.texto, CP.tipo_personagem)(R)

Missão

  • Consultar todas as missoes
    T ← π(*) (missao)

  • Consultar missoes ativas
    T ← σ(status = true)(missao)

  • Consultar missoes inativas
    T ← σ(status = false)(missao)

  • Consultar quantas missoes estao ativas e inativas T ← γ_{status} ( COUNT(*) → total ) (missao)

  • Consultar missoes com seus respectivos objetivos
    T ← π(missao ⨝ missao.nome_missao = objetivo_principal_missao.nome_missao objetivo_principal_missao) ⨝ (objetivo_principal_missao.titulo_objetivo = objetivo_principal.titulo_objetivo objetivo_principal)
    R ← π(m.nome_missao, m.descricao, o.titulo_objetivo, op.descricao)(T)

  • Consultar as salas asscociadas a cada missao
    T ← π(missao ⨝ missao.nome_missao = missao_sala.nome_missao missao_sala) ⨝ (missao_sala.id_sala = sala.id_sala sala)
    R ← π(missao.nome_missao, sala.nome, sala.nivel_perigo)(T)

  • Consultar missoes e seus itens associados T ← π(missao ⨝ missao.nome_missao = item.nome_missao item) ⨝ (item.nome_item = instancia_item.nome_item instancia_item) R ← π(missao.nome_missao, missao.descricao, item.nome_item, instancia_item.id_instancia, instancia_item.nivel_de_gasto) (T)

Inventário

  • Retorna todas as informações do inventário
    T ← π(id_inventario, qtd_itens, is_full)(Inventario)

  • Apenas os Inventários Cheios
    R ← (σ (is_full = TRUE)(Inventario))
    T ← π (id_inventario, qtd_itens, is_full)(R)

  • Apenas os Inventários que Não Estão Cheios
    R ← σ(is_full = FALSE)(Inventario)
    T ← π(id_inventario, qtd_itens, is_full)(R)

Sala

  • Inventário de uma Sala Específica
    R ← σ(S.id_sala = 1)(Inventario⋈I.id_inventario = S.id_inventario Sala) T ← π(I.id_inventario, I.qtd_itens, I.is_full)(R)

  • Retorna todas as informações das salas
    T ← π(id_sala, id_inventario, nome, descricao, nivel_perigo, bloqueado)(Sala)

  • Apenas as Salas que Não Estão Bloqueadas
    R ← σ(bloqueado = FALSE)(Sala)
    T ← π(id_sala, id_inventario, nome, descricao, nivel_perigo, bloqueado)(R)

  • Apenas a Sala que um personagem Está Presente
    R ← σ(J.id_personagem = 1)(Sala⋈S.id_sala = J.id_sala)(Jogador)
    T ← π(S.id_sala, S.nome, S.descricao, S.nivel_perigo, S.bloqueado, J.nome)(R)

Item_Iventario

  • Exibe todos os itens e suas informações de um inventário específico:
    INV ← ρ INV(Inventario)
    II ← ρ II(Instancia_Item)
    I ← ρ I(Item)
    R ← INV ⨝ (INV.id_inventario = II.id_inventario) II
    S ← R ⨝ (II.nome_item = I.nome_item) I
    W ← σ(INV.id_inventario = 1)(S)
    T ← π(INV.id_inventario, INV.qtd_itens, II.id_instancia, I.nome_item, I.descricao, I.durabilidade, II.nivel_de_gasto, I.utilidade, I.beneficio)(W)

  • Exibe a quantidade total de cada item em um inventário específico:
    I ← ρ I(Item)
    II ← ρ II(Instancia_Item)
    R ← II ⨝ (II.nome_item = I.nome_item) I
    S ← σ(II.id_inventario = 1)(R)
    T ← γ(I.nome_item, I.descricao, I.durabilidade, COUNT(II.nome_item) → quantidade_total)(S)

  • Exibe o total de itens e tipos diferentes em um inventário específico:
    INV ← ρ INV(Inventario)
    II ← ρ II(Instancia_Item)
    R ← INV ⨝ (INV.id_inventario = II.id_inventario) II
    S ← σ(INV.id_inventario = 1)(R)
    T ← γ(INV.id_inventario, COUNT(II.id_instancia) → total_itens, COUNT(DISTINCT II.nome_item) → tipos_diferentes_itens)(S)

Item

  • Exibe todas as gangues que vendem um item específico:
    I ← ρ I(Item)
    IL ← ρ IL(Item_Loja)
    L ← ρ L(Loja)
    R ← I ⨝ (I.nome_item = IL.nome_item) IL
    S ← R ⨝ (IL.nome_gangue = L.nome_gangue) L
    W ← σ(I.nome_item = 'Chave Inglesa')(S)
    T ← π(I.nome_item, IL.nome_gangue)(W)

  • Exibe todos os inventários que possuem um item específico:
    I ← ρ I(Item)
    II ← ρ II(Instancia_Item)
    INV ← ρ INV(Inventario)
    R ← I ⨝ (I.nome_item = II.nome_item) II
    S ← R ⨝ (II.id_inventario = INV.id_inventario) INV
    W ← σ(I.nome_item = 'Chave Inglesa')(S)
    T ← π(I.nome_item, INV.id_inventario)(W)

Loja

  • Exibe todos os itens e suas informações de uma gangue específica:
    L ← ρ L(Loja)
    IL ← ρ IL(Item_Loja)
    I ← ρ I(Item)

    R ← L ⨝ (L.nome_gangue = IL.nome_gangue) IL
    S ← R ⨝ (IL.nome_item = I.nome_item) I
    W ← σ(L.nome_gangue = 'Nome da Gangue')(S)
    T ← π(L.nome_gangue, L.nome_item, I.descricao, L.preco, I.durabilidade, I.utilidade, I.beneficio)(W)

  • Exibe o total de itens e valor total dos itens de uma gangue específica:
    L ← ρ L(Loja)
    IL ← ρ IL(Item_Loja)
    R ← L ⨝ (L.nome_gangue = IL.nome_gangue) IL
    S ← σ(L.nome_gangue = 'Nome da Gangue')(R)
    T ← γ(L.nome_gangue, COUNT(L.nome_item) → total_itens, SUM(L.preco) → valor_total)(S)

  • Exibe a quantidade e valor total de cada item em uma loja de uma gangue específica:
    L ← ρ L(Loja)
    IL ← ρ IL(Item_Loja)
    R ← L ⨝ (L.nome_gangue = IL.nome_gangue AND L.nome_item = IL.nome_item) IL
    S ← σ(L.nome_gangue = 'Nome da Gangue')(R)
    T ← γ(L.nome_item, L.preco, COUNT(L.nome_item) → quantidade_item, SUM(L.preco) → valor_total_item)(S)

📑 Histórico de versão

Versão Data Descrição Autor
1.0 05/06/2025 Criação da introdução e metodologia utilizada na Algebra Relacional Mayara A. Oliveira
1.1 11/06/2025 Adiciona agente_penitenciario, agente_penitenciario_jogador, consulta_personagem e missao_sala Maria Alice
1.2 13/06/2025 Objetivo_Principal, Objetivo_Principal_Missao, Dialogo Ana Carolina
1.3 13/06/2025 adicionando algebra relacional jogador, prisioneiro e gangue Mayara A. Oliveira
1.4 15/06/2025 adicionando algebra relacional de Inventário, Sala e Missao Marllon Cardoso