我正在尝试设计用于调查的MySQL表。
调查由6组问题组成,每组15个问题,共90个问题。 问题和问题的顺序不会改变,并且有可能添加新的问题(每组15个问题)。
它们都是“是或否”问题,因此答案将以布尔方式保存为true或false。
我还保存性别,国籍,用户年龄以进行统计。
所以我创建了一个表来支持所有这些功能
问题表
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的答案,但我找不到适当的答案是肯定还是没有调查。
答案 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
然后,您可以使用联接编写复杂查询以获取所需的所有指标。这将为您提供足够的灵活性,无需更改架构即可添加新问题,集合和用户。