【问题标题】:What type of database design do I use for a questionnaire that has a lot of questions?对于有很多问题的问卷,我应该使用哪种类型的数据库设计?
【发布时间】:2016-03-28 04:05:45
【问题描述】:

我有一个项目,我需要记录一份包含 50 多个问题的问卷的答案。每个问题都与数字 1 到 5 相关联。因此,填写的每份问卷的数据类似于

Username : "Bob", 
"Question 1" : 1, 
"Question 2" : 1, 
"Question 3" : 5, 
.
.
.
"Question N" : 2

向每个人提出相同的问题。我想知道这种情况下正确的数据库设计是什么。我做一张像

                      Questionaire_Answers
---------------------------------------------------------------------------
       userid    |  Quesiton_1_Answer   |    ....   | Question_N_Answer 

或者有什么更好的方法?我是否使用巨大的 varchar 列对信息进行序列化,例如

        Questionaire_Answers
-------------------------------------------------------------------------
      userid    |                    Question_Answers
--------------------------------------------------------------------------
       1238     | "Question1->1,Question2->1,Question3->5,...QuestionN->2"

或者我该怎么办?

【问题讨论】:

  • 这些设计都不正确。正确的数据库设计可能是....只需使用 SurveyMonkey。
  • @Nick.McDermaid Survey Monkey 是否有办法为每个调查分配个人用户名和密码等?我打算在 ASP.NET 中进行此操作,因为它需要随着时间的推移进行高度定制。
  • 可以,但您可能需要为此付费。考虑什么是最好的利用你的时间 - 自定义编写,维护它并将其托管在某个地方..你仍然必须在另一边写出报告。或者付钱给Survey Monkey(我不为他们工作,我只是认为人们在不需要时定制构建东西!)

标签: sql sql-server tsql database-design


【解决方案1】:

您的问题的直接答案是:“不,您不会将信息序列化成巨大的varchar() 列。”这很容易,因为这种序列化在 SQL 中几乎从来都不是正确的做法。正确的是连接表。

但是,除此之外,用于调查的数据结构很难实现,因为:

  • 可以在调查(尤其是在线调查)中添加和删除问题。
  • 个别问题可以有不同的版本,细微差别很重要。
  • 可以为给定问题添加和删除答案。
  • 各个答案可能有不同的版本,细微差别很重要。

对于在线调查尤其如此,其中数据是在多天内收集的。早期回复可能会导致调查发生变化——而且有充分的理由。

【讨论】:

    【解决方案2】:
    UserID     QuestionID     Answer
    --------------------------------
    1238       1              2 
    1238       2              5 
    ... 
    1238       50             3
    

    【讨论】:

    • 那张桌子不会比其他桌子大吗?
    • 你说的大是什么意思? 100 个用户 x 50 个问题 x 10 次尝试 = 50,000 条仍然不是“大”的记录。不仅如此,以这种方式存储它会更快更可靠。当您想要 51 或 49 个问题时会发生什么?这是一个简单的数据更改,而不是列更改。
    【解决方案3】:

    我将创建三个表:

    1. 问题
    2. 选择
    3. 用户回答

    CREATE TABLE Question(
        QuestionId  INT,
        --Additional Columns
    )
    
    CREATE TABLE QuestionAnswer(
        AnswerId    INT,
        QuestionId  INT, --FK to Question
        --AdditionalColumns
    )
    
    CREATE TABLE UserAnswer(
        UserId      INT,
        QuestionId  INT,
        AsnwerId    INT
    )
    

    这样,您必须灵活地为每个问题提供任意数量的可用选项。


    我是否用一个巨大的 varchar 序列化信息

    不,不要这样做。这是一个糟糕的设计,您必须为简单的操作生成复杂的查询。最好的方法是规范您的设计并使用联结表。

    【讨论】:

      【解决方案4】:

      如果你把它放在一个 sql 数据库中,那么我会倾向于创建一个这样的表:

      userid int
      questionid int
      answer int
      

      因此,如果特定用户回答了 50 个问题,则该用户的表中将有 50 行。

      如果您使用的是 NoSQL 数据库,情况会有所不同,但使用 TSQL 和这种设计,如果您的调查从 50 个问题更改为 51 个问题,您无需修改​​数据库的结构。

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 2020-03-14
        • 1970-01-01
        • 2013-02-21
        • 2023-03-06
        相关资源
        最近更新 更多