Ajuda para modelar banco - Como fazer "questão de assinalar"?

Dae galera

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

sendo que a resposta correta vai ficar variando…

Obrigado

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!

[code]Tablea Pergunta
id
propriedades

Tabela Alternativas
id
pergunta_id
descricao[/code]

faz assim

não sei se entendi
ficaria assim então:

:S

(ignorem a parte do som e imagem)

nao!

ficaraia assim

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…

[code]
Pergunta {
Integer id;
String texto;
Alternativa correta;
}

Alternativa {
Integer id;
Pergunta pergunta;
String texto;
}[/code]

para um baco relacional vc vai apontar em Alternativa, a qual pergunta ele pertence…

Boa tarde Galera !

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.

Bom isso eu acho que resolveria.

[]s

a estrutura da questão seria assim:

Pergunta: Qual a cor do cavalo branco de napoleão?
opção a) roxo
opção b) azul
opção c) branco
opção d) vermelho

A tabela PERGUNTA está ok!
É só deixar o código e a pergunta. Certo?

E a tabela RESPOSTAS, não deveria o código, a opção certa, e três opções incorretas?

a resposta é uma opção ou multipla?

se for uma é mais simples

Resposta{
  Integer id;
 Alternativa alternativa;
  Usuario usuario;   
}

se for varias respostas ficaria assim

Resposta{
  Integer id;
  Usuario usuario;   
}

Resposta_alternativa{
   Integer id;
   Resposta resposta;
   Alternativa alternativa;
}

e’ um relacionamento 1 - N

ou seja…

1 PERUGNTA tem N ALTERNATIVAS

todas as alteranativas fica na tabela ALTERNATIVA

todas as perguntas na tabela PERGUNTA

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…

Resposta id pergunta_id alternativa_id

ai depois vc faz… Alguem -> Resposta

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…

Boa tarde Galera !

Lavieri

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…

[]s

quem vai existir primeiro e’ a pergunta… segundo sao as alternativas, e terceiro a alternativa correta…

como falei, vc pode fazer, mas tera q cuida na hora de persitir

Boa tarde Colegas !

Lavieri

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

É isso ?

[]s

yep!

repository.add(pergunta); repository.addAll(alternativas); pergunta.setAlternativa(correta); repository.marge(pergunta);

that is the way

existe outra alternativa…

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 …

[quote=Lavieri]yep!

repository.add(pergunta); repository.addAll(alternativas); pergunta.setAlternativa(correta); repository.marge(pergunta);

[/quote]

Obs.: se usar hibernate da pra fazer melhor…

so colocar insertable false, na propriedade setAlternativa…

e entao vc nao precisa esperar o add pra setar ela

Boa noite Galera !

Lavieri

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.

[]s

[code]public class Pergunta {
private Integer id;
private String texto;
private Alternativa resposta;

@Id
@GeneratedValue
public Integer getId(){}

@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]

fim!

seria só uma opcao correta, sem multipla escolha…

desculpa, mas eu nao to entendendo mto do que vcs tao falando e tal…

nao teria que ter um campo pras opcoes incorretas tbm?
que vai ser um cadastro de exercicios

e na area do aluno, o aluno poderá responder as questoes…

Boa madrugada Galera !

Na opção que eu dei você teria um campo Boolean na TB_ALTERNATIVA que seria true para a correta e false para as erradas.

[]s

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

Manos Critiquem :idea: