Estou utilizando o DBDesigner 4 para modelar o bando de dados de uma escola de idiomas (trabalho de faculdade)
Queria saber como que eu vou fazer para modelar uma tabela de uma Questão de Assinalar com o seguintes atributos:
Código da Questão
Pergunta?
a) resposta 1
b) resposta 2
c) resposta 3
d) resposta 4
nuam sou bom com essa questao de modelagem nuam mas eu faria uma tabela só para respostas e na tebela que tem a pergunta teria apenas o ID da resposta selecionada!
Pergunta 1 - N Alternativas… ou seja, uma pergunta pode ter N alteranativas…
Pergunta pergunta = new Pergunta(“Qual a cor do cavalo branco de napoleao?”);
Alternativa alternativa1 = new Alternativa(pergunta,“Preto”);
Alternativa alternativa2 = new Alternativa(pergunta,“Branco”);
Alternativa alternativa3 = new Alternativa(pergunta,“Azul”);
Alternativa alternativa4 = new Alternativa(pergunta,“Marrom”);
Alternativa alternativa1 = new Alternativa(pergunta,“Lilais”);
ou seja… 1 pergunta pode ter 109232138123201809 alterantivas…
Eu faria uma tabela de perguntas e uma tabela de respostas, sendo que o relacionamento seria de 1:N, ou seja, 1 pergunta teria N respostas, nas tabelas você teria na tabela de respostas o id da pergunta correspondente.
Um dos campos da resposta indicaria se é a resposta correta.
Nas classes acho que seria algo assim:
@Entity
class Pergunta {
@Id
private Long id;
private String descricao;
@OneToMany(mappedBy="resposta")
private List<Resposta> respostas;
....
}
@Entity
classe Resposta {
@Id
private Long id;
private String descricao;
private Boolean respostaCerta;
@ManyToOne
private Pergunta pergunta;
Fiz o código direto aqui no post, então não deve ter erros aí de sintaxe.
vc pode tabem guardar o codigo da alternativa correta dentro da PERGUNTA…
falando em termos de tabela ficaria assim
[code]
TABLE PERGUNTA
int ID (PK)
varchar TEXTO
int CORRETO_ID (FK para tabela ALTERNATIVA, contendo o id da alternativa correta)
TABELA ALTERNATIVA
int ID (PK)
int PERGUNTA_ID (FK para a tabela PERGUNTA, contendo o id da pergunta a qual esta alternativa esta ligada)
varchar TEXTO
Pergunta pergunta => "select pergunta where id = 1";
List<Alternativa> alternativas => vc usa "select alternativa where pergunta_id = 1";
System.out.println(pergunta);
for (Alternativa alternativa : alternativas) {
if (pergunta.getCorreto().equals(alternativa))
System.out.print("CORRETA =>");
System.out.println(alternativa);
}[/code]
…
Se vc quer saber quanto a resposta de alguem vc faz…
buthy, esse problema não é difícil de responder. Como é um exercício, recomendo que você faça sozinho pra treinar, ao invés de perguntar aqui no fórum. Você precisa treinar seu raciocínio porque esse tipo de problema é recorrente no mercado…
Quando você diz que poderia guardar o codigo da alternativa correta na pergunta, quer dizer que na tabela Pergunta teria um “id_resposta_correta” ?
Fiquei confuso, porque na tabela Alternativa já não teria um “id_pergunta” para saber a qual pergunda determinada alternativa pertence ?
Seria algo assim:
TB_PERGUNTA
id_pergunda (PK)
id_alternativa_correta (FK de TB_ALTERNATIVA)
…
TB_ALTERNATIVA
id_alternativa (PK)
id_pergunta (FK da TB_PERGUNTA)
…
Me parece estranho na hora de persistir isso… quem vai existir primeiro ? O ovo ou a galinha ?
Na hora que você vai salvar a pergunta, vc tem que saber qual a alternativa correta para salvar em “id_alternativa_correta”, mas na hora que você vai salvar a alternativa, você precisa da pergunta a que ela pertence…
A nãos que faça em duas etapas, crie perguntas, crie respostas e depois relacione…
Eu prefiro a opção:
TB_PERGUNTA
id_pergunta (PK)
…
TB_ALTERNATIVA
id_alternativa (PK)
id_pergunta (FK da TB_PERGUNTA)
alternativaCorreta ( True or False)
Além do que com essa modelagem é possível atender a necessidade de pergunta com multiplas escolhas…
Por favor, não leve a mal meu comentário, só queria entender como seria a solução que você sugeriu, acho interessantes analisar todas as opções…
Voltando a sua solução… nesse caso, para cadastrar uma pergunta, você teria que:
-Cadastrar a pergunta (sem a resposta correta)
-Cadastrar as respostas (inclusive a certa)
-Relacionar a pergunda com a resposta correta
mas nessa outra alternativa, mas nesta outra vc abre espaco para multiplas respostas, e se essa for uma intencao sua, entao sem problemas… essa segunda alternativa seria…
[code]
Pergunta
id
texto
Alternativa
id
pergunta_id
texto
isCorreto[/code]
ai nesse caso, vc pode acabar tendo em uma pergunta mais de uma resposta correta …
Essa me interessou…
Quer dizer que com insertable false eu não preciso persistir as alternativas no banco antes de setar a alternativa correta na pergunta ?
Estou perguntando porque se na pergunta temos uma fk “id_alternativa_correta” que aponta para uma das alternativas que foram gravadas no passo anterior, isso não iria gerar um erro no banco ?
Explicando melhor, eu vou setar uma alternativa correta que ainda nao existe no banco la na TB_ALTERNATIVAS.
@Length(min=2,max=150) @NotEmpty
public String getTexto() {}
@OneToOne @JoinColum(insertable=false)
public Alternativa getResposta() {}
//setters
//equals/hashcode
//toString
}[/code]
pronto… assim vc pode fazer
[code]
pergunta.setRespota(correta);
repository.add(pergunta); //aqui ele adiciona a pergunta, e não da erro se a certa já estiver setado.
repository.addAll(alternativas);
repository.marge(pergunta);[/code]
Olha O modelo relacional deve ficar assim ou parecido com esse apenas mudando os nomes dos campos para nomes identicos ou equivalentes.
tabela pergunta
id_pergunta
pergunta
tabela respostaPergunta
id_respostaPergunta
id_pergunta
resposta
alinea(a,b,c,d,e,)
eVerdadeira ( boolean – se a resposta é verdadeira ou falsa)
Na minha opinião o modelo relacional certo é esse.
agora vou dar uma breve explicação
temos a tabela pergunta onde vamos postar as diferentes perguntas.
Agora na tabela respostaPergunta, temos as respostas das perguntas, temos o id_pergunta ( codigo da pergunta), temos a alinea ( se a resposta é a alinea a,b,c,d), temos eVerdadeira( para saber se a resposta é verdadeira ou falsa).
o campo eVerdadeira ( do tipo boolean) serve para identificar se esta resposta é verdadeira ou falsa, tendo em conta que para uma pergunta podera ter mais que uma alinea verdadeira.
desta forma podemos ter perguntas com mais de uma resposta verdadeira do estilo da certificação scjp