Hewitt 14 Denunciar post Postado Agosto 5, 2016 Galera, boa tarde. Estou desenvolvendo um sisteminha pra uma academia. Estou com dúvida no banco de dados... como faria esse relacionamento?? Um professor pode ter vários alunos, mas um aluno só pode ter um professor. O banco de dados dos alunos está assim: alunos Coluna Tipo id_aluno int(11) id_professor int(11) nome_aluno varchar(200) email varchar(200) senha varchar(200) ativo enum('0', '1') Vincular o aluno ao professor é simples, mas como faria esse vínculo do professor aos alunos? Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Agosto 5, 2016 Na realidade você só mudará a query, o vínculo já foi feito com a sua modelagem, outra solução é usar três tabelas: 1 - professores 2 - alunos 3 - vinculo -> Aqui você faria a vinculação entre a tabela 1 e 2. Compartilhar este post Link para o post Compartilhar em outros sites
Hewitt 14 Denunciar post Postado Agosto 5, 2016 Mas teria como eu fazer na minha modelagem, ou o mais simples (ou correto) é nesse segundo exemplo? E no caso, nesse 2º exemplo, seriam só 3 campos? id_vinculo / id_professor / id_aluno ? Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Agosto 5, 2016 Edit:Qnd montei o exemplo não tinha a estrutura de tabela.... Mas o exemplo ta ai haha Abraços -------- Precisa de uma tabela auxiliar. Aluno Professor Alun_Prof (ou algo assim cada um tempo um padrão, ou a galera segue um tipo) Nessa tabela auxiliar você cadastra os id para fazer a relação. Se liga fiz um exemplo pra ti: CREATE DATABASE academia_imaster; USE academia_imaster; CREATE TABLE aluno( id INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT ,nome varchar(250) ); INSERT INTO aluno (nome) values ('Jose'); INSERT INTO aluno (nome) values ('Beraldo'); INSERT INTO aluno (nome) values ('Marcos'); CREATE TABLE professor( id INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT ,nome varchar(250) ); INSERT INTO professor (nome) values ('Rogerio'); INSERT INTO professor (nome) values ('Robevaldo'); CREATE TABLE professor_aluno( id INT(8) NOT NULL PRIMARY KEY AUTO_INCREMENT ,professor_id INT(8) not null ,aluno_id INT(8) not null ,FOREIGN KEY (professor_id) REFERENCES professor(id) ,FOREIGN KEY (aluno_id) REFERENCES aluno(id) ); INSERT INTO professor_aluno (professor_id, aluno_id) VALUES (1, 1); /* José é Aluno de Rogerio */ INSERT INTO professor_aluno (professor_id, aluno_id) VALUES (1, 2); /* Beraldo é Aluno de Rogerio */ INSERT INTO professor_aluno (professor_id, aluno_id) VALUES (2, 3); /* Marcos é Aluno de Robevaldo */ select * from professor_aluno where professor_id = 2; /* Tá legal.. o retorno ta beleza.. sabemos que o id na tabela professor 2 é o Robevaldo e o seu aluno é o Marcos (id = 3)... mas queremos trazer o nome... +----+--------------+----------+ | id | professor_id | aluno_id | +----+--------------+----------+ | 5 | 2 | 3 | +----+--------------+----------+ */ /* nesse caso só fazer um JOIN */ select * from professor_aluno LEFT JOIN professor ON ( professor_aluno.professor_id = professor.id ) where professor_id = 2; /* +----+--------------+----------+------+-----------+ | id | professor_id | aluno_id | id | nome | +----+--------------+----------+------+-----------+ | 5 | 2 | 3 | 2 | Robevaldo | +----+--------------+----------+------+-----------+ Legal mas vamos trazer só os resultados que interessa, no caso Nome do professor... */ select professor.nome ,aluno_id from professor_aluno LEFT JOIN professor ON ( professor_aluno.professor_id = professor.id ) where professor_id = 2; /* +-----------+----------+ | nome | aluno_id | +-----------+----------+ | Robevaldo | 3 | +-----------+----------+ 1 row in set (0.04 sec) Pra finalizer só trazer o nome do aluno... só mais um Joinzin e ta show... */ select professor.nome ,aluno.nome from professor_aluno LEFT JOIN professor ON ( professor_aluno.professor_id = professor.id ) LEFT JOIN aluno ON ( professor_aluno.aluno_id = aluno.id ) where professor_id = 2; /* +-----------+--------+ | nome | nome | +-----------+--------+ | Robevaldo | Marcos | +-----------+--------+ 1 row in set (0.06 sec) Agora só testar com o outro professor (id = 1) */ select professor.nome ,aluno.nome from professor_aluno LEFT JOIN professor ON ( professor_aluno.professor_id = professor.id ) LEFT JOIN aluno ON ( professor_aluno.aluno_id = aluno.id ) where professor_id = 1; /* +---------+---------+ | nome | nome | +---------+---------+ | Rogerio | Jose | | Rogerio | Beraldo | +---------+---------+ 2 rows in set (0.00 sec) Perfeito.... enfim espero que tenha rolado legal pra ti... */ Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Agosto 5, 2016 A relação é bilateral. No banco você sabe qual é o professor de cada aluno e sabe quais são os alunos de cada professor (basta passar o ID do professor no WHERE) Mais sobre relacionamentos de tabelas: http://forum.imasters.com.br/topic/140816-mini-tutorial-de-mysql/ http://rberaldo.com.br/categorias-e-subcategorias-exemplo-de-modelagem/ Compartilhar este post Link para o post Compartilhar em outros sites
gabrieldarezzo 255 Denunciar post Postado Agosto 5, 2016 Beraldo, não tinha pensando na possibilidade da relação bilateral. Mas caso tenha varias aulas, ela ainda atende? Ex: Professor Jose, Aluno João, Aula de Geometria. Professor Jose, Aluno João, Aula de Matemática. Compartilhar este post Link para o post Compartilhar em outros sites
Hewitt 14 Denunciar post Postado Agosto 5, 2016 Obrigado a todos que postaram! Vou usar o exemplo do gabrieldarezzo! Compartilhar este post Link para o post Compartilhar em outros sites