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

28 respostas
B

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

28 Respostas

N

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!

L
Tablea Pergunta
       id
       propriedades



Tabela Alternativas
      id
      pergunta_id
      descricao

faz assim

B

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

:S

(ignorem a parte do som e imagem)

L

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...

Pergunta {
     Integer id;
     String texto;
     Alternativa correta;
}

Alternativa {
    Integer id;
    Pergunta pergunta;
    String texto;
}

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

Z

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

B

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?

F

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;
}
L

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
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 =&gt; &quot;select pergunta where id = 1&quot;;

List&lt;Alternativa&gt; alternativas =&gt; vc usa &quot;select alternativa where pergunta_id = 1&quot;;

System.out.println(pergunta);
for (Alternativa alternativa : alternativas) {
    if (pergunta.getCorreto().equals(alternativa))
         System.out.print(&quot;CORRETA =&gt;&quot;);
    System.out.println(alternativa);
}

.................

Se vc quer saber quanto a resposta de alguem vc faz...

Resposta
    id
    pergunta_id
    alternativa_id

ai depois vc faz..... Alguem -> Resposta

F

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…

Z

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

L

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

Z

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

L

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...

Pergunta 
   id
   texto

Alternativa
   id
   pergunta_id
   texto
   isCorreto

ai nesse caso, vc pode acabar tendo em uma pergunta mais de uma resposta correta ...

L

Lavieri:
yep!

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

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

Z

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

L
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
}

pronto... assim vc pode fazer

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);

fim!

B

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…

Z

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

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:

Z

Bom dia Galera,

sulito

Impressão minha ou chegamos na mesma solução ?

[]s

L

sulito:
…, temos a alinea ( se a resposta é a alinea a,b,c,d), …

esse trecho que não esta OK …

não há sentido de colocar qual é a letra da alternativa… ou vc coloca um ordenador, pra saber a ordem que elas devem vim, ou então não coloca nada…

se colocar… a,b,c,d … vai ficar amarrado…

e é bom poder colocar as perguntas em qualquer ordem

S

Zeed01:
Bom dia Galera,

sulito

Impressão minha ou chegamos na mesma solução ?

[]s


Ya mano , na verdade eu não li todos os post do topico, desculpa ai, eu normalmente leio as primeiras postagens, e depois pulo e leio a ultima postagem para ver se ja ha um concenso.

Mas vou dar uma olhada em todo o post,

B

dae galera

valeu pela ajuda de tds!

mas ainda nao consegui chegar a uma conclusao definitiva…

É o seguinte
Preciso fazer um site em php (trabalho de facul)
E estou com problemas para modelar o banco de dados, utilizando o DBDesigner 4

a ideia é a seguinte, terão 3 tipos (niveis) de usuários
(básico, avançado, admin)

os admins poderao cadastrar usuarios e cadastrar exercicios para os alunos
e os alunos irao responder os exercicios

aqui tá o modelo, por enqt:

os alunos que estivessem cadastrados no nivel básico teriam tais exercicios
e os que estivessem no nivel avançado, teriam outros exercicios

essa é uma das duvidas, como que eu vou fazer para identificar que o exercicio tal, é do nivel básico ou avançado?

outra coisa:

no modelo tem resposta1 e resposta2

sendo que resposta1 são as questoes de perguntas e respostas (dissertativas)

e a resposta2 são as questoes de assinalar, com 4 alternativas, somente 1 correta

sendo que resposta2 quando for exibida ao aluno, terá que exibir as respostas de forma randomica, ou seja, ou na posicao a) ou na posicao cool.gif ou c) ou d)

acho que qt a resposta1 está tudo certo
mas a tabela resposta2 está correta?

muito obrigado!

S

buthy:
dae galera

valeu pela ajuda de tds!

mas ainda nao consegui chegar a uma conclusao definitiva…

É o seguinte
Preciso fazer um site em php (trabalho de facul)
E estou com problemas para modelar o banco de dados, utilizando o DBDesigner 4

a ideia é a seguinte, terão 3 tipos (niveis) de usuários
(básico, avançado, admin)

os admins poderao cadastrar usuarios e cadastrar exercicios para os alunos
e os alunos irao responder os exercicios

aqui tá o modelo, por enqt:

os alunos que estivessem cadastrados no nivel básico teriam tais exercicios
e os que estivessem no nivel avançado, teriam outros exercicios

essa é uma das duvidas, como que eu vou fazer para identificar que o exercicio tal, é do nivel básico ou avançado?

outra coisa:

no modelo tem resposta1 e resposta2

sendo que resposta1 são as questoes de perguntas e respostas (dissertativas)

e a resposta2 são as questoes de assinalar, com 4 alternativas, somente 1 correta

sendo que resposta2 quando for exibida ao aluno, terá que exibir as respostas de forma randomica, ou seja, ou na posicao a) ou na posicao cool.gif ou c) ou d)

acho que qt a resposta1 está tudo certo
mas a tabela resposta2 está correta?

muito obrigado!

hi cara sujou :slight_smile: :shock: :shock: :shock: :shock: :shock: :shock: :idea:
se o nome da tabela é usuario os campos nao precisam ter o nomes assim
usu_nome, usu_???, usu_ssss, etc
é claro que se o campo esta na tabela usuario é porque pertence ao usuario, por isso não é necessario reforçar o conceito para por usu_nome, usu_telefone

S

ainda não acabei de analisar a logica, mas ai vai outro erro,
nunca usa tabelas do tipo, resposta1, resposta2, resposta3, resposta4 etc.

B

certo
mas o usu_ foi um jeito que eu achei de caso tenha algum nome igual em outra tabela, tipo codigo, pra nao ficar repetido :stuck_out_tongue:

e qt a resposta1 e resposa2 eu ja mudei :smiley:

sao dissertativa e multipla_escolha agora :smiley:

Z

Bom dia Galera,

Acho que tudo depende da convenção que esta sendo seguida, aqui tenho sistemas que utilizam um “prefixo” no nome do campo indicando qual é tabela e outros que não tem.
A algum tempo foi adotado pela empresa um padrão para criação de nomes de campos, sinceramente acho algo muito tosco, veja o exemplo:

Campo: CODIGO DO CLIENTE
como fica no novo padrão: CD_CLNE

Não parece obvio que CD_CLNE seja o campo que guarda o CODIGO DO CLIENTE ??? rs

O que faço é seguir este padrão exigido no banco e nas minhas classe utilizar nome mais intuitivos, nesse caso acho que colocaria na classe “codigoCliente”.

Agora sobre o seu problema, seria melhor postar como esta o seu modelo, pela sua explicação, pra mim pelo menos, não ficou claro.

[]s

B

olha, eu soh quero que no site tenha o seguinte:

uma area Cadastro de Exercicios
onde o admin poderá:

Pergunta: ________________

Tipo de Exercicio: O dissertativa
O multipla escolha

Nivel do Exercicio: O basico
O avançado

em caso de dissertativa:

Resposta: ___________

em caso de multipla escolha:

Opção correta: _______
Opção errada 1: ________
Opção errada 2: ________
Opção errada 3: ________

só que eu nao sei como representar isso no banco :S

também gostaria de saber, se dps disso, tem algum jeito de eu randomizar as opções da de multipla escolha
para que a correta as vezes fique por primeiro, e as vezes no meio, e outras vezes por ultimo na ordem…

não sei se deu pra entender :S

Criado 9 de março de 2010
Ultima resposta 12 de mar. de 2010
Respostas 28
Participantes 7