【问题标题】:Multiple vote options storing in MySQL table存储在 MySQL 表中的多个投票选项
【发布时间】:2013-07-16 23:01:06
【问题描述】:

我有一个未定义选项的民意调查(它只能有 2 个选项,但也可以有 10 个或 20 个或更多选项可供选择)。我需要将当前的投票计数存储在 MySQL 表中。我想不出一种集中的方式来存储它们,除了: 创建一个字段 vote_count 并存储映射到计数的投票选项的序列化数组。 当新的投票数据进入该字段时,读取、反序列化、递增适当的值,然后写入该字段。这需要 2 个查询,每秒可能有 5 个或更多投票。

所以我需要一种方法来存储未知数量的投票选项的投票计数并能够快速访问它(我需要投票页面上显示的每个选项的最新计数)并快速更新它(当有新投票时进来)。它必须在 MySQL 表中。投票选项的数量没有“上限”。

【问题讨论】:

  • 您能否提供一些示例数据来更好地说明问题?
  • @GordonLinoff,解决方案现在是一个公认的答案。想象一下,我有两个投票:Do you agree: yes | noDo you disagree: yes | no | maybe 现在我需要在 MySQL 表中存储每个选项的计数。我不能简单地为“是”、“否”和“可能”创建一个字段,因为并非每个民意调查都使用它们,并且可能有 30 或 40 个选项还不是字段,这意味着我每次都需要更改表新民意调查已创建。

标签: mysql count voting voting-system


【解决方案1】:

处理多值属性或重复值的规范模式是添加第二个表。

考虑一个可以包含多个订单项的采购订单。我们在子表中表示行项目,外键指向采购订单表中的父表:

CREATE TABLE `purchase_order` (id int not null, foo varchar(200), ... );
CREATE TABLE `line_item` (id int not null, order_id int not null, ... ); 
ALTER TABLE `line_item` ADD FOREIGN KEY (order_id) REFERENCES order(id) ;


INSERT INTO purchase_order (id, foo) VALUES (101, 'bar'); 

INSERT INTO purchase_order (id, order_id) VALUES (783, 101);
INSERT INTO purchase_order (id, order_id) VALUES (784, 101);
INSERT INTO purchase_order (id, order_id) VALUES (785, 101);

我们可以获得与采购订单关联的订单项的计数,如下所示:

SELECT COUNT(1)
  FROM line_item 
 WHERE order_id = 101; 

或者,我们可以获取每个采购订单的订单项计数,如下所示:

SELECT o.id, COUNT(l.id) AS count_line_itesm
  FROM purchase_order o
  LEFT
  JOIN line_item l
    ON l.order_id = o.id
 GROUP BY o.id 

在您的情况下,您需要表示哪些实体(人、地点、事物、概念或事件;可以唯一标识,您需要存储相关信息。

我很难概念化你需要代表什么实体。

poll -
poll_question - a single question on a given poll
poll_question_answer - a possible answer to a question to a given poll question
voter - 
ballot - associated with one voter and one poll (?)
vote - the answer given to a particular poll question

良好的数据库设计来自对实体和关系的理解,以及开发合适的模型。

【讨论】:

  • 谢谢。这就是我要做的。为每个投票提供一个只有答案选项的表格。
【解决方案2】:

你不能只有一个问题表和另一个可能的答案表(每个问题多行,你想要多少行)。然后将计数存储在答案表中,或者(更好)有另一个实际输入的答案表(这样您可以记录做答案的人的详细信息,并轻松使用 SUM / COUNT 计算每个人的投票数选项有)。

【讨论】:

  • 是的。打算这样做。虽然斯宾塞先回答了..但无论如何谢谢。
  • +1。这是我会采用的方法,一个父表和一个带有外键的子表。
  • 没问题,虽然我似乎是第一个到达那里的 ;-)
猜你喜欢
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多