Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[DUVIDA] - Relacionamento de tabelas nest

Olá gente, estou criando um sisteminha de agendamento simples, onde terá o agendamento com data e hora e o servico que o cliente colocara nesse agendamento.

Porem estou com uma duvida no relacionamento

Esta é meu relacionamento na minha tabela agendamento

@OneToMany(() => Servico, (servico) => servico.agendamento)
        servico: Servico[];

Onde um agendamento pode receber varios serviços, correto?

e aqui a tabela servico

@ManyToOne(() => Agendamento, (agendamento) => agendamento.servico, {
            onDelete: "CASCADE",
        })
        agendamento: Agendamento;

Onde varios servicos podem receber apenas um agendamento e ao excluir esse serviço eu excluo o agendamento, correto?

Então, ao meu ver se eu estou certo ate aqui porque minha chave estrangeira fica na tabela serviço? E no Insomnia eu preciso colocar o Id do agendamento na criação do serviço e não o contrario (que na minha cabeça era para ser o correto)

Minha duvida é mais conceitual mesmo, porque se eu estou relacionando correto, era para eu criar o serviço, ficar la e quando eu criar um agendamento associar ao serviço? Não era para ser o contrario, correto?

2 respostas
solução!

Olá Igor.

Tudo nbem

Vou tentar explicar e detalhar alguns pontos sobre o relacionamento entre as tabelas Agendamento e Servico.

  1. Relacionamento One-to-Many (Um para Muitos):

    • No seu código, você definiu que um Agendamento pode ter vários Servicos:
      @OneToMany(() => Servico, (servico) => servico.agendamento)
      servico: Servico[];
      
    • E que um Servico pertence a um Agendamento:
      @ManyToOne(() => Agendamento, (agendamento) => agendamento.servico, {
          onDelete: "CASCADE",
      })
      agendamento: Agendamento;
      
  2. Chave Estrangeira:

    • A chave estrangeira (agendamentoId) fica na tabela Servico porque é assim que o relacionamento Many-to-One funciona. Cada serviço precisa saber a qual agendamento pertence, e isso é feito armazenando o agendamentoId na tabela Servico.
  3. Criação e Associação:

    • Quando você cria um Servico, você precisa associá-lo a um Agendamento existente, por isso você precisa fornecer o agendamentoId ao criar um Servico.
    • Se fosse o contrário (um serviço podendo ter vários agendamentos), a chave estrangeira estaria na tabela Agendamento.

Exemplo Prático:

  • Criando um Agendamento:

    POST /agendamentos
    {
      "data": "2023-10-01",
      "hora": "14:00"
    }
    
  • Criando um Serviço e associando a um Agendamento:

    POST /servicos
    {
      "nome": "Corte de cabelo",
      "agendamentoId": 1
    }
    

Conceito:

  • One-to-Many: Um Agendamento pode ter vários Servicos. Portanto, a tabela Servico precisa saber a qual Agendamento pertence, daí a necessidade da chave estrangeira agendamentoId na tabela Servico.

Espero ter ajudado e bons estudos!

Perfeito, eu ja havia entendido isso, e que na minha cabeça n faz mt sentido a chave estar em serviço. Porque pra mim o agendamento que precisa ter um serviço e não o contrario, mas obrigado de vdd pela resposta. Vou tentar abstrair isso por enquanto e seguir o aprendizado

Obrigado