我们必须建立一个投票系统,让用户投票给不同职位的不同候选人。有一个选民登录。您如何存储一个选民的投票,然后将该投票添加到之前的投票中?唯一可能的方法是将每张选票存储在数据库中,对吗?但是数据库的结构会是什么样子呢?你怎么计算它?
编辑:
投票系统不仅有一组候选人可以投票。有市长、副市长、参议员等等,太多了。这就是为什么我很困惑。如果只是一个总统的投票系统,那就更容易了。因此,如果我有一张选民表格,其中有一列他/她投票的候选人,这是不可能的,因为选民投票给了许多候选人。
更好的方法是使用不同的表来存储投票。并且该表将具有两个属性(VoterId,CandidateId)如果您允许从此表中进行多票,您可以获取投票计数。
但最好将 VoterId 设为此表中的主键。避免多次投票
CandidateType : - (TypeId(PK), typeName, maxVotePerVoterForThisType)
选民表: - (voterId(PK), voterName, otherInfo)
候选人表:-(candidateId(PK),candidateName,选区,otherInfo,TypeId(FK))
投票:-(voterId(PK,FK),TypeId(PK,FK),candidateId(FK))
*编辑:- 使用原始帖子中更改的要求编辑的架构
*编辑: - 在 CandidateType 表中添加了一个字段以允许multiple votes
。(例如:现在选民可以投票10 Senators
,如果maxVotePerVoter
此类型设置为 10..)
您应该将每个候选人存储在一个表中,将位置存储在另一个表中,然后根据 ID 建立关系,投票系统相对简单:
数据库:
id, position_id, candidate_id, votes
然后 PHP
$query = "UPDATE `votes` SET `votes`=`votes`+1 WHERE `position_id`=1 AND candidate_id=1"; // adds 1 vote where position_id is 1 and candidate_id is 1
您的账户(选民)和候选人需要这 3 个表格。
Account: Id (PK), Name, Password
Candidates: Id (PK), Name
Votes: AccountId (PK), CandidateId (PK)
投票时在投票中插入一行。这可以防止由于 PK 导致的重复投票。
从问题的解释中,我可以建议您使用以下数据库结构:
tlb用户投票:
UserID(PK) | UserName | Vote | CandidateId(FK)
tlb候选人:
CandidateId(PK) | CandidateName | TotalVotes
通过这种结构,您可以将当前投票与以前的投票相加(通过先获取以前的投票并将其添加到当前投票)。
候选人的总票数也会更新。
我可以说您将投票用户存储在名为 users 的表中,您可以使用字段vaotecount
(int)类型初始化为零并跟踪他们的 ip 并为他们投票的主题 id 投票,当他们投票时,您可以检查 IP 和 topic_id 他们没有投票两次,如果他们通过了,您可以将该vaotecount
字段增加一
当您计票时,请计算您为其计票的主题 id 的用户。简单:D