11. Álgebra Relacional

A álgebra relacional é uma linguagem formal utilizada para representar consultas em bancos de dados relacionais de forma matemática e precisa. Essa linguagem serve como base teórica para o SQL, especialmente para consultas (SELECT). Além de ajudar a entender o funcionamento interno dos sistemas de banco de dados, a álgebra relacional é útil para projetar, otimizar e validar consultas, oferecendo uma forma rigorosa e lógica de manipular dados. Seu uso é fundamental no ensino e na análise de bancos relacionais, por ser independente da linguagem de implementação.

11.1. Operadores Fundamentais

  • Seleção (σ): Filtra linhas com base em uma condição.

  • Projeção (π): Seleciona colunas específicas.

  • União (∪): Junta duas relações com o mesmo esquema.

  • Diferença (−): Retorna tuplas que estão em uma relação mas não na outra.

  • Produto Cartesiano (×): Junta todas as combinações de tuplas das duas relações.

  • Junção (⨝): Combina tuplas de duas relações com base em uma condição.

11.2. Estrutura Atual do Banco de Dados

O banco de dados do MINECRAFT - FGA - 2025/1 possui a seguinte estrutura:

Bioma (id_bioma, nome, descricao)
Mapa (id_mapa, nome, turno)
Chunk (id_chunk, id_bioma, id_mapa, x, y)
Player (id_player, nome, vida_maxima, vida_atual, forca, localizacao, nivel, experiencia, current_chunk_id)
Item (id_item, nome, tipo, poder, durabilidade)
Inventario (id, player_id, item_id, quantidade)

11.3. Consultas Básicas

Seleciona todos os biomas

π_{id_bioma, nome, descricao}(Bioma)

Seleciona todos os mapas

π_{id_mapa, nome, turno}(Mapa)

Seleciona todos os chunks

π_{id_chunk, id_bioma, id_mapa, x, y}(Chunk)

Seleciona todos os jogadores

π_{id_player, nome, vida_maxima, vida_atual, forca, localizacao, nivel, experiencia, current_chunk_id}(Player)

Seleciona todos os itens

π_{id_item, nome, tipo, poder, durabilidade}(Item)

Seleciona todos os inventários

π_{id, player_id, item_id, quantidade}(Inventario)

11.4. Consultas de Filtragem

Jogadores vivos (vida_atual > 0)

σ_{vida_atual > 0}(Player)

Chunks de um bioma específico (e.g., Oceano)

σ_{id_bioma = 4}(Chunk)

Mapas de dia

σ_{turno = 'Dia'}(Mapa)

Itens do tipo arma

σ_{tipo = 'Arma'}(Item)

Jogadores de nível alto (nível >= 5)

σ_{nivel >= 5}(Player)

11.5. Consultas com Junções

Consulta 1: Jogadores e sua Localização Atual Detalhada

π_{p.nome, p.vida_atual, p.nivel, p.experiencia, c.id_chunk, b.nome, m.nome, m.turno}
(
    ((Player ⨝_{Player.current_chunk_id = Chunk.id_chunk} Chunk)
        ⨝_{Chunk.id_bioma = Bioma.id_bioma} Bioma)
        ⨝_{Chunk.id_mapa = Mapa.id_mapa} Mapa
)

Consulta 2: Inventário Completo de Cada Jogador

π_{p.nome, i.nome, inv.quantidade, i.tipo, i.poder}
(
    ((Player ⨝_{Player.id_player = Inventario.player_id} Inventario)
        ⨝_{Inventario.item_id = Item.id_item} Item)
)

Consulta 3: Detalhes Completos dos Chunks com Biomas e Mapas

π_{c.id_chunk, c.x, c.y, b.nome, b.descricao, m.nome, m.turno}
(
    ((Chunk ⨝_{Chunk.id_bioma = Bioma.id_bioma} Bioma)
        ⨝_{Chunk.id_mapa = Mapa.id_mapa} Mapa)
)

Consulta 4: Jogadores em Biomas Específicos

π_{p.nome, p.nivel, b.nome}
(
    ((Player ⨝_{Player.current_chunk_id = Chunk.id_chunk} Chunk)
        ⨝_{Chunk.id_bioma = Bioma.id_bioma} Bioma)
)

11.6. Consultas de Agregação (Conceitual)

Contagem de Jogadores por Bioma

γ_{b.nome, count(*)}
(
    ((Player ⨝_{Player.current_chunk_id = Chunk.id_chunk} Chunk)
        ⨝_{Chunk.id_bioma = Bioma.id_bioma} Bioma)
)

Distribuição de Chunks por Mapa

γ_{m.nome, m.turno, count(*)}
(
    Chunk ⨝_{Chunk.id_mapa = Mapa.id_mapa} Mapa
)

Quantidade Total de Itens por Jogador

γ_{p.nome, sum(inv.quantidade)}
(
    Player ⨝_{Player.id_player = Inventario.player_id} Inventario
)

