我为我的用户提供了以下投票表单,但我不确定应该如何围绕它构建数据库。
用户将获得 20-30 个投票问题,如下所示:
你最喜欢的颜色是什么?
- 蓝
- 绿
- 黄色
- 红
- 其他
将能够选择上述答案之一,并must also provide around 100 words
解释他为什么选择该答案。
我目前有两张桌子。一个保存投票问题,另一个保存投票选项。我不确定的是我应该如何保存用户的答案。
问题是因为民意调查太大了,用户可以部分完成,稍后再回来,更改他的答案并继续,直到他 100% 完成,这样我就可以在我的面板中查看整个结果。所以他基本上可以保存自己的进度并随时更改它。最重要的是,我想"删除"特定用户的整个民意调查,并能够重新做一遍,但同时保留他以前答案的历史记录。
所以我不确定这样的表格是否是满足我需求的最佳选择:
id
user_id
poll_questiond
poll_answer
poll_text
last_update
status
似乎这样的事情会造成巨大的混乱。有没有更好的方法可以做到这一点?
我会创建 3 个表:
table_polls
+----+---------------------+--------+
| id | description | status |
+----+---------------------+--------+
| 1 | Example description | 1 |
+----+---------------------+--------+
table_poll_options
+----+---------+-------------+
| id | poll_id | description |
+----+---------+-------------+
| 1 | 1 | Question 1 |
| 2 | 1 | Question 2 |
+----+---------+-------------+
table_poll_answers
+----+-----------+---------+----------------+---------------------+
| id | option_id | user_id | description | created_at |
+----+-----------+---------+----------------+---------------------+
| 1 | 1 | 1 | A valid reason | 1970-01-01 00:00:00 |
| 1 | 2 | 2 | Another reason | 1970-01-01 00:00:00 |
+----+-----------+---------+----------------+---------------------+
概括一下上述内容:
民意调查有很多问题。
投票问题有很多答案
投票答案有一个用户。
这样,您就可以将所有内容与数据透视表分开,并且不再需要在投票表中创建凌乱的行。
当然,如果您需要有关日期等的额外信息,您可以扩展表格。
我认为如果你用半结构化语言定义你的问题域,你会发现它更容易。您可能决定将某些逻辑委托给应用程序层,而不是嵌入到数据库架构中 - 例如,在应用程序层中保存部分完成的轮询可能更容易。
您可以从这样的事情开始,捕获域中的主要实体及其关系,而不是它们的属性。
该系统由许多民意调查组成。
一个民意调查有很多问题。一个问题属于 1投票。
问题可以是多项选择题(选择一项)或多项选择(选择 N)或自由文本
问题可能是强制性的,也可能是可选的
多项选择题有 1..n个答案选项
一个问题与其他问题有顺序关系(例如,自由文本问题必须遵循最喜欢的颜色 问题)
该系统由许多用户组成
用户回答多个投票
当用户回答投票时,他们会回答0..n个问题
当用户回答投票时,答案仅在以下情况下有效 用户完成所有必填问题
这表明您有两个多态实体 - 问题(可以是自由文本或多项选择)和答案(由于答案与问题相关,因此它也是自由文本或多项选择)。
您必须决定如何在模式中对此进行建模 - Stack Overflow 有很多关于此主题的问题 - 但我会选择最简单的。
Poll
-----
Poll_id
Question
------
Question_id
Poll_id
Sequence
Is_mandatory
Description
Question_option
-------------
Question_option_id
Question_id
Option_id
Sequence
Description
User
-----
User_id
Poll_session
------
Poll_session_id
User_id
Poll_id
Date
Status
Poll_session_answer
-----
Poll_session_id
Quesion_id
Free_text_answer
Question_option_id_answer