none
Dúvida com auto relacionamento RRS feed

  • Pergunta

  • Bom dia pessoal,

    Alguém poderia me explicar qual a finalidade o auto relacionamento? Um relacionamento entre entidades tem a finalidade de interligá-las, mas qual a finalidade de relacionar uma entidade com ela própria?

    Grato

    segunda-feira, 11 de agosto de 2014 04:22

Respostas

Todas as Respostas

  • Wmn8,

    Existe em alguns casos onde é necessário criar uma estrutura hierárquia "pai-filho" na mesma tabela. 

    Este tipo de manipulação de dados, usando recursividade é comum para diversos vínculos de dados.

    Veja os links abaixo para maiores informações:

    http://msdn.microsoft.com/pt-br/library/ms174846.aspx

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/21698.t-sql-classificando-dados-em-uma-tabela-hierarquica-com-relacao-pai-filho.aspx

    http://technet.microsoft.com/pt-br/library/ms186243(v=sql.105).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    segunda-feira, 11 de agosto de 2014 12:19
    Moderador
  • Deleted
    segunda-feira, 11 de agosto de 2014 12:29
  • WMN8, o autorrelacionamento não é um objetivo ou finalidade mas sim representação (modelo) de algo que já existe. Por exemplo, em SQL Server podemos ter uma tabela em que cada linha contenha informações de funcionário e que uma das colunas aponte para o chefe imediato. Ou seja, há um ponteiro para outra linha na mesma tabela.
     

    -- código 1 v2
    CREATE TABLE Funcionário ( ID char(7) not null primary key, Nome varchar(50), ID_Chefe char(7) null references Funcionário (ID) );

    ALTER TABLE Funcionário
      ADD CONSTRAINT SemLoop CHECK (ID <> ID_Chefe);

    No código acima a coluna ID_Chefe, quando preenchida, aponta para a linha que contém os dados do chefe imediato.

    A manipulação desse tipo de apontamento geralmente é tratada com algoritmos de hierarquia, com uso de recursividade.

     


    Para testar:

    TRUNCATE TABLE Funcionário;
    INSERT into Funcionário values 
       ('0000001', 'abc', null), 
       ('0000002', 'xyz', '0000001'),
       ('0000003', 'def', '0000002'),
       ('0000004', 'ghi', '0000001');
    
    -- tenta inserir ponteiro de chefe para código inexistente
    INSERT into Funcionário values ('0000005', 'qwerty', '8080808');
    
    -- tenta inserir ponteiro de chefe para o próprio funcionário
    INSERT into Funcionário values ('0000006', 'asdfg', '0000006');


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)


    Boa note pessoal,

    Eu quero criar uma tabela para armazenar clientes e funcionários e dependentes dos funcionários tudo em uma única tabela e vou chamá-la de pessoa, então pelo que eu li, seria o caso de um auto relacionamento para associar o dependente ao funcionário que está contido na mesma tabela? Vi isso em um sistema e achei uma forma interessante de organizar as informações no banco de dados sem a necessidade de criar várias tabelas uma para cada tipo de pessoa sendo que todas vão ter muitos campos semelhantes, mas eu não vi o banco de dados porque não tinha acesso então eu deduzi que estaria usando um auto relacionamento. Seria o caso?

    Agradeço desde já pela ajuda de todos vocês!

    • Editado LWMN terça-feira, 12 de agosto de 2014 01:44
    terça-feira, 12 de agosto de 2014 01:37
  • Deleted
    • Marcado como Resposta LWMN quinta-feira, 14 de agosto de 2014 00:10
    terça-feira, 12 de agosto de 2014 10:07
  • Deleted
    • Marcado como Resposta LWMN quinta-feira, 14 de agosto de 2014 00:10
    terça-feira, 12 de agosto de 2014 13:34
  • Wmn8,

    Existe em alguns casos onde é necessário criar uma estrutura hierárquia "pai-filho" na mesma tabela. 

    Este tipo de manipulação de dados, usando recursividade é comum para diversos vínculos de dados.

    Veja os links abaixo para maiores informações:

    http://msdn.microsoft.com/pt-br/library/ms174846.aspx

    http://social.technet.microsoft.com/wiki/pt-br/contents/articles/21698.t-sql-classificando-dados-em-uma-tabela-hierarquica-com-relacao-pai-filho.aspx

    http://technet.microsoft.com/pt-br/library/ms186243(v=sql.105).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Boa noite Durval, gostei das indicações, vão me ajudar bastante.

    Obrigado!

    • Marcado como Resposta LWMN quinta-feira, 14 de agosto de 2014 00:09
    quinta-feira, 14 de agosto de 2014 00:09
  • Considerando-se o código 2, eis dados para testes.

    -- código 3
    -- inclui funcionário JOÃO
    BEGIN TRANSACTION;
    
    INSERT into Pessoa values (1, 'JOÃO', 'endereço joão', 'localidade joão', null, null);
    
    set dateformat dmy;
    INSERT into Funcionário values ('0937109', 1, '12/5/2009');
    
    COMMIT TRANSACTION;
    
    
    -- inclui dependentes de JOÃO
    BEGIN TRANSACTION;
    INSERT into Pessoa values (2, 'PAULO', 'endereço paulo', 'localidade paulo', null, null);
    INSERT into Dependente values ('0937109', 2, 'F');
    COMMIT TRANSACTION;
    
    BEGIN TRANSACTION;
    INSERT into Pessoa values (3, 'MARIA', 'endereço maria', 'localidade maria', null, null);
    INSERT into Dependente values ('0937109', 3, 'F');
    COMMIT TRANSACTION;
    
    
    --inclui funcionária MARIA 
    BEGIN TRANSACTION;
    
    set dateformat dmy;
    INSERT into Funcionário values ('0170945', 3, '1/9/2012');
    
    COMMIT TRANSACTION;
    go
     

    Para visualizar os dados:

    -- código 4
    CREATE VIEW v_Funcionário as 
    SELECT F.ID as ID_Func, P.Nome, F.Data_admissão
      from Funcionário as F inner join
           Pessoa as P on F.ID_Pessoa = P.ID;
    go
    
    CREATE VIEW v_Dependente as 
    SELECT F.ID as ID_Func, P.Nome, D.ID_Dep,
           (SELECT Nome from Pessoa as P2 where P2.ID = D.ID_Dep) as Dependente
      from Funcionário as F 
           inner join Pessoa as P on F.ID_Pessoa = P.ID 
           inner join Dependente as D on D.ID_Func = F.ID;
    go
    
    -- lista pessoas
    SELECT *
      from Pessoa;
    
    -- lista funcionários
    SELECT Nome, ID_Func, Data_admissão
      from v_Funcionário;
    
    -- lista dependentes do funcionário JOÃO
    SELECT Nome as Funcionário, ID_Func, Dependente
      from v_Dependente
      where ID_Func = '0937109';


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)



    Boa noite, gostei das suas explicações e da sugestão referente a não colocar uma tabela única para dados de pessoas. Acho que já até falei com você sobre livros no Linkedin há um tempo atrás.

    Agradeço muito a sua ajuda e dos amigos que tiveram a boa vontade em estar compartilhando sugestões e conhecimento aqui.

    Obrigado mais uma vez!


    • Editado LWMN quinta-feira, 14 de agosto de 2014 00:14
    quinta-feira, 14 de agosto de 2014 00:13