-1

我正在设计一个大型网站

为了防止重复投票,我将用户的投票(userid,postid)存储在数据库中(我现在使用 mysql)

哪一个更好?1-每个用户只有一行,并将他投票的所有 postid 作为文本字段存储在那里。2-每票有一行并将其存储为integer

谢谢

4

2 回答 2

1

正确的方法是您的第二个选择。关系数据库擅长这些东西。

用anduservotes的主键创建一个名为 or 的表。这会自动防止添加重复投票。这也意味着您可以:useridpostid

SELECT SUM(vote) FROM uservotes WHERE postid=42;

并不是说您会那样做...您可能只是将总投票数存储在帖子本身上。

于 2013-07-12T04:50:58.400 回答
1

几点注意事项:

  1. 基于文本的方法有溢出的潜力。您将不得不为该文本字段设置最大大小,即使这样,足够多的投票数也会超出容量并导致您的代码失败。
  2. 基于文本的方法可能会非常缓慢。假设我为 100,000 个帖子投票。检查我是否为 Post X 投票将涉及下载这 100,000 个帖子 ID,将它们解析成一个数组,并检查数组中 Post X 的 ID。这将比 的索引查询慢得多SELECT 1 FROM votes WHERE user_id = X and post_id = Y LIMIT 1;,后者将始终以几乎完全相同的速度运行:如果它被索引,则非常快。(如果不是,它本质上会与基于文本的方法做同样的事情,而且速度非常慢,所以索引在这里非常重要!)另外,请注意,如果你使用 MySQLLONGTEXT来避免问题 #1,你就站在每次要检查单次投票时传输最多 4GB 的数据。哇。

以我的经验,你的每行投票方法实际上会容易实现(尤其是当你熟悉 SQL 之后),会更好地扩展,并且可能会出现更少的问题。关系数据库在一定程度上变得不可行,但对于几乎所有用户而言,充分发挥 SQL 的潜力是获得出色性能的最佳方式。

于 2013-07-12T04:52:31.047 回答