Ir ao conteúdo

Problemas com foregin key


Visitante: Sulista

Posts recomendados

Visitante: Sulista
 
Postado

Tenho uma duvida.

Criei um bd no mysql, fiz os creates das tabelas exemplo no caso professor, aluno, pais.

Todas tabelas possuem id e nome.

Depois vi que todos possuiam telefones.

Então criei :

tabela telefone

id int primary key not null auto_increment,

id_professor int not null,

id_aluno int not null,

id_pai int not null

...

Agora sei q esta tabela telefone esta errada pois não posso deixar as fk em branco.

Como vou identificar o telefone de cada aluno, cada professor sendo que existem varios alunos e varios professores e varios pais. e todos podem ter mais de um numero telefonico. ???

Obrigado

**correção foregn key

Postado

Na minha visão tem 3 caminhos: (acredito que o mais correto seja a primeira forma (a segunda é muito usada tb), mas.....cada um sabe o que faz ^^)

tabelas:
aluno(idaluno,nome)
professor(idprofessor,nome)
telefone(idtelefone,telefone)
telefone_aluno(idtelefone,idaluno)
telefone_professor(idtelefone,idprofessor)

ou

tabelas:
aluno(idaluno,nome)
professor(idprofessor,nome)
telefone(idtelefone,telefone)

telefone_registro( idtelefone
,tipo //1=registro de aluno, 2 = registro do professor
,id_registro //id do aluno ou do professor
)

ou

tabelas:
aluno(idaluno,nome,telefone1,telefone2,telefone3,telefone4)
professor(idprofessor,nome,telefone1,telefone2,telefone3,telefone4)

Visitante: Sulista
 
Postado

Erciley Junior Obrigado pela ajuda tche!!!

Cara queria evitar criar varias tabelas para telefone, acho q não é o mais correto!

tabelas:
aluno(idaluno,nome)
professor(idprofessor,nome)
telefone(idtelefone,telefone)
telefone_aluno(idtelefone,idaluno)
telefone_professor(idtelefone,idprofessor)

Acho que esta esta melhor apresar de não ter testado ainda no tipo utilizo um enum??

Como chamo isto depois no select? pelo int ou pela string?

tabelas:
aluno(idaluno,nome)
professor(idprofessor,nome)
telefone(idtelefone,telefone)

telefone_registro( idtelefone
,tipo //1=registro de aluno, 2 = registro do professor
,id_registro //id do aluno ou do professor
)

Essa ficaria muitos campos null na tabela e não é legal né

tabelas:
aluno(idaluno,nome,telefone1,telefone2,telefone3,telefone4)
professor(idprofessor,nome,telefone1,telefone2,telefone3,telefone4)

Postado

Opa Sulista.

Então, leiam bem a terceira opção, e quando você ver algo assim, sai xingando hehehe (se bem que é a forma mais fácil para você retornar em um select)

Na segunda opção, eu criaria a tabela "telefone_registro" com os campos:

---idtelefone FK da tabela telefone

---idexterno que seria gravado o id do aluno ou do professor

---tipo, este campo eu criaria como varchar(01) ou numérico (ou o próprio ENUM)

------sendo varchar, gravaria sempre o caracter "A" quando o registro fosse de aluno, e o caracter "P" quando o registro fosse de professor.

Com essa estrutura, o select para retornar os vários telefone de um mesmo aluno, por exemplo, seria:

SELECT IDALUNO
,NOME
,GROUP_CONCAT(TELEFONE SEPARATOR ', ')
FROM ALUNO
INNER JOIN TELEFONE_REGISTRO AS TR ON IDEXTERNO = IDALUNO AND TIPO = 'A'
INNER JOIN TELEFONE AS TEL ON TEL.IDTELEFONE = TR.IDTELEFONE
GROUP BY IDALUNO;

Fugindo do assunto: É por essa escrita com um monte de campo com o mesmo nome em tabelas diferentes, que eu prefiro criar nome de campo e tabelas com ALIAS, pelo menos não tem essa complicação.

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...