我有一个选票列表,看起来像 A>B>C>D>E,其中一些看起来像 A>B>C=D=E。选票位于文本文件中,每张选票各占一行。我想为每个候选人分配分值。对于 A>B>C>D>E,A 应获得第 4 分,B 应获得 3 分,C 2,D 1,E 0。对于 A>B>C=D=E,A 应获得4 分,B 应该得到 3 分,因为 C、D 和 E 是平局,所以他们应该平分剩下的 3 分,这样他们就各得 1 分。我希望计算文本文件中的所有选票并将选票相加。您认为做到这一点最简单的方法是什么?
我正在建立一个网站(使用PHP,JavaScript和MySQL),投票系统允许人们匿名投票但只投一次.
这意味着我的系统必须知道谁投票(因为我必须检查用户是否已经投票)但我不想将用户名或用户的IP地址存储在数据库中(破坏匿名).我不知道怎么开始,我需要一些指导; 我应该找什么?
我希望人们能够在我的网站上投票,但我不喜欢强制注册的网站.所以我的问题是,是否有任何方式可以上/下投票,将投票保存在数据库中,并确保一个人只能投票一次?如果不使用cookie,我觉得很容易清除cookie并再次投票.
我正在实现一种投票功能,以允许用户对自己喜欢的图像进行投票。他们只能投票3张图像。或多或少。因此,我正在使用复选框对其进行验证。我需要将这些选票存储在数据库中。
这是我到目前为止所拥有的:
| voteID | 名称| emailAddress | ICNo | imageID
(其中imageID是Images表的外键)
我仍在学习数据库系统,考虑到某些字段(例如电子邮件地址和IC编号)必须重复,因此我觉得这不是一个好的数据库设计。
例如,
|voteID | name| emailAddress | ICNo | imageID
1 BG email@example.com G822A28A 10
2 BG email@example.com G822A28A 11
3 BG email@example.com G822A28A 12
4 MO email2@example.com G111283Z 10
Run Code Online (Sandbox Code Playgroud) 我有一个投票系统的网站(喜欢/不喜欢).
该应用程序是由另一个开发人员开发的,现在网站越来越大,性能得到认真考虑.
我有下表:
CREATE TABLE `vote` (
`id` int(11) NOT NULL auto_increment,
`article_id` int(11) NOT NULL,
`token` varchar(64) collate utf8_unicode_ci NOT NULL,
`type` int(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `article_id` (`article_id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
令牌列用于标识每个用户/投票/日期,它是一个唯一令牌,它是用户指纹的一部分,允许他们投票一次并更改其投票类型.
最慢的查询之一是以下内容:
SELECT count(*) AS `nb` FROM `vote` WHERE (token = '00123456789012345678901234567890');
Run Code Online (Sandbox Code Playgroud)
当服务器没有关闭时,有时需要几乎10秒的时间才能返回.
我不能在这里使用缓存,因为我需要实时检查是否允许投票并增加计数.
我无法改变太多的应用程序逻辑,因为它依赖于应用程序中任何地方使用的太多依赖项(它设计得很糟糕).
所以我正在寻找改进甚至一些性能的选项.
编辑:我在令牌列上有一个索引
有大约2,000,000行,所有令牌几乎都是唯一的
编辑:
我提出了所有建议的基准:
Top average queries
1. SELECT COUNT(*) AS nb FROM `vote` WHERE (`token` = '%s') completed in 2.19790604115 sec
2. SELECT COUNT(`id`) AS nb FROM …
Run Code Online (Sandbox Code Playgroud) 所以我想知道像YouTube这样的网站如何记住用户"喜欢"视频并阻止他们再次喜欢它.类似地,像Reddit这样的网站如何记住upvotes和downvotes,并阻止用户提升他们已经投票的内容.
它是否像数据库表一样简单,其中存储内容的ID以及用户的ID及其响应?我觉得那会成为一张巨大的桌子.有什么比较棘手的事情吗?