If you're seeing this message, it means we're having trouble loading external resources on our website.

Se você está atrás de um filtro da Web, certifique-se que os domínios *.kastatic.org e *.kasandbox.org estão desbloqueados.

Conteúdo principal

Separando dados em tabelas relacionadas

Até agora, trabalhamos com apenas uma tabela por vez e vimos que dados interessantes podemos selecionar a partir da tabela. Mas na verdade, na maioria das vezes, temos nossos dados distribuídos em várias tabelas e essas tabelas estão "relacionadas" umas às outras de alguma forma.
Por exemplo, vamos supor que temos uma tabela para registrar o quão bem os alunos se saem em suas provas e vamos incluir e-mails caso precisemos entrar em contato com seus pais devido a notas ruins:
nome_alunoemail_alunoprovanota
Peter Rabbitpeter@rabbit.comNutrição95
Alice Wonderlandalice@wonderland.comNutrição92
Peter Rabbitpeter@rabbit.comQuímica85
Alice Wonderlandalice@wonderland.comQuímica95
Também podemos ter uma tabela para registrar quais livros cada aluno lê:
nome_alunotítulo_livroautor_livro
Peter RabbitThe Tale of Mrs. Tiggy-WinkleBeatrix Potter
Peter RabbitJabberwockyLewis Carroll
Alice WonderlandThe Hunting of the SnarkLewis Carroll
Alice WonderlandJabberwockyLewis Carroll
Também podemos ter uma tabela apenas para informações detalhadas do aluno:
idprimeiro_nomesobrenomeemail_alunotelefonenascimento
1PedroCoelhopeter@rabbit.com555-66662001-05-10
2AliceWonderlandalice@wonderland.com555-44442001-04-02
O que você acha dessas tabelas? Você as alteraria de alguma forma?
Há uma coisa importante sobre essas tabelas: elas estão descrevendo dados relacionais - elas estão descrevendo dados relacionados entre si. Cada uma dessas tabelas descreve dados relacionados a um aluno específico e muitas delas replicam os mesmos dados. Quando o mesmo dado está replicado em várias tabelas, pode haver consequências interessantes.
Por exemplo, e se um aluno trocasse de e-mail? Que tabelas precisaríamos alterar?
Precisaríamos alterar a tabela de informações sobre o aluno, mas como também incluímos esse dado na tabela de notas, também precisaríamos encontrar todas as linhas sobre esse aluno e alterar o e-mail em todas elas.
Geralmente é preferível garantir que uma coluna específica de dados está armazenada apenas em um único local, assim há menos locais para atualizar e menos riscos de ter dados diferentes em locais diferentes. Se fizermos isso, precisamos garantir que tenhamos uma forma de relacionar os dados entre as tabelas, e veremos isso mais tarde.
Vamos supor que decidimos remover o e-mail das tabelas de nota, porque percebemos que esse dado é redundante com o e-mail na tabela de detalhes sobre o aluno. É isso que teríamos:
nome_alunoprovanota
Peter RabbitNutrição95
Alice WonderlandNutrição92
Peter Rabbitquímica85
Alice Wonderlandquímica95
Como poderíamos descobrir o e-mail de cada aluno? Poderíamos encontrar a linha na tabela de informações sobre o aluno com o nome correspondente. E se dois alunos tivessem o mesmo nome? (Você sabia que em Bali só existem 4 nomes e cada pessoa só pode ter um deles?) Não podemos confiar no nome para encontrar um aluno e, na verdade, nunca devemos confiar em algo como um nome para identificar algo único em uma tabela.
Assim, o melhor a fazer é substituir nome_aluno por id_aluno, já que este é um identificador único:
id_alunoprovanota
1Nutrição95
2Nutrição92
1Química85
2Química95
Nós poderíamos fazer a mesma mudança na nossa tabela de livros, usando student_id ao invés de student_name:
id_alunotítulo_livroautor_livro
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
1JabberwockyLewis Carroll
2The Hunting of the SnarkLewis Carroll
2JabberwockyLewis Carroll
Percebe que temos o título e o autor repetidos duas vezes para Jabberwocky? Esse é outro sinal de alerta de que podemos dividir nossa tabela em várias tabelas relacionadas, assim não precisamos atualizar vários locais se algo sobre um livro for alterado.
Poderíamos ter uma tabela apenas sobre livros:
idtítulo_livroautor_livro
1The Tale of Mrs. Tiggy-WinkleBeatrix Potter
2JabberwockyLewis Carroll
3The Hunting of the SnarkLewis Carroll
E então nossa tabela livros_aluno fica assim:
id_alunoid_livro
11
12
23
22
Eu sei, essa tabela não é tão legível quanto a antiga, que tinha toda a informação armazenada em cada linha. Mas, geralmente, as tabelas não são concebidas para serem lidas por humanos - elas são concebidas para armazenar dados da melhor forma possível, com a maior facilidade de manutenção e da forma menos propensa a erros. Em muitos casos, pode ser melhor dividir as informações em várias tabelas relacionadas, assim há menos dados redundantes e menos locais para atualizar.
É importante compreender como usar SQL para lidar com dados reais que foram divididos em várias tabelas relacionadas e juntar os dados das tabelas quando for necessário. Isso é feito usando um conceito chamado "join"s e é isso que vamos lhe mostrar a seguir.

Quer participar da conversa?

Você entende inglês? Clique aqui para ver mais debates na versão em inglês do site da Khan Academy.