-4

First of all sorry for the wall of text :S

Ok, here is my problem. I'm building a web app with codeigniter and mysql. Main thing will be that ppl will leave posts, other will rate it, leave comments etc. Now, when i think of it, doing update to database on every single vote up/down is pretty supid, right? I mean what if 500+ ppl are on site and they are reading + voting posts... that would crash my site like instant (or would it, i rly don't know), since I would have so many queries for every single vote up/down. So, my question is, how to solve this? Some global associative array to store id of the post as a key and +1/-1 as a value? And than some sort of "timed sql query" (if there is such thing?) to update votes lets say every 2 or 5 mins or so, and just "refresh" vote counter with ajax until I update database? Basically I'm thinking best performance in case my site goes boom :P. Can it be done with page caching or idk?

2nd issue is that u won't have to register to leave post/vote other post (i have figured everything about it, u can't post spam/garbage), but the main issue for me is how to limit one vote per post per user, since they are guests? What i googled out (was very vague) is presistent cookies, so is it the way to go or no?

I'm not asking for sample codes, just for some guide lines what to research, how to approach the problem, where to look, to get a solution. If u have some suggestions on how to solve this, it would be VERY appreciated.

Thank you, and again, sorry for the wall of text.

4

2 回答 2

0

1)您将投票存储在数据库中并根据需要通过 ajax 进行更新,让 ajax 每 30 秒自动更新最终用户的计数。您最大的问题是存储在表中的项目数量(10,000 条记录意味着您需要实现索引等)。

你只需要有 1 个基于 $action 的 php 函数,有 + 或 - 的情况。SQL 查询实际上会相当简单。

虽然您会在应用程序中的某些元素周围遇到个别瓶颈,但如果您保留适当的记录等,您总是可以解决问题。只需注意“更新”,它会告诉人们当前的投票情况 + 自动更新,实际上 1 个元素的 ajax 刷新比再次加载整个页面更可取,只是为了显示更新后的计数,所以它真的是一把双刃剑.

2)不要。相信。这。用户。饼干很糟糕。使用它们来查明是否有人在篡改数据,然后在怀疑他们时阻止访问。再次将用户数据存储在数据库中,但是鉴于没有登录名或用户凭据,您只能将 IP 地址和用户代理存储为有用的详细信息 - 同样,这些可以在客户端进行操作,所以您真的可以信任他们?

Gl,高频。

于 2013-11-12T12:30:25.857 回答
0

这是我的 0.02 美元...

对于投票系统,您别无选择,只能立即更新数据库中的表。您可以将更新包含在事务中并实现某种队列,但对于 500 人来说,我怀疑这是必要的,因为 MySQL 每秒可以处理数千个查询(当然取决于查询),而其他数据库可以走得更远。一个好的经验法则是在必要时进行优化,而不是过早地进行优化。所以我对此的建议是继续尝试。

其次,关于注册用户问题——假设您设置了一个带有持久 cookie 的投票系统。这意味着一旦你设置了一个 cookie,它就会一直存在,除非用户删除它。

现在想象一个恶意用户想要非常糟糕地投票 - 他将尝试想出一个脚本来访问 URL、投票、删除他的 cookie,然后从头开始直到他获得 10000 票。不好。

您可以通过 IP 地址限制他,但使用代理/Tor 是如此微不足道,以至于不值得一提。这就是为什么许多系统(包括 SO)需要在投票/评论/执行任何可能成为非常讨厌的垃圾邮件的操作之前进行注册。

最后,如果您以前从未构建过这样的系统,但您想学习如何正确地完成这项工作,那么您首先要做的就是研究。谷歌您能想到的与该问题相关的所有内容。在 Stack Overflow 中搜索。将整个系统分解为非常小的部分,然后问自己“我怎么能这样做?” 直到你开始用代码来想象它。一项好的研究将在以后为您省去很多麻烦,并将帮助您发展您的编程技能。

干杯!

于 2013-11-12T12:31:08.917 回答