【问题标题】:Rating System in PHP and MySQLPHP 和 MySQL 中的评分系统
【发布时间】:2010-11-14 07:32:49
【问题描述】:

如果我们查看 stackoverflow 网站,我们就有投票权。但问题是,存储谁投票谁没有投票的最佳方式是什么。让我们进一步简化这一点,说我们只能投票赞成,我们只能删除赞成票。

我想把桌子做成这样的形式

question - Id(INT) | userId(INT) | title(TEXT) | vote(INT) | ratedBy(TEXT)

剩下的三个是不言自明的,但 ratingBy 是用户的逗号分隔 ID 值。

我正在考虑阅读 ratedBy 并将其与当前登录用户的 userId 进行比较。如果他不存在于 ratedBy 中,他可以投票赞成,否则他可以删除他的投票。这又会从 ratedBy

中删除该值

【问题讨论】:

  • 如果之前已经讨论过,请重定向我:D

标签: php mysql architecture


【解决方案1】:

我认为让另一张桌子“投票”更好。用户和投票之间的关系是 n 到 n,因此应该创建一个新表。应该是这样的:

question id (int) | user id (int) | permanent (bool) | timestamp (datetime)

永久字段可用于在给定时间后保留投票,就像 SO 一样。
可以根据需要的特征添加其他字段。 由于每行至少需要 16B,因此在表使用 4GB 之前,表中最多可以有 250M 行(如果每个表有一个存档,则为 fat32 限制,这是 MyISAM 和 InnoDB 的情况)。
此外,正如 Matthew Scharley 在评论中指出的那样,不要一次将所有选票加载到内存中(就像获取结果集中的所有表格一样)。您始终可以使用 LIMIT 子句来缩小查询结果的范围。

【讨论】:

  • 但这留下了一个问题,随着时间的推移,那是一张非常大的桌子
  • 然后呢?我以前使用过数百万条记录(日志记录)表。只要你的表是精心设计的(读作:索引,不像最初的记录表......呃。)它不会(太)慢。
  • 酷,只是确认一下。 Il 索引 userId 和 questionId,并使它们成为主键。这样我想我可以避免检查:D
  • 另一个潜在的陷阱是,不要试图一次获取整个表!将数百万行加载到内存中可能会在某处杀死链中的某些内容...
【解决方案2】:

一个新表:

文章 ID |用户名 |评分

文章 ID 和用户 ID 构成复合键,评分为 1,表示赞成,-1 表示反对,0 表示已删除投票(或仅删除该行)。

【讨论】:

    【解决方案3】:

    我相信您的设计无法针对大量选民进行扩展。 典型的做法是创建表

    表 1:问题 - Id(INT) |用户 ID(INT) |标题(文本)
    表 2:问题 - ID(INT) |投票(INT) |评价者(文本)

    然后你可以用这样的查询来计算选票:

    SELECT t1.question_Id, t1.userId, t1.title, t2.sum(vote)
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.question_id = t2.question_id
    

    【讨论】:

    • 你是说创建两个表格来链接投票总是比文本处理更快吗?
    • 到目前为止,我主要使用 mysql 和 oracle 的经验是,数据库更擅长处理表和连接。此外,您可以添加索引,这将允许您更快地进行聚合(获得投票的总和)并检查用户已经为某个问题投票的天气。数据库检查索引并直接转到适当的行,而不考虑其余数据。但是,您应该记住,要查看这两种方法之间的任何差异,您需要对每个问题进行大量投票(几千甚至更多)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2011-03-31
    相关资源
    最近更新 更多