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”
- EmpresaID2, “Teste2”, “Teste2”
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 |
Seria Possível 2 AUTO-RELACIONAMENTO em uma mesma entidade?
att,
MAICON
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
Parabéns muito esclarecedor…
Excelente, muito claro!
É dificil achar conteudo bem explicado como este.
Parabén pelo material..muito bem explicado.
A teoria de auto relacionamento é a mesma para relacionamentos cíclicos?
Mayara,
O que você entende por relacionamento cíclico? Me explique melhor sua dúvida.
Abraço,
Eric
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.
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?
Thiago,
Não tenho a menor idéia do que ele quis dizer com isso. Com esse tanto de informação, não consigo ajudar.
Abraço,
Eric