大家好,最近改造公司的一个问卷调查系统,java做的。   有一个小功能代码比较乱,具体是这样的,当用户答完所有题目后,提交之前可以预览自己做的题,预览的时候可以修改选题。 如:答完之后选择 预览。在预览页面上显示该用户答过的所有题目:由于数据库设计的时候 
问题表是一张表 A
答案选项表是一张表 B
答案表是一张表  C每个表都有外键 关联。现在的做法是根据A表的ID取数据库B表的选项。然后取C表用户选择的答案:如
问题序号为 1 的问题(A表中)(你的年龄?) 
答案有 
  A 19
  B 18 
  C 20 
  D 21
(A 19, B 18 ,C 20 ,D 21)存在B表中C 表中存用户选择的答案,如  B 18 。那么取C表的答案和B表的这个问题的所有选项循环比较,当比较到 B 18是,在页面展示的时候就把 这个选项的 checked 写为 true (就是HTML单选中的选中)。那么现在的问题是  每一道题都要循环,比如上面这一题,要一个循环比较才能选中B。多选实现思路一样。当一张问卷有 30 道选择题时 ,就要至少循环30次,才能选中答案。我总认为这个写代码的思路比较 屎。首先每次都去数据库中取数比较,数据库连接会增多。
第二 循环太多 效率比较低,虽然循环代码只写一个就行了,但是数据要跑30次。
第三,业务逻辑和页面展示没有分开。不好维护。   
发此贴,只想和大家讨论一下,有没有别的设计思路或者办法,让效率更高,代码更优美。
不用具体实现,只要提供思路就行。  谢谢大家。
      

解决方案 »

  1.   

       1.在用户预览前,用户选择不应该存入数据库,用户可能发现预览效果不好,不提交了。
       2.用户预览不一定要读取数据库,既然是web系统,用户提交时,可以将用户答案信息放入本地cookie,如果使用ajax局部刷新,还可以使用javascript来存放数据
       3那么取C表的答案和B表的这个问题的所有选项循环比较,当比较到 B 18是,在页面展示的时候就把 这个选项的 checked 写为 true (就是HTML单选中的选中)。
    不会用数据库联接吗
    A表(id,question)
    B表(qId,select,selectContent)
    C表(user,qId,select)
    SQL select A.question,B.select,B.selectContent,C.user where C.user='userId' and C.qId=B.qId and c.qId=A.id
    一次把这个用户的所有题目都取出
      

  2.   

    select A.question,B.select,B.selectContent,C.user from A,B,C where C.user='userId' and C.qId=B.qId and c.qId=A.id
      

  3.   

    不过主要是 就是用一个 SQL取出一个人的答案,但是每一道题的答案 和答案 列表也要 循换比较啊。比如 答案是  C  , 答案列表时 A,B,C ,D 。主要是这个要循环到C时候吧C的checked设为 true。我觉得这样比较有点屎,但是也没有其他的好办法。
      

  4.   

    我之前的工作中做过比这个更复杂的问卷,支持单选多选,填空,简答,图表并且单选和多选的每个选项后支持再挂子题目,每个选项被选中后子题目可以作答,否则子题目被禁用。还实现了,跳转关系,就是比如第一题选A,第二题不能答,直接答第三题。或者第一题选A,第二题选C第三四题不能答,直接答第五题。这些都是用户在画完问卷后可配置的跳转关系。是给北京统计局做的调查问卷。我建议你数据与问卷格式分开。我们当时做的是,问卷表里有问卷的ID,问卷格式用字符串存储。就是一大串HTML的字符串题目表中每个题目有自己的标识,还有外键标识是哪个问卷的。答案表用于记录答案,还有一个对应的描述表,用于描述答案表每个字段是哪个问卷的哪个题目的答案。当用户请求填某一问卷的时候,先给他展示问卷表里的表样格式然后AJAX请求数据,根据问卷ID查询答案表盒描述表,把信息拼好,返回前台用JS把数据放到HTML表样上去。这个项目应用还算成功,今年已经开始填报了,并且在我离开原来公司之前,没有出现效率问题,目前,以前的同事也没反应有什么问题不过,对你来说,可能改整体结构就太难了,工作量太大
      

  5.   

    我现在做的是这样的:  主题一张表,t_ID,t_MARK。存问卷的主题和说明。就是问卷最开始显示的内同。  题目表:  t_ID,ques_id,ques_name, sqe ,q.
               主题ID 题目ID  题目  题目序号 说明
      答案列表: t_ID,ques_id,answer,a_sqe,a_.
              主题ID   问题ID 问题答案列表, 答案列表顺序,说明。
       答案表: t_ID,ques_id, staffno,answer_name,.
      
      大概就是这个样子。每一份问卷可以通过t_ID关联起来。
      现在的问题是,当用户答题后点击 预览是 。如何标示已经答题的选项。现在的做法属通过根据答案表的答案和答案列表的答案对比,之后将选中的checked设置为 true.我觉得这样设计有点屎。 第一,增加了数据库连接。
    第二。循环语句多,影响效率。
    第三,代码乱。
      虽然可以勉强能用,但是这样的设计很屎,但是我也没有更好的思路,所以和大家商讨一下。