Capítulo 05: Relacionamentos 1 para N: Chaves Estrangeiras e a Janela de Relações

🎯 Objetivo da Aula

Nesta aula que inaugura o Módulo 2, você aprenderá como transformar tabelas isoladas em um verdadeiro Banco de Dados Relacional. No laboratório de informática, você utilizará a Janela de Relações (Relationships Window) do Microsoft Access, compreenderá o conceito de Chave Estrangeira (Foreign Key - FK) e a cardinalidade 1:N (Um para Muitos). Você ativará a Integridade Referencial, a regra magna dos SGBDs que impede que o operador cadastre fretes para clientes fantasmas ou veículos inexistentes.

Ao final desta aula, seu banco de dados possuirá um diagrama de relacionamentos ativo com os símbolos matemáticos $1$ e $\infty$, garantindo a consistência das ordens de frete da FastLog S.A.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: Antes da implantação do Access, um faturista na pressa digitou uma ordem de transporte no valor de R$ 18.500,00 digitando o código do cliente como 9999. No final do mês, quando o departamento de cobrança foi emitir o boleto bancário, descobriu que o cliente 9999 simplesmente não existia no cadastro comercial da empresa. Ninguém sabia para quem a carga de eletrodomésticos havia sido entregue, gerando um prejuízo de R$ 18.500,00 e uma sindicância interna por suspeita de desvio de carga (Problema de Registros Órfãos).
Sua Missão: Como DBA da FastLog, você abrirá a Janela de Relações do Access, vinculará a tabela tbl_Clientes à tabela tbl_OrdensFrete e ativará a Integridade Referencial, fazendo com que o SGBD bloqueie sumariamente qualquer tentativa de gravar fretes para clientes inexistentes.


🧠 Fundamentos: A Teoria Traduzida

1. Cardinalidade 1:N (Um para Muitos)

No mundo corporativo da logística, os relacionamentos mais comuns são do tipo 1 para N:

  • Um Cliente pode contratar Muitas Ordens de Frete. (Mas cada Ordem de Frete pertence a um único Cliente).
  • Um Veículo pode realizar Muitas Viagens. (Mas cada Ordem de Frete utiliza um único Veículo tracionador).
  • Um Motorista pode executar Muitos Despachos. (Mas cada viagem possui um único Motorista titular).
