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

10 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.

  2. Olá Eric,

    Tenho uma dúvida. Certa vez um professor meu me disse que não gostava quando se deparava com um MER apresentando formato cíclico, ou seja, que de alguma forma os relacionamentos entre entidades fecham um ‘círculo’. Pode me dizer se essa teoria faz sentido e porque?

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