Eisen 发表于 2010-09-20 12:20

今天版主chenfeng给我出的一个题目,欢迎大家一起来锻炼锻炼脑子

Feng 说:
就是一个在线考试的表设计
Feng 说:
你怎么设计考题和用户答题
有单选,多选。还需要统计用户答题的趋势,例如,a回答多少,b回答多少
想想吧。前几天有人问我这个。。。
这个比mda那个靠普。。。
Eisen说:
……
这个难住我了
我似乎从来没出过考题呢
Feng 说:
仔细想想
这个其实很好玩的
要能够简单统计出那些单选,哪些是多选吧之类的
Eisen说:
有什么好玩的?
Feng 说:
这个表结构设计要花心思的。。。
你试试看你会设计出什么样子。。。
Eisen说:
这个……
还真想不出来
一点感觉都没有呢
Feng 说:
想想沙。
我要是考官,我就问dba这种问题。。。
Eisen说:
还真想不出来
你说说呢?
Feng 说:
不说
。。。
自己想去吧
洗尿布时最合适想这个了
Eisen说:
给点提示啦
Feng 说:
题目答案你准备怎么表示?
用户回答的答案呢?
统计怎么做?
数据量怎么样最小化?
Eisen说:
是啊
你这么一说,发觉还真是很麻烦的一个事情
Feng 说:
哈哈。我不说了。。。
勾起你的兴趣就好了。。。。

Eisen 发表于 2010-09-20 12:46

我现在的想法是,设计成两个表,一个是题目答案表
create table Answers
(title int,A boolean,B boolean,C boolean,D boolean)
里面存放考题答案,例如题目1是多选bd,那么就insert Answers values(1,false,true,false,true)
一个是考生答题表
create table Papers
(idvarchar(10),title int,answer varchar(4))
里面存放考生答案,例如考号0000000301答题7选的是cd,那么就insert Papers values('0000000301',7,'cd')
这样可以很快地统计考生答题的趋势,也可以通过动态sql给出考生得分,至于单选多选,可以统计一下题目答案表就行了。
不知道兄弟们有什么指点吗?

chenfeng825 发表于 2010-09-20 13:23

这样是不对的,四个选项四个字段,那新增选项怎么处理?

Eisen 发表于 2010-09-20 13:35

那把Answer表改成
create table Answer
(title int,option char(1),value boolean)
这样记录考试答案,
例如,第1题正确答案是bd,那么就
insert Answer values(1,'b',true)
insert Answer values(1,'d',true)
这样行不行?

chenfeng825 发表于 2010-09-20 13:53

这样看起来合理多了,如果这样就之需要 1,'a' | 1,'b'就好。true没有意义了

往下:统计考试结果可是有点难搞了。

Eisen 发表于 2010-09-20 14:05

我想的是true这个字段可以用来应付多选题没有完全选择时也给一定分数的情况,
甚至可以将boolean改为int用来记录分数,就可以对付
某多选题正确答案bcd,如果单选b给1分,单选c给2分,单选d给3分的情况。

andkylee 发表于 2010-09-20 17:51

本帖最后由 andkylee 于 2010-09-20 17:53 编辑

想出来一种存放试题答案的表结构。

Answers(Question_ID varchar(20), Value int )

题目答案的值用int类型存储(实际上tinyint,最大值256也差不多够了。)
利用int数值类型的二进制位形式来表示每个题目的各个答案。比如题目有四个答案:abcd,只有a正确,那么答案值为: 00000001(二进制形式),也就是:1。如果答案为:abcd,则为:00001111 ,也就是: 15

一个字节接受每个题目为8个答案的题目,超过8个再加一个字节来存储smallint就行。

很容易统计全套试题中有几个单选,几个多选。
只要统计一下答案为1的个数即为单选的数量,不等于1为多选。
至于回答了几个问题?
统计一下答案值非零的即为回答的题目。


另外,至于多选的情况。
也很容易根据答案数字值的大小为判断是比标准答案选多了还是选少了。

D_D_D_D 发表于 2010-09-20 17:53

最近在纠结于彩票取值什么的表设计,如何才能算出下一期的号码,自用的...

Eisen 发表于 2010-09-21 14:18

用位运算来记录答案倒也是个办法,不过一样存在选项最多不得超过256的问题。
如果不是考题而是市场调查等,那应该又有问题了。andkylee再想想呢?

andkylee 发表于 2010-09-21 14:45

回复 9# Eisen


    不过一样存在选项最多不得超过256的问题。
-------------------------------------------------------
sybase ase 15.0 中的bigint数据类型只占8个字节,那么最多只能存储64个选项的考题。
Eisen 你说的256个选项时怎么算出来的?



如果选项超过64个的话,我觉得用binary数据类型替代bigint或者int。

还是用0或者1来表考题的每一个选项是否被选中。binary类型字段的每一个位来表示题目的每个选项。


只需要编写几个函数: 用函数判断binary数值串是否全为1或者全为0;
                               用函数判断两个binary数值串的“1”的个数。

这样基本上就和int(bigint)的类型差不多了。
页: [1] 2
查看完整版本: 今天版主chenfeng给我出的一个题目,欢迎大家一起来锻炼锻炼脑子