2011-02-15 76 views
2

对不起,我对自己的调查问卷如何制作db有点困惑;它将成为那些在randon挑选了几个问题的问卷中的一个,在他们旁边显示可能的答案,其中每个答案都具有在最后计算的权重。调查问卷db结构

所以我得到了3个表:问题,答案和重量

重量有一个一对多与答案,因为每个答案都会有一个权重被添加到最后的比分。

这让我很困惑的事情是如何摆脱问题和答案之间的多对多关系,因为一个问题将有许多可能的答案,并且相同的答案,即是/否将用于许多问题。

回答

4

我建议以下结构:

  • 问题
    • has 0:n answers
    • 属性:id(int PK),question(text)
  • 解答
    • 有1个问题
    • 有0:N响应
    • 属性:id(INT PK),答案(文字),问题编号(INT FK)
  • 回应
    • has 1 answer
    • (有1个问题通过回答)
    • 具有1个响应者(用户)
    • 属性:id(INT PK),答案ID(INT FK),用户ID(INT FK)
  • 用户
    • 具有0:N响应
    • 属性:id(INT PK)+其他任何你需要存储有关用户

(PK =主键,FK =外键)

商店weight作为问题或答案的属性。你还没有真正描述什么是weight,所以很难说。


下面是一个问题的记录以及某人回答该问题的记录。在这个例子中,Jean Luc Picard被问到“有多少灯?”可能的答案是“3”,“4”和“5”。当然,他选择了“4”,对此没有收到任何weight(“5”是正确的答案)。

Question: (QID=1, Question="How many lights?") 
Answer: (AID=1, QID=1, Answer="3", Weight=0) 
Answer: (AID=2, QID=1, Answer="4", Weight=0) 
Answer: (AID=3, QID=1, Answer="5", Weight=1) 
Response: (RID=1, AID=2, UID=1) 
User: (UID=1, Name="Jean Luc Picard", ...) 
1

你有两个选择:

  1. 不要摆脱许多一对多。它并没有伤害你。

  2. 有“每个问题的回答”。例如。答案表中有栏目“question_id,answer,weight”。 (据我所知,因为体重是perl的答案/问题,所以你不需要一个seaparate体重表)。主键是“question_id + answer”

    是的,这第二个设计是非标准化 - 您将存储几个不同的“是”答案的副本。但是这并没有什么大的损失(在这种特殊情况下,参考完整性并不是一个大问题(例如“保持所有”是“字符串一致);空间问题是最小的 - 无论如何,对于小问题,大回答往往是唯一的,通过存储“是”问题的ID与字符串“是”不存储太多空间。

我的建议是第二设计 - 这既是编写代码反对,维护简单,没有大的缺点,尽管在理论上被规格化

0

@wuputah重量是选择的问题值得点。

我决定和一张桌子一起去找相同重量的答案,tblBooleanAnswerYes,tblBooleanAnswerNo,tblTextAnswer1pt,tblTextAnswer2pt(ID,文本,weightID *)

有两个问题表tblBooleanQuestion(ID,booleanAnswerYesID *,booleanAnswerNoID *),tblTextQeestion(ID,文字,textAnswer1ptID *,textAnswer2ptID *,textAnswer3ptID *等)

tblWeight -< tblBooleanAnswerYes -< tblBooleanQuestion 
     \ \_< tblBooleanAnswerNo ___v 
     \ 
     \ -< tblTextAnswer1pt -< tblTextQuestion 
     \_< tblTextAnswer2pt ___v 

一重了很多答案,一个答案很多问题

+0

重量应存放有答案呢?我不明白为什么它会是一个单独的表格。您将所有答案属性解除规范化为问题,这只会导致问题。我不会推荐你已经布置的结构。 – wuputah 2011-02-18 07:37:13