Auto-Relacionamentos em Bancos de Dados Relacionais

A idéia dos relacionamentos está em criar referências entre duas ou mais tabelas. Quando uma tabela tem uma foreign key (FK) para outra, existe um relacionamento entre as tabelas. Ex.: Relacionamento entre a tabela Pedido e ItemPedido, de forma a criar o conceito de integridade referencial entre elas.

Algumas vezes as pessoas se confundem quando aparece um relacionamento para a própria tabela (auto-relacionamento), mas segue o mesmo conceito de relacionamento entre duas tabelas. Por exemplo:

  • Tabela Empresa com os campos
    • EmpresaID (int, not null)
    • RazaoSocial (varchar(100) not null)
    • NomeFantasia (varchar(50) not null)
    • EmpresaPaiID (int, null)
  • FK Definida de EmpresaPaiID para EmpresaID.

Sempre que eu vou inserir um registro numa tabela que tem uma FK, a FK só é validada caso todos os elementos que compõem a FK (no caso dela ser composta) tenham valores diferentes de nulo. No exemplo acima, se eu inserir um registro nessa tabela sem EmpresaPaiID, a FK não vai ser validada.

Caso exista valor, o auto-relacionamento indica que o ID informado em EmpresaPaiID deve existir na tabela Empresa, campo EmpresaID (conforme definido na FK). Na prática, implementa a regra “só podem ser cadastradas empresas filhas caso a pai esteja cadastrada).

Mas no final das contas, pra que serve um auto-relacionamento? A resposta mais simples é, principalmente para criar estruturas hierárquicas na base de dados. Usando o mesmo exemplo acima, para representar uma estrutura:

  • EmpresaID1, “Teste”, “Teste”
    • EmpresaID2, “Teste2”, “Teste2”
      • EmpresaID3, “Teste3”, “Teste3”

A forma mais elegante de representar essa estrutura, empresa 3 filha da empresa 2 que é filha da 1, seria com auto-relacionamento na tabela empresa e os dados representados da seguinte forma:

EmpresaID RazaoSocial NomeFantasia EmpresaPaiID
1 Teste Teste null
2 Teste2 Teste2 1
3 Teste3 Teste3 2
Anúncios

8 comentários em “Auto-Relacionamentos em Bancos de Dados Relacionais

    1. Maicon,

      Pode sim. É raro, mas não está conceitualmente errado.
      Vou tentar exemplificar:

      Imagine que vc tem uma tabela “Empresa” que possui um campo EmpresaID. Ela pode ter um auto-relacionamento EmpresaPaiID, que identifica quem é a empresa imediatamente no mesmo nível que ela.

      Nada impede que esta mesma tabela tenha um campo ProxEmpresaID, por exemplo, que possui um relacionamento para a próxima empresa do mesmo nível que ela. Seria um exemplo de dois auto-relacionamentos na mesma tabela.

      Como eu disse, é raro. Esse exemplo que eu passei é tampouco prático.

      Abraço,

      Eric

  1. Olá Eric,
    excelente post era o que precisava para entender, mas surgiu uma dúvida:
    Nessa situação de termos registros Pai/Filho/Neto, como poderíamos consultar todos os registros ordenados por pai/filho/neto ou então consultar todos os registros pai e que indique quem são seus filhos, netos, bisnetos ?
    Obrigado.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s