这种数据的最有效的数据库设计

时间:2012-09-17 13:33:39

标签: mysql sql database voting

我的数据库知识是合理的,我会说,我正在使用MySQL(InnoDb),并做了一些Postgres工作。总之...

  • 我有很多是或否的问题。
  • 很多人都可以为同一个民意调查做出贡献。
  • 用户可以选择任一选项,这将记录在数据库中。
  • 用户可以稍后改变主意并交换选择,这需要更新存储的数据。

我目前存储此数据的计划:

  • POLLID,USERID,DECISION,TIMESTAMP

显然用户数据在另一个表格中。

要添加他们的选择,我必须查询他们之前是否已投票并插入,否则,更新。 如果我想查看民意调查结果,每次有人想要查看民意调查时,我都需要遍历所有决策(尽管是索引部分)。

我的问题是

  1. 有没有更有效的方法来存储/查询这个?
  2. 我是否有关于POLLID或POLLID&的索引? USERID(也许只是一个独特的约束)?还是其他?
  3. 附加问题:为什么我没有选择在我的桌子上选择HASH vs BTREE索引,就像我在Postgres中一样?

1 个答案:

答案 0 :(得分:1)

设计听起来不错,有些想法:

民意调查表:民意调查,问题。

选择表:选择ID,文本。

将民意调查与选择联系起来的表格:民意调查id->选择ID。

用户表:用户详细信息,用户ID。

投票表:(用户ID,投票ID),选择ID,时间戳。 (括号是唯一的一对)

单个用户的插入/更新将正常工作,因为您可以检查是否存在用户ID和投票ID的条目。

通过使用COUNT,您可以更轻松地查看结果。

e.g.: SELECT COUNT(*) FROM votes WHERE pollid = id AND decision = choiceid

这会告诉你有多少人在民意调查中投了“choiceid”投票。

晚编辑:

如果它不存在,这是一种插入方式,如果存在则更新:

IF EXISTS (SELECT * FROM TableName WHERE UserId='Uid' AND PollId = 'pollid')
    UPDATE TableName SET (set values here) WHERE UserId='Uid' AND PollId = 'pollid'
ELSE   
    INSERT INTO TableName VALUES (insert values here)