【问题标题】:schema design - best practise for storing survey data模式设计 - 存储调查数据的最佳实践
【发布时间】:2021-03-24 14:46:58
【问题描述】:

背景:
我想创建一个表格来存储调查中的问题和用户答案以供研究。

问题是多项选择,但只能选择一个答案。
用户可以添加或隐藏问题。
每个用户的问题都是一样的。

此外,由于是匿名的,因此无需存储任何面试官信息。

这个问题没有绝对的答案,因为每个问题的选择都是静态的。

表格

Survey
-id(PKey)
-submittedDate

Question
-id(PKey)
-questionText

Answer
-id(PKey)
-answerText

访问模式
1.查找具有特定 ID 及其问题和答案的调查。
2.计算某些问题的答案分布,例如对于问题 1,50% 的人选择答案 a,25% 的人选择答案 b。

示例

                                         1     2     3     4     5
1. How much water do you drink today                 ✓
2. How many apples do you eat today                        ✓

我的问题
我对表和一些字段进行了粗略设计,但我想了解如何关联这些表,以及我应该如何使用这 3 个表设计架构。

更新
调查表似乎被误解了。
这是更具体的例子。

Survey id 123
                                                 1     2     3     4     5
1. How much water do you drink today(questionId 1)                 ✓
2. How many apples do you eat today(questionId 2)                  ✓



Survey id 124
                                                 1     2     3     4     5
1. How much water do you drink today(questionId 1)                 ✓
2. How many oranges do you eat today(questionId 3)      ✓

questionId 1 属于调查 ID 123 和 124。
调查 ID 123 有 questionId 1 和 2。
所以是N对M的关系?

【问题讨论】:

  • 问题是多项选择吗?还是填写?加入表格的 id 在哪里?例如:survey_id 需要在 Questions 中,对吗?
  • 以选择题为例
  • @Rick James 对于你的第二个问题,我不确定我应该如何放置外键,因为这三个表之间的关系似乎是 N 到 M
  • 他们感觉就像 1:N -- 1 个调查有 N 个问题;每个问题有 N 个答案。 Abdulmohsen 指出如何实施 1:N。
  • @Rick James 请看我的更新

标签: mysql sql database database-design schema


【解决方案1】:
CREATE TABLE Surveys (
    sid ... AUTO_INCREMENT,
    other info about the survey (date, who took it, etc)
    PRIMARY KEY(sid),
    maybe other indexes
) ENGINE=InnoDB;

CREATE TABLE S_Q (
    -- no AUTO_INCREMENT needed
    sid ...,  -- not AUTO_INCREMENT
    qid ...,  -- not AUTO_INCREMENT
    answer VARCHAR(...),       -- the actual answer (no need to normalization)
    PRIMARY KEY(sid, qid),
    INDEX(qid, sid)
) ENGINE=InnoDB;

CREATE TABLE Questions (
    qid ... AUTO_INCREMENT,
    question_text  TEXT,
    PRIMARY KEY(qid)
) ENGINE=InnoDB;

// This table may be unnecessary:
CREATE TABLE Answers (
    -- no AUTO_INCREMENT needed
    qid ...,
    answer VARCHAR(...),
    answer_description  TEXT,
    PRIMARY KEY(qid, answer)
) ENGINE=InnoDB;

(所有列都应该是NOT NULL。)

answer 是实际答案。它足够短且具有自我描述性,不需要通过 id 进行查找。

【讨论】:

  • 对于 S_Q 表,你的意思是 answerId 而不是 answer,对吧?
  • @CCCC - 根据您的示例,可能的答案是小数字;不需要有一个“id”。如果您的调查包含“最喜欢的颜色”,那么答案(不是 answer_id)可以是“蓝色”或“红色”或... -- VARCHAR
  • 即“眼镜数”求数;这样不需要查找。我进一步建议“最喜欢的颜色”。它可以显示为多项选择,但也可以存储为字符串。
  • 那个每天喝 "> 8 杯" 的人呢?
  • 而“0”似乎是您的示例问题的有效答案。我的 qolor 问题“不喜欢”。
【解决方案2】:

您需要在它所属的调查表以及该答案的问题的答案表上添加到 FK。

调查

  • id(PKey)
  • 提交日期

问题

  • id(PKey)
  • 问题文本
  • Survey_id(FK)

回答

  • id(PKey)
  • 答案文本
  • Question_id (FK)

【讨论】:

  • 但一个问题可以属于多个调查。
  • 另外,问题和调查是 N 对 N 的关系
  • @CCCC 在这种情况下有一个单独的表格记录哪些问题属于哪个调查
  • 如果关系N到M我们需要将这个关系表示为一个表包含每个表的PK,则更正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多