none
Chave Primária Composta com Chave Estrangeira RRS feed

  • Pergunta

  • Olá pessoal,

     

    Sei que aui não é o lugar especifico para o meu tipo de dúvida mas acho que podem ajudar.

    Gostaria de saber se uma chave estrangeira em uma tabela necessariamente faz parte da chave primária.

    Por exemplo na imagem anexa A tabe Titulo de Sócio possui o ID_TITULO juntamente com o ID_SOCIO como PK composta

    e o ID_PLANO e ID-VENDEDOR como FK vindas das tabelas VENDEDOR e PLANOS.

    Pelo que aprendi uma tabela normalizada deve conter apenas campos que dependem da chave. 

     

    Se puderem ajudar obrigado!

     


    Rodrigo Rocha
    • Movido Gustavo Maia Aguiar sábado, 28 de janeiro de 2012 20:10 (De:SQL Server - Infra Geral)
    quarta-feira, 25 de janeiro de 2012 19:50

Respostas

  • Rodrigo

    uma chave estrangeira não é obrigatoria fazer parte da PK, veja alguns exemplos

    tbCidade                                tbCliente                              
    idCidade   int  (PK)                 idCLiente   int  (PK)               
    nmCidade varchar(60)           nmCliente  varchar(60)          
                                                  idCidade    int (FK tbCidade)


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 26 de janeiro de 2012 11:24
    Moderador
  • Rodrigo,

    Não é obrigatório não, independente de você ter dois ou três campos na PK você poderá utilizar somente um no seu relacionamento.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quinta-feira, 26 de janeiro de 2012 12:12
  • Boa Tarde,

    Fisicamente não há nada que force isso. Do ponto de vista de normalização, se o ID Titulo já for único, a coluna ID_Socio não deveria compor a chave primária, pois, segundo a 2FN, não devemos ter atributos com dependência parcial da chave, e se o ID Titulo for único, nós teríamos dependências parciais de todas as demais colunas. Se ID_Titulo for única eu sugiro retirar ID_Socio da chave para manter o índice da PK mais estreito evitando desperdício de espaço.

    Ainda assim, não dá pra dizer que está errado. Se o ID_Socio está na tabela, automaticamente deduz-se que um sócio pode ter vários títulos. Se a coluna ID_Titulo não for única e relacionar-se ao número do título daquele sócio e admitir repetição (digamos 1,1 ; 2,1 ; 3,1 ; 1,2 ; 2,2 ; etc), a modelagem está correta. Entretanto, se esse for o caso, para fins de otimização, faria mais sentido que a coluna ID_Socio ficasse na frente de ID_Titulo.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    sábado, 28 de janeiro de 2012 20:10

Todas as Respostas

  • Rodrigo

    uma chave estrangeira não é obrigatoria fazer parte da PK, veja alguns exemplos

    tbCidade                                tbCliente                              
    idCidade   int  (PK)                 idCLiente   int  (PK)               
    nmCidade varchar(60)           nmCliente  varchar(60)          
                                                  idCidade    int (FK tbCidade)


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 26 de janeiro de 2012 11:24
    Moderador
  • Rodrigo,

    Não é obrigatório não, independente de você ter dois ou três campos na PK você poderá utilizar somente um no seu relacionamento.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quinta-feira, 26 de janeiro de 2012 12:12
  • Boa Tarde,

    Fisicamente não há nada que force isso. Do ponto de vista de normalização, se o ID Titulo já for único, a coluna ID_Socio não deveria compor a chave primária, pois, segundo a 2FN, não devemos ter atributos com dependência parcial da chave, e se o ID Titulo for único, nós teríamos dependências parciais de todas as demais colunas. Se ID_Titulo for única eu sugiro retirar ID_Socio da chave para manter o índice da PK mais estreito evitando desperdício de espaço.

    Ainda assim, não dá pra dizer que está errado. Se o ID_Socio está na tabela, automaticamente deduz-se que um sócio pode ter vários títulos. Se a coluna ID_Titulo não for única e relacionar-se ao número do título daquele sócio e admitir repetição (digamos 1,1 ; 2,1 ; 3,1 ; 1,2 ; 2,2 ; etc), a modelagem está correta. Entretanto, se esse for o caso, para fins de otimização, faria mais sentido que a coluna ID_Socio ficasse na frente de ID_Titulo.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    sábado, 28 de janeiro de 2012 20:10
  • Gustavo,

     

    Obrigado era exatamente isso que eu precisava entender. No meu exercício o sócio pode mesmo ter mais de um título mas um título só pode pertencer a um sócio.

     

    Obrigado!


    Rodrigo Rocha
    sábado, 28 de janeiro de 2012 23:23
  • Junior,

     

    Entendi, eu posso ter uma FK em uma tabela e ela pode ou não fazer parte da minha PK e isso vai depender da minha necessidade de manter a unicidade das linhas.


    Rodrigo Rocha
    sábado, 28 de janeiro de 2012 23:27
  • Obrigado,

     

    Já estou entendendo como funciona!

     

    Valeu!


    Rodrigo Rocha
    sábado, 28 de janeiro de 2012 23:28