11.7. Consultas Avançadas

Consulta 5: Jogadores com Armas no Inventário

π_{p.nome, i.nome, i.poder}
(
    σ_{i.tipo = 'Arma'}
    (
        ((Player ⨝_{Player.id_player = Inventario.player_id} Inventario)
            ⨝_{Inventario.item_id = Item.id_item} Item)
    )
)

Consulta 6: Chunks Adjacentes (Baseado em Coordenadas)

π_{c1.id_chunk, c2.id_chunk}
(
    σ_{(|c1.x - c2.x| = 1 ∧ c1.y = c2.y) ∨ (|c1.y - c2.y| = 1 ∧ c1.x = c2.x)}
    (
        ρ_{c1}(Chunk) × ρ_{c2}(Chunk)
    )
)

Consulta 7: Jogadores em Mapas de Dia vs Noite

π_{p.nome, m.turno}
(
    ((Player ⨝_{Player.current_chunk_id = Chunk.id_chunk} Chunk)
        ⨝_{Chunk.id_mapa = Mapa.id_mapa} Mapa)
)

Consulta 8: Itens Mais Poderosos por Tipo

π_{i.tipo, max(i.poder)}
(
    σ_{i.poder IS NOT NULL}(Item)
)

11.8. Consultas de Diferença e União

Jogadores que NÃO possuem itens

π_{id_player, nome}(Player) − π_{player_id, nome}(Player ⨝_{Player.id_player = Inventario.player_id} Inventario)

Chunks de Deserto OU Oceano

σ_{id_bioma = 1}(Chunk) ∪ σ_{id_bioma = 4}(Chunk)

Itens de Combate (Armas + Poções)

σ_{tipo = 'Arma'}(Item) ∪ σ_{tipo = 'Poção'}(Item)

11.9. Consultas de Otimização de Jogabilidade

Consulta 9: Jogadores Próximos (Mesmo Mapa)

π_{p1.nome, p2.nome, m.nome}
(
    σ_{p1.id_player ≠ p2.id_player}
    (
        ((((ρ_{p1}(Player) ⨝_{p1.current_chunk_id = c1.id_chunk} ρ_{c1}(Chunk))
            ⨝_{c1.id_mapa = m.id_mapa} Mapa)
            ⨝_{m.id_mapa = c2.id_mapa} ρ_{c2}(Chunk))
            ⨝_{c2.id_chunk = p2.current_chunk_id} ρ_{p2}(Player))
    )
)

Consulta 10: Recursos Disponíveis por Bioma

π_{b.nome, i.nome, sum(inv.quantidade)}
(
    ((((Player ⨝_{Player.current_chunk_id = Chunk.id_chunk} Chunk)
        ⨝_{Chunk.id_bioma = Bioma.id_bioma} Bioma)
        ⨝_{Player.id_player = Inventario.player_id} Inventario)
        ⨝_{Inventario.item_id = Item.id_item} Item)
)

11.10. Equivalências de Consulta

Equivalência 1: Comutatividade da Junção

Player ⨝_{Player.id_player = Inventario.player_id} Inventario
≡
Inventario ⨝_{Inventario.player_id = Player.id_player} Player

Equivalência 2: Seleção Antes da Junção

σ_{vida_atual > 50}(Player ⨝_{Player.id_player = Inventario.player_id} Inventario)
≡
σ_{vida_atual > 50}(Player) ⨝_{Player.id_player = Inventario.player_id} Inventario

Equivalência 3: Projeção Distributiva

π_{nome, quantidade}(Player ⨝_{Player.id_player = Inventario.player_id} Inventario)
≡
π_{nome}(Player) ⨝_{Player.id_player = Inventario.player_id} π_{player_id, quantidade}(Inventario)

11.11. Considerações de Performance

  1. Índices Sugeridos: Baseados nas junções mais comuns - Player.current_chunk_idChunk.id_chunk - Chunk.id_biomaBioma.id_bioma - Chunk.id_mapaMapa.id_mapa - Inventario.player_idPlayer.id_player - Inventario.item_idItem.id_item

  2. Ordenação de Operações: Aplicar seleções antes das junções para reduzir o conjunto de dados

  3. Junções Mais Eficientes: Usar índices nas chaves estrangeiras para acelerar as junções

  4. Projeção Precoce: Selecionar apenas as colunas necessárias o mais cedo possível

11.12. Aplicações Práticas

Essas consultas em álgebra relacional são implementadas no sistema através de:

  1. Repositories: Que encapsulam consultas específicas de cada entidade

  2. Services: Que combinam múltiplas consultas para funcionalidades complexas

  3. Interface: Que apresenta os dados resultantes para o usuário

A álgebra relacional serve como base teórica para: - Otimização de consultas SQL - Design de índices eficientes - Validação de lógica de negócio - Compreensão de relacionamentos entre entidades