erDiagram
    tbl_Clientes ||--o{ tbl_OrdensFrete : "1 : N (emite fretes)"
    tbl_Veiculos ||--o{ tbl_OrdensFrete : "1 : N (transporta cargas)"
    tbl_Motoristas ||--o{ tbl_OrdensFrete : "1 : N (conduz carretas)"

    tbl_Clientes {
        Autonumber ID_Cliente PK
        ShortText Razao_Social
        ShortText CNPJ
    }

    tbl_OrdensFrete {
        Autonumber ID_OrdemFrete PK
        Long ID_Cliente FK
        ShortText Placa_Veiculo FK
        Long ID_Motorista FK
        Currency Valor_Frete
    }

    tbl_Veiculos {
        ShortText Placa PK
        ShortText Modelo_Cavalo
    }

    tbl_Motoristas {
        Autonumber ID_Motorista PK
        ShortText Nome_Motorista
    }

2. O Conceito de Chave Estrangeira (Foreign Key - FK)

Uma Chave Estrangeira (FK) é uma coluna presente em uma tabela filha que faz referência direta à Chave Primária (PK) de uma tabela mãe:

  • Na tabela tbl_Clientes, o campo ID_Cliente é PK (Chave Primária).
  • Na tabela tbl_OrdensFrete, o campo ID_Cliente é FK (Chave Estrangeira).

⚠️ A Regra de Ouro da Compatibilidade de Tipos:

Para que o relacionamento funcione no Access:

  1. Se a PK na tabela mãe for Autonumeração, a FK na tabela filha DEVE ser do tipo Número, com Tamanho do Campo: Inteiro Longo (Long Integer).
  2. Se a PK na tabela mãe for Texto Curto (7 caracteres) (como o campo Placa), a FK na tabela filha DEVE ser Texto Curto (7 caracteres). Se os tamanhos forem diferentes, o Access recusará a criação do relacionamento!

3. A Integridade Referencial (Referential Integrity)

A Integridade Referencial é um sistema de regras que o Access utiliza para garantir que as relações entre os registros sejam válidas e que você não exclua ou altere acidentalmente dados relacionados.

  • O que ela garante: O banco de dados PROÍBE a inserção de um valor no campo FK que não exista previamente na tabela da PK correspondente.
  • Símbolos no Diagrama: Quando ativada, a linha de relacionamento exibe o número 1 na ponta da tabela mãe e o símbolo do infinito ∞ na ponta da tabela filha.

📖 Exemplo Guiado: Passo a Passo no Laboratório

Abra o arquivo FastLog_Database.accdb.

Passo 1: Abrindo a Janela de Relações

  1. Certifique-se de que todas as tabelas estão fechadas (se houver alguma aba de tabela aberta, feche-a, senão o Access bloqueará a edição das relações!).
  2. Na faixa de opções superior, clique na guia Ferramentas de Banco de Dados (Database Tools).
  3. No grupo Relações, clique no botão Relações (Relationships).
  4. Uma tela com fundo cinza e a janela flutuante Adicionar Tabelas será exibida.

Passo 2: Adicionando as Tabelas ao Diagrama

  1. Na lista de tabelas, selecione com duplo clique:
    • tbl_Clientes
    • tbl_Veiculos
    • tbl_Motoristas
    • tbl_OrdensFrete
  2. Feche a janelinha Adicionar Tabelas.
  3. Redimensione e organize as caixas das tabelas na tela para visualizar todos os campos com clareza.

🛠️ Prática Obrigatória 1: Criando a Relação 1:N com Integridade Referencial

Você conectará a tabela mãe tbl_Clientes à tabela filha tbl_OrdensFrete.

Passo a Passo no Computador:

  1. Na caixa de tbl_Clientes, posicione o cursor do mouse sobre o campo ID_Cliente (que possui o ícone da chave 🔑).
  2. Clique com o botão esquerdo do mouse, mantenha pressionado e arraste o cursor até soltá-lo exatamente sobre o campo ID_Cliente dentro da caixa de tbl_OrdensFrete.
  3. A janela modal Editar Relações (Edit Relationships) será aberta:
    • Coluna da Esquerda (Tabela/Consulta): tbl_Clientes ➔ Campo: ID_Cliente
    • Coluna da Direita (Tabela/Consulta Relacionada): tbl_OrdensFrete ➔ Campo: ID_Cliente
  4. Na parte inferior da janela, localize e marque a caixinha:
    • ☑ Exigir Integridade Referencial (Enforce Referential Integrity)
  5. Observe que o campo Tipo de Relação na parte inferior exibirá automaticamente: Um para Vários (1:N).
  6. Clique no botão Criar.
  7. Repita o mesmo procedimento para as outras tabelas:
    • Arraste Placa de tbl_Veiculos para Placa_Veiculo de tbl_OrdensFrete ➔ Marque: ☑ Exigir Integridade Referencial ➔ Criar.
    • Arraste ID_Motorista de tbl_Motoristas para ID_Motorista de tbl_OrdensFrete ➔ Marque: ☑ Exigir Integridade Referencial ➔ Criar.
  8. Salve o diagrama pressionando Ctrl + B e feche a janela de relações.

✅ Resultado Esperado (Prática 1):

A Janela de Relações exibe as três conexões com linhas pretas contínuas exibindo o símbolo 1 nas pontas das tabelas mestres e o símbolo ∞ na tabela tbl_OrdensFrete.


🛠️ Prática Obrigatória 2: Teste de Fogo da Integridade Referencial

Agora você comprovará que a transportadora está protegida contra erros humanos e clientes fantasmas.

Passo a Passo no Computador:

  1. Abra a tabela tbl_Clientes no Modo Folha de Dados e verifique quais IDs existem cadastrados (ex: ID 1 e ID 2).
  2. Feche tbl_Clientes e abra a tabela tbl_OrdensFrete no Modo Folha de Dados.
  3. Tente inserir um novo frete tentando burlar o sistema:
    • Data_Despacho: 15/10/2026
    • Data_Entrega_Prevista: 18/10/2026
    • Valor_Frete: 12000
    • Peso_Liquido_Kg: 15000
    • Status_Ordem: Agendado
    • ID_Cliente: Digite o código 999 (um cliente que NÃO existe!)
    • Placa_Veiculo: Digite uma placa existente (ex: BRA2E19)
    • ID_Motorista: Digite um motorista existente (ex: 1)
  4. Tente passar para a próxima linha ou fechar a tabela.
  5. Veja a reação do Access: Uma mensagem de alerta oficial do motor relacional surgirá na tela: “Não é possível adicionar ou alterar o registro porque é necessário um registro relacionado na tabela ’tbl_Clientes’.”
  6. O Access bloqueia a gravação. O frete fantasma jamais entrará no sistema!
  7. Altere o valor de ID_Cliente para o número 1 (cliente real existente) e a gravação será efetuada instantaneamente com sucesso.

✅ Resultado Esperado (Prática 2):

A integridade referencial rejeita com sucesso chaves estrangeiras inexistentes, eliminando 100% dos riscos de registros órfãos na FastLog.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o banco de dados e feche o Access.
  2. Nomeie o arquivo: FastLog_BD_Cap05_SeuNome_SeuSobrenome.accdb.
  3. Acesse o Microsoft Teams na sua turma.
  4. Abra a tarefa: “Banco de Dados - Cap 05: Relacionamentos 1:N e Integridade”.
  5. Anexe o seu arquivo .accdb e clique em Entregar (Turn In).

💡 Checkpoint de Gestão & TI

Por que esta funcionalidade do Access vale milhões para uma empresa de logística? No Excel, qualquer colaborador pode inventar um código de cliente ou apagar uma linha por engano. Com a Integridade Referencial ativa no SGBD, o software assume o papel de guardião legal das regras comerciais, impedindo desvios, falhas operacionais e inconsistências contábeis antes que elas cheguem ao cliente final.


🔥 Desafio de Fixação: Estabelecendo a Conexão com Filiais

Na tabela tbl_OrdensFrete, temos duas chaves estrangeiras que apontam para a tabela mãe tbl_Filiais:

  • ID_Filial_Origem (onde o caminhão é carregado).
  • ID_Filial_Destino (onde a mercadoria será descarregada).

Abra a Janela de Relações do Access e execute as seguintes ações:

  1. Como a tabela tbl_Filiais precisará ser conectada duas vezes, clique no botão Adicionar Tabelas e dê duplo clique em tbl_Filiais novamente. O Access criará um atalho chamado tbl_Filiais_1.
  2. Conecte ID_Filial de tbl_Filiais ao campo ID_Filial_Origem de tbl_OrdensFrete com Integridade Referencial ativa.
  3. Conecte ID_Filial de tbl_Filiais_1 ao campo ID_Filial_Destino de tbl_OrdensFrete com Integridade Referencial ativa.
  4. Salve o diagrama atualizado.

🔑 Revelar Gabarito Oficial e Material de Apoio da Aula (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Diagrama de Relacionamentos Completo (Configuração da Janela de Relações):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Relação 1: tbl_Clientes (ID_Cliente [PK]) 1 <----> ∞ tbl_OrdensFrete (ID_Cliente [FK])
   [X] Exigir Integridade Referencial

Relação 2: tbl_Veiculos (Placa [PK]) 1 <----> ∞ tbl_OrdensFrete (Placa_Veiculo [FK])
   [X] Exigir Integridade Referencial

Relação 3: tbl_Motoristas (ID_Motorista [PK]) 1 <----> ∞ tbl_OrdensFrete (ID_Motorista [FK])
   [X] Exigir Integridade Referencial

Relação 4 (Origem): tbl_Filiais (ID_Filial [PK]) 1 <----> ∞ tbl_OrdensFrete (ID_Filial_Origem [FK])
   [X] Exigir Integridade Referencial

Relação 5 (Destino): tbl_Filiais_1 (ID_Filial [PK]) 1 <----> ∞ tbl_OrdensFrete (ID_Filial_Destino [FK])
   [X] Exigir Integridade Referencial

📥 Download dos Scripts desta Aula:
Baixe o arquivo de script Capitulo_05.sql ou o pacote compactado (.zip) com os comandos SQL e esquemas da aula.


📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas reflexivas abaixo com base no conteúdo deste capítulo. Ao concluir, apresente o caderno ao professor para conferência e visto.

  1. O que significa a cardinalidade 1:N (Um para Muitos) no contexto de uma transportadora de cargas?
  2. Defina com suas próprias palavras o que é uma Chave Estrangeira (Foreign Key - FK) e qual é a sua finalidade em um banco de dados.
  3. Qual é a regra técnica de compatibilidade de tipos entre uma Chave Primária do tipo Autonumeração e sua respectiva Chave Estrangeira?
  4. No Cenário Prático da FastLog, o que gerou o problema do chamado “Registro Órfão” e qual foi o prejuízo financeiro causado?
  5. Em qual guia da faixa de opções do Microsoft Access encontramos o botão para abrir a Janela de Relações?
  6. Por que todas as tabelas devem estar obrigatoriamente fechadas antes de criarmos ou editarmos relacionamentos na Janela de Relações?
  7. O que representa a opção ☑ Exigir Integridade Referencial na janela de configuração de relações?
  8. Quais símbolos gráficos surgem nas extremidades de uma linha de relacionamento quando a integridade referencial está devidamente ativada?
  9. O que ocorreu na Prática Obrigatória 2 quando você tentou inserir uma ordem de frete vinculada ao ID_Cliente = 999?
  10. No Desafio de Fixação, por que foi necessário adicionar uma cópia visual da tabela tbl_Filiais (denominada tbl_Filiais_1) na Janela de Relações?