Olá pessoal. Estou fazendo o modelo conceitual para um pequeno projeto que é um sistema para gestão de escolas.
Tenho uma entidade aluno onde o aluno terá um dado de contato, este contato poderá ser e-mail, celular, telefone. Dependendo do que a pessoa que for cadastrar o contato escolher.
Minha dúvida é a seguinte, para modelar um contato seria mais correto:
1- criar na entidade aluno dois atributos multivalorados sendo um para o tipo de contato e outro para contato. Assim ao gerar o modelo lógico teria uma tabela para cada atributo.
Ou
2 - criar uma entidade contato com os atributos tipo de contato e o próprio contato e, relacionar está entidade com a entidade aluno.
Qual destas é a forma correta, ou se tiver outra forma gostaria da opinião de vocês
Acho que o mais “correto” vai depender do seu projeto.
Para a matéria de banco de dados da faculdade, vai de número 2. Com atributos multivalorados já perdeu pontos na normalizaçao do banco.
Em um projeto de verdade, vai ser interessante analisar como usaria esse dado na prática.
Se a única forma de consultar esse dado é quando abrir o cadastro de um aluno específico (provável*), entao poderia jogar num simples campo multivalorado, com chave e valor e pronto. Com o suporte a json nos bancos de dados mais modernos, venho pegando mais gosto por essa prática.
Se tiver uma consulta pelo contato em si (muito improvável*), daí vale a pena ter a segunda tabela novamente.
De qualquer forma, na vida real, essas decisoes nao precisam estar certas de cara. Você consegue mudar de uma para outra com algum esforço, se alguma delas se provar totalmente errada.
- O nível de probabilidade aqui foi decidido baseado no meu conhecimento do domínio de softwares de gestao escolar que é basicamento zero.
Os dados de contato serão apenas para consulta, caso um usuário do sistema queira visualizar os contatos de um aluno.
Eu cheguei a pensar em utilizar a segunda opção por fazer uma melhor separação dos dados de contato e dos dados pessoais do aluno.
Aí neste caso ficaria uma entidade contato com um atributo simples para identificar o tipo de contato e outro atributo multivalorado para o contato em si.
Correto?
Sim, tudo depende de como modelar seus contatos.