Entendendo o relacionamento de tabelas no banco de dados

Dando continuidade ao tutorial do Data Mapper para Code Igniter hoje vou escrever sobre um assunto que sempre complicou minha vida quando o assunto é MySQL: relacionamento de tabelas.

Este post explicará apenas o básico sobre relacionamento, quando finalizei ele tratando de relacionamento e do uso de relacionamentos no Data Mapper ele acabou bastante extenso, optei por quebrar o post em dois para facilitar a leitura.

Se você já entende de relacionamentos não perca tempo com este post, aguarde o tutorial específico de como usar relacionamentos no Data Mapper para Code Igniter (será linkado neste post assim que for publicado!).

 

O que é relacionamento de tabelas?

Primeiro vamos entender um pouco sobre o funcionamento e tipos de relacionamento, deixando de lado o Data Mapper e falando apenas da questão lógica do negócio.

O relacionamento existe quando um ou mais dados de uma tabela estão relacionados de alguma forma com um ou mais dados de outra tabela.

Por exemplo, temos uma tabela d usuários (users) e uma tabela de posts (posts), cada usuário pode publicar infinitos posts porém cada post poderá ter apenas um usuário. Estas tabelas estão relacionadas.

Existe também relacionamento de dados de uma tabela com outros dados desta mesma tabela. Um usuário (user) pode ter vários amigos da mesma tabela (user), então os dados estão relacionados com dados da mesma tabela.

Agora vamos aos tipos de relacionamento:

 

Relacionamento um para um (one to one)

Neste tipo de relacionamento um dado de uma tabela equivale a um dado em outra tabela exatamente.

Por exemplo um usuário (table users) está relacionado a um endereço na tabela adress, e cada endereço só está relacionado a um usuário.

 

Relacionamento um para muitos - One to Many

No relacionamento um para muitos um dado da tabela um pode estar relacionado a diversos dados da tabela dois, porém cada dado da tabela dois estão relacionados a apenas um dado da tabela um.

Por exemplo um user (table users) pode estar relacionado a diversas casas (table houses), porém cada casa só está relacionada a um user.

 

Relacionamento muitos para muitos - Many to many

No "many to many" os dados da primeira tabela podem estar relacionados a diversos dados da segunda tabela e os dados da segunda tabela também podem estar relacionados a diversos dados da primeira tabela.

Exemplo: um usuário pode ter diversas habilidades (user com diversos relacionamentos para a tabela skills) e cada habilidade também pode estar relacionada a diversos usuários (dado da tabela skill relacionado a diversos dados da tabela users).

 

 

Estrutura das tabelas para relacionamento

Agora que já conhecemos os tipos de relacionamento, vamos entender como estruturar nosso banco de dados para permitir o acesso fácil aos dados relacionados.

Quando o relacionamento é um para um ou um para muitos podemos estruturar as colunas diretamente na tabelas relacionadas, continuando com o exemplo da tabela users e posts, na nossa tabela posts  podemos ter uma coluna chamada user_id  que identifica a qual user está relacionado aquele post.

Table users

id | name | email

 

Table posts

id | title | content | user_id

 

No exemplo acima temos automaticamente um relacionamento um para muitos de users->posts e um para um de posts->users.

Quando o relacionamento é muitos para muitos a estrutura do exemplo acima não é viável (a não ser com uma boa gambiarra, com split de valores e performance porca como eu já fiz). A solução é "quebrar" o relacionamento e inserí-lo em uma nova tabela destinada somente a isso.

Vamos supor que temos uma tabela images onde ficam armazenadas as imagens relacionadas aos posts. Um post poderá ter diversas images e uma image poderá ser utilizada em múltiplos posts. Para fazer este relacionamento criamos uma tabela de relacionamento, que para ilustrar este exemplo chamaremos de images_posts e terá a estrutura abaixo:

TABLE IMAGES_POSTS

id | image_id | post_id

 

Com este tipo de estruturação podemos relacionar infinitos posts com infinitas images. Por exemplo, o post com id = 4 poderá ter as imagens com id = 8, id = 9 e id = 10.

Teremos:

TABLE IMAGES_POSTS

id | image_id | post_id

1  | 8                | 4

2  | 9                | 4

3  | 10              | 4

 

Pronto, estrutura feira e as images 8, 9 e 10 também poderão estar relacionadas a outros posts também, apenas inserindo mais dados nesta tabela de relacionamento.

 

O próximo post explicará como inserir, acessar e manipulas dados de tabelas com relacionamento utilizando a ferramenta ORM Data Mapper para Code Igniter!

Espero que este post seja uma boa referência para estudos, para dar continuidade ao aprendizado veja alguns livros sobre MySQL que podem te ajudar.

Ir para o topo