Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hewitt

Como ter mais de um aluno no BD?

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.