如何在数据库中建模“网格”?

时间:2011-06-30 09:33:49

标签: database database-design

我正在为我的网站构建一个问题,我希望其中一种答案类型如下:

[Question] How much did you like the food in:

[Answer]
        1    2    3    4    5
2006   [ ]  [ ]  [ ]  [x]  [ ]
2008   [ ]  [ ]  [x]  [ ]  [ ]
2010   [ ]  [ ]  [ ]  [x]  [ ]
2012   [ ]  [x]  [ ]  [ ]  [ ]

[Button] Save

[]标签应该是radiobuttons,每年应该是1个radiobutton组。

我需要构建一个组件,以便用户可以定义他/她的问题的答案应该有多少列和行。用户也应该能够为每行和每列指定文本。

我如何在数据库中对此进行建模,并将问题与答案绑定?如何将答案保存为1个答案?

目前我所做的是这样的:

[Table]Question

id (int)
question_wording (text)
question_number (varchar(50))
visible (int)


[Table]Multiple_Choice_Question
id (int)
choice_woring (varchar(200))
choice_number (varchar(50))

然后我有一个交叉引用表来将问题与多个答案可能性绑定。有了这个解决方案,我每年都要创建一个问题,例如:

How much did you like the food in 2006?
How much did you like the food in 2008?

通过交叉参考表将问题与问题结合起来。

答案表也是如此:

[Table]Answer
id (int)
question_number (FK)
choice_number (FK)

这是一张用于说明网格的图片: http://imageshack.us/photo/my-images/857/capturedu.jpg/

提前致谢!!

2 个答案:

答案 0 :(得分:1)

我不明白要求“将答案保存为1个答案?”。在关系模型中,这将存储为多行。这是一个基本的数据定义:

由于必须有不同的网格,我建议使用行和列的定义:

ROW_DEFINITIONS
- ID
- FORM_ID       - which form are we defining
- FIELD_NUMBER  - which field on the form is this
- ROW_NUMBER    - the row number of the grid
- DESCRIPTION   - the description of the row

COLUMN_DEFINITIONS
- ID
- FORM_ID
- FIELD_NUMBER
- COLUMN_NUMBER - the column number of the grid
- DESCRIPTION   - the description of the column

然后注册答案:

ANSWERS
- ID
- FORM_ID       - for which form is this answer
- USER          - who gave this answer
- ROW_NUMBER    - the row of the given answer
- COLUMN_NUMBER - the column of the given answer

答案 1 :(得分:0)

  

“如何将答案保存为1   回答?“

典型关系数据库中的值是monadic,而不是多值,并且在您的示例中,答案具有与每年对应的多个值。您有两种方法可以跟踪这些问题的数据* s *(复数,而不是这个问题,单数):

      How did you like the food in
          2006
          2008
          2010
          2012

1)每年对应一列。添加新年需要在表中添加新列。

2)每年的答案对应于单独的ANSWERS表中的儿童记录:

        QUESTION table (questionid, questiontext)
        ANSWERS table (id, questionid, answervalue)

在ANSWERS表中可以有一个或多个答案到QUESTIONS表中的单个问题 - 就像订单上的行项目条目一样。第一个与第一个表存在多对一关系的表是“规范化”关系数据库如何构建此类数据。

上面的表格定义简单明了。如果我要跟踪多部分问题,我可能会有一个QUESTIONPARTS表,它与QUESTIONS有关,并将我的ANSWERS表与QUESTIONPARTS联系起来,或者使用第一种方法来处理多部分问题的每个部分作为一个单独的问题,有自己的专栏。

表示层问题(GUI)应该与数据结构无关。 数据必须最终可用/可查询,并且您设计用于收集信息的可视组件不会确定基础数据结构。

您必须确保数据可用,否则收集数据的操作对每个人来说都是浪费时间。

P.S。近年来,面向对象(支持自定义用户定义的结构)已经被移植到关系数据库中。两个主要的商业参与者,Oracle和SQL Server,现在支持这一点,但这些是SQL标准的专有扩展,不能从一个系统移植到另一个系统。在此之前的许多年里,PICK及其变体等数据库都支持多值。使用特定分隔符将列中的多个值彼此分开。这通常被称为“嵌套关系”模型。