1

我会说我的数据库知识是合理的,我为此使用了 MySQL (InnoDb),并且也完成了一些 Postgres 工作。反正...

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

我目前存储这些数据的计划:

  • POLLID、用户ID、决策、时间戳

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

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

我的问题是

  1. 有没有更有效的方法来存储/查询这个?
  2. 我会有关于 POLLID 或 POLLID 和 USERID 的索引(可能只是一个唯一约束)吗?或其他?
  3. 附加问题:为什么我不能像在 Postgres 中那样在我的表上选择 HASH 和 BTREE 索引?
4

1 回答 1

1

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

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

选项表:选项 id、文本。

将投票链接到选项的表:poll id->choice ids。

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

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

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

与使用 COUNT 进行迭代相比,您可以更轻松地查看结果。

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

这会告诉你有多少人在民意调查“pollid”中投票给了“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)
于 2012-09-17T13:46:09.483 回答