none
PK Composta e campo virtual...

    Question

  • Olá...Td bem...Peço q desculpem minha duvida que para voces pode ser algo muuito simples, mas estou começando agora a utilizar BD entao estou tendo certa dificuldade...

    Vejam,  um relacionamento MxN deve gerar uma nova table,correto?...No caso, só pra testar criei uma Table 'Time' e outra 'Torcedor' (MxN) que gera uma nova table Time_Torcedor. Esta nova table contém a PK das outras tabelas(time,Torcedor), formando uma Pk Composta. Como no exemplo abaixo:

    create table Time_Torcedor(
    cod_time int not null,
    cod_torcedor int not null,
    constraint pk_comp_timetorcedor primary key(cod_time,cod_torcedor),

    )

    Como faço para ligar estes campos com os das tabelas anteriores, ex: o 'cod_time' desta tabela com o 'cod_time' da Tabela 'Time'?....

    E depois como posso acessar informações da Tabela 'Time',(por exemplo, ou outros atributos q a tabela 'Time' tem), utilizando a Tabela com a Pk-Composta(Time_Torcedor)?

     Obrigado pela Atenção, Aguardo ansiosamente a resposta de vocês...


    Saturday, April 06, 2013 2:17 PM

Answers

  • Me parece que não seria um relacionamento MxN mas sim 1:N. Afinal, em princípio uma pessoa somente torceria por um time. Mas, se está assumindo que uma pessoa pode torcer por vários times (cidades diferentes, provavelmente) e, obviamente (espera-se!), um time possua vários torcedores, então uma forma de implementar isso é criando a terceira tabela (relacionamento), denominada por você de Time_Torcedor.

    if OBJECT_ID('Time_Torcedor','U') is not null drop table Time_Torcedor;
    if OBJECT_ID('Time','U') is not null drop table [Time];
    if OBJECT_ID('Torcedor','U') is not null drop table Torcedor;
    
    create table [Time] (
      Cod_Time int not null
           constraint Time_porCod primary key clustered,
      Nome_Time varchar(30) not null,
      outros_atributos varchar(200)
    );
    
    create table Torcedor (
      Cod_Torcedor int not null
           constraint Torcedor_porCod primary key clustered,
      Nome_Torcedor varchar(30) not null,
      outros_atributos varchar(200)
    );
    
    create table Time_Torcedor (
      cod_TimeTorc int identity,
      Cod_Time int not null references [Time] (Cod_Time),
      Cod_Torcedor int not null references Torcedor (Cod_Torcedor),
      outros_atributos varchar(200)
    );
    create clustered index Time_Torcedor_porTime 
         on Time_Torcedor(Cod_Time);
    create nonclustered index Time_Torcedor_porTorc 
         on Time_Torcedor(Cod_Torcedor) include (Cod_Time);

    Para listar todo o conteúdo do relacionamento, buscando informações complementares nas tabelas Time e Torcedor:
    select Ti.Nome_Time, Ti.Cod_Time, [To].Nome_Torcedor, TT.outrosatributos,
           Ti.outros_atributos, 
           [To].outros_atributos
      from Time_Torcedor as TT inner join
           [Time] as Ti on TT.Cod_Time=Ti.Cod_Time inner join
           Torcedor as [To] on TT.Cod_Torcedor=[To].Cod_Torcedor
      order by Nome_Time, Ti.Cod_Time, Nome_Torcedor


    • Edited by Jose.Diz Sunday, April 07, 2013 10:31 AM (consulta modifificada para tratar times homônimos)
    • Marked as answer by Felipo GonçalvesModerator Tuesday, April 09, 2013 3:13 PM
    Saturday, April 06, 2013 11:32 PM

All replies

  • Me parece que não seria um relacionamento MxN mas sim 1:N. Afinal, em princípio uma pessoa somente torceria por um time. Mas, se está assumindo que uma pessoa pode torcer por vários times (cidades diferentes, provavelmente) e, obviamente (espera-se!), um time possua vários torcedores, então uma forma de implementar isso é criando a terceira tabela (relacionamento), denominada por você de Time_Torcedor.

    if OBJECT_ID('Time_Torcedor','U') is not null drop table Time_Torcedor;
    if OBJECT_ID('Time','U') is not null drop table [Time];
    if OBJECT_ID('Torcedor','U') is not null drop table Torcedor;
    
    create table [Time] (
      Cod_Time int not null
           constraint Time_porCod primary key clustered,
      Nome_Time varchar(30) not null,
      outros_atributos varchar(200)
    );
    
    create table Torcedor (
      Cod_Torcedor int not null
           constraint Torcedor_porCod primary key clustered,
      Nome_Torcedor varchar(30) not null,
      outros_atributos varchar(200)
    );
    
    create table Time_Torcedor (
      cod_TimeTorc int identity,
      Cod_Time int not null references [Time] (Cod_Time),
      Cod_Torcedor int not null references Torcedor (Cod_Torcedor),
      outros_atributos varchar(200)
    );
    create clustered index Time_Torcedor_porTime 
         on Time_Torcedor(Cod_Time);
    create nonclustered index Time_Torcedor_porTorc 
         on Time_Torcedor(Cod_Torcedor) include (Cod_Time);

    Para listar todo o conteúdo do relacionamento, buscando informações complementares nas tabelas Time e Torcedor:
    select Ti.Nome_Time, Ti.Cod_Time, [To].Nome_Torcedor, TT.outrosatributos,
           Ti.outros_atributos, 
           [To].outros_atributos
      from Time_Torcedor as TT inner join
           [Time] as Ti on TT.Cod_Time=Ti.Cod_Time inner join
           Torcedor as [To] on TT.Cod_Torcedor=[To].Cod_Torcedor
      order by Nome_Time, Ti.Cod_Time, Nome_Torcedor


    • Edited by Jose.Diz Sunday, April 07, 2013 10:31 AM (consulta modifificada para tratar times homônimos)
    • Marked as answer by Felipo GonçalvesModerator Tuesday, April 09, 2013 3:13 PM
    Saturday, April 06, 2013 11:32 PM
  • Muito obrigado Jose Diz. Vc me ajudou bastante, obrigado mesmo!!
    Sunday, April 07, 2013 9:40 PM