none
1 campo relacionado com 2 tabelas ? RRS feed

  • Pergunta

  • Pessoal, boa tarde.

    Iremos criar um sistema que deve gerenciar a contratação de pacotes de serviços de uma determinada empresa.
    Cada pacote possui 1 ou mais serviços associados e cada serviço possui N informações que precisam ser salvas no banco.

    Exemplo : 

    tabela pacote :
    pacote_id
    cliente_id
    vencimento

    tabela pacote_servicos

    pacoteServicos_id
    pacote_id
    Servico_id

    Servico

    servico_id
    campo X
    campo Y

    O problema é o seguinte : o serviço vinculado a um pacote pode ser de N tipos e cada tipo precisaria ao meu ver ter sua propria tabela pois são campos completamente diferentes.. Exemplo de serviços : Host , email marketing, desenvolvimento de banner.
    Se cada um possui sua própria tabela, como eu iria vincular estas tabelas com a tabela pacoteServicos ?

    Da forma que fiz acima a pacote-servico estaria sempre vinculada a um serviço, mas e no meu caso que cada "serviço" seria uma tabela diferente ? Mesmo que eu tenha a tabela serviço para manter os dados em comum de todos os serviços,a tabela serviço teria algum campo que ligaria cada um deles a sua tabela de detalhamento e da mesma maneira ocorreria o problema de um mesmo campo precisar estar ligado a duas tabelas.

    Gostaria do auxilio de vocês para ver me informarem onde estou errando ou como contornar o problema.

    Agradeço

    Rafael

    terça-feira, 27 de outubro de 2015 17:52

Respostas

  • Rafael,

    Concordo com a sua observação como você possui informações que podem variar de um serviço para outro, neste caso, seguindo as melhores práticas de banco de dados é recomendável que seja criada uma entidade específica para cada caso.

    Em relação a como você vai o que você poderia fazer é criar dois campos um guardando o código do serviço e outro o tipo de serviço, desta forma, você vai poder ter em uma tabela que conterá estes relacionamentos o código do serviço se repetindo, mas o tipo será único para cada serviço.

    Acho que este pode ser um caminho inicial.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta SimorC terça-feira, 27 de outubro de 2015 18:02
    • Marcado como Resposta Marcos SJ quarta-feira, 28 de outubro de 2015 12:11
    terça-feira, 27 de outubro de 2015 18:00

Todas as Respostas

  • Rafael,

    Concordo com a sua observação como você possui informações que podem variar de um serviço para outro, neste caso, seguindo as melhores práticas de banco de dados é recomendável que seja criada uma entidade específica para cada caso.

    Em relação a como você vai o que você poderia fazer é criar dois campos um guardando o código do serviço e outro o tipo de serviço, desta forma, você vai poder ter em uma tabela que conterá estes relacionamentos o código do serviço se repetindo, mas o tipo será único para cada serviço.

    Acho que este pode ser um caminho inicial.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta SimorC terça-feira, 27 de outubro de 2015 18:02
    • Marcado como Resposta Marcos SJ quarta-feira, 28 de outubro de 2015 12:11
    terça-feira, 27 de outubro de 2015 18:00
  • Pedro,

    o problema é como realizar os relacionamentos disso ?

    O segundo campo para identificar o tipo do serviço realmente precisa existir, mas e como eu eu faria um join entre a tabela pacote e os serviços se só os de tipo 1 seriam com a tabela XXX e o dos tipo 2 seriam da tabela YYY.

    Pelo que percebo existem duas opções para este caso. A primeira é trabalhar como você disse,mas neste caso eu não poderia ter relacionamento entre as tabela, podendo eventualmente excluir um registro e deixar o banco quebrado. 
    A segunda opção seria ter uma tabela chamada serviço, com N campos sem pré-definição e usá-los conforme a necessidade de cada serviço..

    Estou certo ?
    terça-feira, 27 de outubro de 2015 20:53
  • Rafael, 

    voce poderia guardar esses dados da tabela serviço de forma serializada 
    em um campo XML.

    Pelo que entendi, somente a chave servico_id, seria relacionada nas queryes,
    estes dados podem ser então desserializados e processados em execução...
    terça-feira, 27 de outubro de 2015 21:18
  • Rafael,

    Sim, você esta certa, de alguma forma você terá que estabelecer um relacionamento entre todas as entidades para que no momento que sua query principal for buscar os dados você teria todas as possíveis forma de buscar e relacionar estes dados.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 30 de outubro de 2015 15:30
  • Pedro,

    A solução que estou testando e que parece que vai dar certo é que as diferenças dos serviços se tornaram linhas e não campos.

    Exemplo : 
    Servico_id = 1 
    servico_nome = host

    Servico_id = 2 
    servico_nome = email marketing

    E uma tabela 

    Servico_recursos

    servico_id = 1
    recurso_nome = servidor
    recurso_valor = "teste.com.br"

    seria mais ou menos como windows faz em muitos casos para armazenar propriedades de N recursos.

    Agora estamos realizando uma série de testes para ver se isso vai funcionar legal.

    sexta-feira, 30 de outubro de 2015 21:22