【问题标题】:Database multiple choice and comments structure数据库多项选择和评论结构
【发布时间】:2017-03-15 22:26:54
【问题描述】:

我已经阅读了很多页面,但没有找到我想要的东西。 我正在尝试找出最适合我的问题的解决方案。我目前有一个包含 23 个问题和 23 个 cmets 部分的多项选择表(每个问题 650 个字符,基本上每个问题一个评论),我不确定我是否应该使用单个表格或者这是否太多。

所以基本上是这样的:

id
user_id
date
multiplechoice1
..
multiplechoice23
comment1
..
comment23
status

这将是大约 50 列:/ 有没有更好的方法来做到这一点?就像在不同的表上拆分 cmets 或以某种方式将所有多个选项组合在一个列中?因为每个答案都是 1-5。

问题示例:

您通常每天上网多长时间?

  • 0-1 小时
  • 2-3 小时
  • 4-6 小时
  • 超过 7 小时

【问题讨论】:

  • 就个人而言,我会去 5 张桌子。 forms、questions、answers,然后是两个关系表:form_questions 和 question_answers。当然,命名约定是个人喜好。您的所有表格都在forms 表中,questions 中的问题,answers 中的答案。您的form_questions 表有两列:form_id 和question_id,您可以在其中列出表单的所有问题。 question_answers 表也有两列:question_id 和 answer_id,您可以在其中列出问题的所有答案。
  • @Santi 有问题的表格是固定的,很长一段时间不会添加或删除任何内容(如果添加/删除任何内容将是1-2个问题)。首先将它们放在数据库中是否值得?谢谢!
  • 如果它始终是一种固定形式,那么您不必担心forms 或form_questions 表。如果您将不重复使用问题的答案,那么您也不需要question_answers 表。不过,在您的情况下,我最扁平的结构是两个表:questions 和answers。在您的 answers 表中有一个 question_id 列。这样,您可以将 5 个答案放在那里,并将它们全部设置为 question_id: 1,这意味着问题 1 有这 5 个可能的答案。
  • @Santi 我目前已经在一个 php 文件中获得了所有问题和答案,所以如果 Q1 回显这个问题和答案,我想将答案保存在 tinyint 中以了解用户选择了哪个答案和 cmets 的文本。 (见上面的编辑版本)
  • 如果这些问题是轮询,而不是多项选择“正确/不正确”,那么我会包含某种selected_answers 表,您只需在其中跟踪每个问题的选择答案,非常类似于我之前建议的 question_answers 表,但您正在跟踪选择的答案而不是可能的答案。

标签: php mysql database database-design


【解决方案1】:

考虑到您的 cmets,因为您不想过多地标准化并且更喜欢稍微扁平的东西,我认为这可能是您的合适解决方案。

questions

+----+-------------------------------+
| id | question                      |
+----+-------------------------------+
| 1  | What is your favorite food?   |
+----+-------------------------------+
| 2  | What is your favorite animal? |
+----+-------------------------------+

answers - 问题 1 有三个答案,问题 2 有两个答案

+----+-------------+-----------+
| id | question_id | answer    |
+----+-------------+-----------+
| 1  | 1           | Spaghetti |
+----+-------------+-----------+
| 2  | 1           | Chicken   |
+----+-------------+-----------+
| 3  | 1           | Sushi     |
+----+-------------+-----------+
| 4  | 2           | Dog       |
+----+-------------+-----------+
| 5  | 2           | Cat       |
+----+-------------+-----------+

answer_data - 第 1 题有 1 人回答“意大利面”,第 2 题有 1 人回答“猫”,第 2 题有 1 人回答“狗”

+----+-------------+-----------+
| id | question_id | answer_id |
+----+-------------+-----------+
| 1  | 1           | 1         |
+----+-------------+-----------+
| 2  | 2           | 4         |
+----+-------------+-----------+
| 3  | 2           | 5         |
+----+-------------+-----------+

说实话,我不太擅长 MySQL,我是一个 T-SQL 人,但查询可能看起来像这样:

SELECT q.question, a.answer, COUNT(ad.answer_id) as `Count`
FROM questions q
JOIN answers a ON a.question_id = q.question_id
JOIN answer_data ad ON ad.question_id = q.question_id
GROUP BY q.question, a.answer


+-------------------------------+-----------+-------+
| question                      | answer    | count |
+-------------------------------+-----------+-------+
| What is your favorite food?   | Spaghetti | 1     |
+-------------------------------+-----------+-------+
| What is your favorite animal? | Dog       | 1     |
+-------------------------------+-----------+-------+
| What is your favorite animal? | Cat       | 1     |
+-------------------------------+-----------+-------+

【讨论】:

  • 我认为我们唯一缺少的是 answer_data 中的 user_id (因为我需要将所有这 23 个问题/答案与用户联系起来)和需要每个答案的评论列。例如user_id = 1question_id = 1 与answer_id = 2 和comment = 500 chars of text
  • 是的,很抱歉,没有意识到你需要这些。两者都可以进入answer_data 表。可能还需要一个日期时间字段,以便您知道他们何时提交。
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 2012-08-23
  • 1970-01-01
  • 2019-08-07
  • 2010-10-23
  • 2018-08-17
  • 2013-10-24
  • 2017-10-04
相关资源
最近更新 更多