1

所以我想知道像 YouTube 这样的网站如何记住用户“喜欢”了一个视频并阻止他们再次喜欢它。同样,像 Reddit 这样的网站如何记住赞成票和反对票并阻止用户赞成他们已经赞成的内容。

它是否像数据库表一样简单,其中内容的 ID 与用户的 ID 及其响应一起存储?我觉得那会变成一张巨大的桌子。有什么更棘手的事情吗?

4

3 回答 3

9

这些网站要求您在点击“喜欢”和“点赞”之前登录。数据库中的内容文档将有一个字段,用于存储收到的点赞数。在呈现like 按钮之前,站点将检查登录用户在数据库中的记录,以检查他是否已经喜欢它——因此会显示“like”或“unlike”选项。

如果您在 Stackoverflow 中查看此处,如果您在自己的问题或答案上单击“upvote”,则会显示一条消息,您不能对我们自己的帖子进行投票。当您单击“upvote”时会发生什么情况,ajax 请求将使用用户 ID 和问题 ID 等其他信息发送到服务器,服务器代码将检查您是否被允许投票,即您的用户 ID 不应该相同作为帖子创建者的 ID。

于 2012-01-23T07:23:11.107 回答
2

我的页面上有一个喜欢/不喜欢的系统。

数据库表:

1.) 一个包含您的帖子,每个帖子都有一个唯一的 ID 和创建它的用户 ID(以及其他信息,如内容、标签等)。

2.) 表名为 likes,至少包含以下字段,ID,post_id(对应于 post 表中被喜欢或不喜欢的帖子),user_id(对应于 users 表中喜欢/不喜欢的用户),状态(0 或 1,0 表示喜欢帖子,1 表示不喜欢帖子)。

当用户喜欢一个帖子时,将该行插入到 likes 表中,其中包含他们的 user_id 和 post_id,将状态设置为 0(或者只留空,因为 0 是默认值)。当用户不喜欢某个帖子时,执行相同操作,但将状态设置为 1。

这样,在帖子页面上,您可以获得喜欢或不喜欢帖子的所有用户的数量。在用户的个人资料页面上,您可以获得用户喜欢或不喜欢的所有帖子。您还可以对最喜欢或最不喜欢的帖子进行排名。甚至可以根据发布内容最喜欢或最不喜欢的人来对特定用户进行排名。

如果用户已经在数据库中有记录,则不允许用户喜欢/不喜欢帖子。(基本上只检查 likes 表中 post_id 等于当前帖子且 user_id 等于登录用户的记录数)

交叉引用 post 表以获取 post 的作者的 user_id。如果帖子作者 user_id 与登录用户相同,或者该用户当前未登录,则不允许他们投票。

The queries for doing all of those are simple (simply SELECT * or SELECT user_id) but that is the basic idea.

于 2012-01-23T19:16:38.293 回答
-4

是的,就是这么简单。通常,网站使用 IP 地址,因此用户不会对不同的帐户进行两次投票。

编辑:对不起,我错了。根据 Quentin 的说法,网站不会以 IP 为基础,因为多个用户可能拥有相同的 IP 并且没有试图利用该系统。较小规模的网站(至少我使用过的一些网站)已经实施了基于 IP 的投票系统,因为否则会更容易操纵内容排名。

于 2012-01-23T07:06:43.143 回答