Poll +说明数据库可以更新

时间:2017-03-16 11:18:12

标签: php mysql database database-design

我已经为我的用户提供了以下投票表格,但我不确定如何围绕它构建数据库。

用户将获得20-30个民意调查问题,如下所示:

你最喜欢的颜色是什么?

  • 绿色
  • 黄色
  • 红色
  • 其他

将能够选择上述答案之一,并must also provide around 100 words解释他选择答案的原因。

我目前有两张桌子。持有民意调查问题的人和持有民意调查选项的人。我不确定的是如何保持用户的答案。

事情是因为民意调查是如此之大,用户可以部分地进行,稍后回来,改变他的答案并继续前进,直到他100%完成,这样我才能够在我的面板中查看整个结果。所以他基本上可以保存他的进度并随时改变它。最重要的是,我想"删除"针对特定用户的整个民意调查,并能够重新进行重新调整,但同时保留他之前答案的历史记录。

所以我不确定这样的表是否是满足我需求的最佳选择:

id
user_id
poll_questiond
poll_answer
poll_text
last_update
status
似乎这样的事情会造成巨大的混乱。有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我会创建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 :(得分:0)

如果您使用半结构化语言定义问题域,我认为您会发现它更容易。您可以决定将某些逻辑委托给应用程序层,而不是嵌入到数据库模式中 - 例如,在应用程序层中保存部分完成的轮询可能会更容易。

您可以从这样的事情开始,捕获域中的主要实体及其关系,但不捕获它们的属性。

  

该系统包含许多民意调查

     

一次民意调查有很多问题问题属于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