MySQL:使用统计支持对90个是或否问题调查进行建模

时间:2017-10-17 15:53:07

标签: mysql database-design data-modeling

我正在尝试设计用于调查的MySQL表。

调查由6组问题组成,每组15个问题,共90个问题。 问题和问题的顺序不会改变,并且有可能添加新的问题(每组15个问题)。

它们都是“是或否”问题,因此答案将以布尔方式保存为true或false。

我还保存性别,国籍,用户年龄以进行统计。

  1. 我想获得两个用户之间相同答案的百分比。
  2. 我想得到一个人和多数人之间相同答案的百分比(多数是超过50%的答案)。
  3. 我想通过性别,国籍,年龄的组合得到每个问题的是或否的统计数据。例如, 66%对第11个问题的答案是肯定的 12%的韩国女性对于第86号问题的答案为否
  4. 所以我创建了一个表来支持所有这些功能

      

    问题表

     q_id PK(1 to 90)
     q_text VARCHAR(100)
    
      

    用户表

    u_id PK
    sex TINYINT
    nationality VARCHAR(20)
    age TINYINT UNSIGNED
    q_1 TINYINT
    q_2 TINYINT
    ...
    q_90 TINYINT
    

    一张桌子上有94列可以吗?当我添加一些问题集时,我担心列数会增加。所以我把答案分成了设置表

      

    set1 table

    s_id PK
    u_id users_table
    q_1 TINYINT
    q_2 TINYINT
    ...
    q_15 TINYINT
    
      

    set2 table

    s_id PK
    u_id users_key
    q_16 TINYINT
    q_17 TINYINT
    ...
    q_30 TINYINT
    

    等等。我现在有6个表集,如果我添加新集,我现在可以添加新表。 我对此进行了一些搜索,我发现如果我有一个单独的答案表会更好

      

    答案表

    a_id PK
    u_id users_key
    q_no question number(1~90)
    answer TINYINT
    

    我担心答案表可能会变得太大,因为答案表每个用户获得90行。 我真的不确定哪种设计更好。我搜索了stackoverflow的答案,但我找不到适当的答案是肯定还是没有调查。

2 个答案:

答案 0 :(得分:1)

创建所有这些列q_x很疯狂,你只需创建一个名为question_set的表,其中包含以下所有问题:

 s_id PK
 s_type (you can put 1, 2, 3 for set group)
 q_id FK(questions)

您应该规范化您的表格,将所有这些列放在一起会比以后更快地创建您的问题。在你需要非规范化的情况下,最好为它创建视图。

答案 1 :(得分:1)

我宁愿使用foreign keys来提高其灵活性。

所以我会创建

set_table set_id PK set_name Text

question_table question_id PK

//This will help you put same question in multiple sets question_set set FK (set_table) question FK (question_table)

user_table user_id PK user_name Text sex Text

user_answer_table user FK(user_table) question FK(question_table) answers Bool

然后,您可以使用联接编写复杂查询以获取所需的所有指标。这将为您提供足够的灵活性,无需更改架构即可添加新问题,集合和用户。