Banco de Dados

Schema, tabelas e dicionário de dados do Laboratório de Hardware 2025

Visão Geral

SGBD: MySQL 8.0
Database: lab_hardware
Engine: InnoDB
Charset: utf8mb4
Schema: docker/mysql/init.sql

Tabelas

TabelaDescriçãoMóduloStatus
usuariosUsuários do sistema (alunos, professores, administradores)AutenticaçãoAtiva
tipos_itensCatálogo de tipos de equipamentos (Arduino, multímetro, etc.)ItensAtiva
itensItens físicos com código de patrimônio, status e localizaçãoItensAtiva
equipamentosEquipamentos simples (nome, descrição, quantidade, disponibilidade)EmpréstimosAtiva
emprestimosRegistro de empréstimos e devoluções (vinculado a equipamentos)EmpréstimosAtiva
login_attemptsLog de tentativas de login para rate limitingSegurançaAtiva
laboratoriosLaboratórios disponíveis para agendamentoAgendamentosSchema pronto
agendamentosAgendamento de uso do laboratório por períodoAgendamentosSchema pronto
forumFórum de discussão do projeto (Módulo 5 — externo)FórumPlanejada

Dicionário de Dados — usuarios

Fonte: docker/mysql/init.sql

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
usernameVARCHAR(50)NOT NULLNome de usuário (UNIQUE)
senhaVARCHAR(255)NOT NULLHash bcrypt da senha
tipoENUM('administrador','padrao')NOT NULLPerfil de acesso
criado_emTIMESTAMPNOT NULLData de criação
atualizado_emTIMESTAMPNOT NULLÚltima atualização (ON UPDATE)

Dicionário de Dados — tipos_itens

Fonte: docker/mysql/init.sql

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
nomeVARCHAR(100)NOT NULLNome do tipo (UNIQUE)
descricaoTEXTNULLDescrição do tipo
criado_emTIMESTAMPNOT NULLData de criação
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Dicionário de Dados — itens

Fonte: docker/mysql/init.sql

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
codigo_patrimonioVARCHAR(50)NOT NULLCódigo de patrimônio único (UNIQUE)
nomeVARCHAR(100)NOT NULLNome do item
tipo_idINTNULLFK → tipos_itens.id (ON DELETE SET NULL)
statusENUM('disponivel','emprestado','manutencao')NOT NULLStatus atual do item
descricaoTEXTNULLDescrição detalhada
localizacaoVARCHAR(100)NULLLocalização física no laboratório
criado_emTIMESTAMPNOT NULLData de cadastro
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Dicionário de Dados — equipamentos

Fonte: docker/mysql/init.sql. Tabela simplificada usada pelo módulo de empréstimos.

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
nomeVARCHAR(100)NOT NULLNome do equipamento
descricaoTEXTNULLDescrição detalhada
quantidadeINTNOT NULLQuantidade total em estoque
disponivelINTNOT NULLQuantidade disponível para empréstimo
criado_emTIMESTAMPNOT NULLData de criação
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Dicionário de Dados — emprestimos

Fonte: docker/mysql/init.sql. Vinculado à tabela equipamentos (simplificada).

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
usuario_idINTNOT NULLFK → usuarios.id (ON DELETE CASCADE)
equipamento_idINTNOT NULLFK → equipamentos.id (ON DELETE CASCADE)
data_emprestimoTIMESTAMPNOT NULLData/hora do empréstimo
data_devolucaoTIMESTAMPNULLData/hora da devolução (NULL = pendente)
statusENUM('pendente','devolvido','atrasado')NOT NULLStatus do empréstimo
observacaoTEXTNULLObservações sobre o empréstimo
criado_emTIMESTAMPNOT NULLData de criação do registro
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Dicionário de Dados — login_attempts

Fonte: docker/mysql/migrations/01_add_login_attempts.sql. Criada automaticamente pelo rate limiter.

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
ip_addressVARCHAR(45)NOT NULLEndereço IP da tentativa
usernameVARCHAR(50)NOT NULLNome de usuário tentado
attempted_atTIMESTAMPNOT NULLData/hora da tentativa (DEFAULT CURRENT)
successTINYINT(1)NOT NULL1 = sucesso, 0 = falha

Índices: idx_ip_time (ip_address, attempted_at), idx_username, idx_success

Dicionário de Dados — laboratorios

Fonte: docker/mysql/init.sql. Schema pronto, aguardando módulo de agendamentos.

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
codigoVARCHAR(20)NOT NULLCódigo do laboratório (UNIQUE)
lugarVARCHAR(100)NOT NULLLocalização do laboratório
nomeVARCHAR(100)NOT NULLNome do laboratório
tipoENUM('redes','hardware','robotica','informatica_normal')NOT NULLTipo/Temática do laboratório
tecnico_responsavelVARCHAR(100)NULLNome do técnico responsável
informacao_adicionalTEXTNULLInformações complementares
criado_emTIMESTAMPNOT NULLData de criação
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Dicionário de Dados — agendamentos

Fonte: docker/mysql/init.sql. Schema pronto, aguardando implementação do módulo.

ColunaTipoNullableDescrição
idINT AUTO_INCREMENTNOT NULLChave primária
usuario_idINTNOT NULLFK → usuarios.id (ON DELETE CASCADE)
laboratorio_idINTNOT NULLFK → laboratorios.id (ON DELETE CASCADE)
data_inicioDATETIMENOT NULLData/hora de início do agendamento
data_fimDATETIMENOT NULLData/hora de fim do agendamento
finalidadeVARCHAR(255)NULLFinalidade do uso do laboratório
statusENUM('pendente','aprovado','cancelado','concluido')NOT NULLStatus da solicitação
criado_emTIMESTAMPNOT NULLData de criação
atualizado_emTIMESTAMPNOT NULLÚltima atualização

Relacionamentos (DER)

Módulo Itens

Módulo Empréstimos

Módulo Agendamentos (schema)

Notas

Duas tabelas de inventário: O sistema possui itens (com código de patrimônio, usado pelo módulo Itens) e equipamentos (simplificada, usada pelo módulo Empréstimos). São estruturas paralelas que podem ser unificadas em versão futura.
Migration: role → tipo (2026-05-21): A coluna role na tabela usuarios foi renomeada para tipo via migration migrations/2024-05-21-rename_role_to_tipo.sql. O código PHP correspondente foi atualizado (verificarPermissao(['administrador'])). Este é o formato canônico do sistema.
login_attempts: Tabela auxiliar criada automaticamente pelo rate limiter (LIM-274). Permite rastrear tentativas de login por IP com bloqueio de 5 tentativas a cada 15 minutos. Gerenciada em src/config/rate_limit.php e auditável via src/admin/login_log.php.