我正在做五星级的工作,效果很好。现在我想优化数据库。

CREATE TABLE IF NOT EXISTS `rating` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `article_id` int(11) NOT NULL,
  `vote` float NOT NULL,
  'user_id' int(11) NOT NULL

  PRIMARY KEY (`id`)
)

这是我现在的数据库。现在如果10000个用户评价同一篇文章,我在一个表中得到10000条记录。
有谁能帮我理解和优化数据库吗?

最佳答案

这取决于你的评分算法和要求。您只需使用五个字段而不是一个字段记录接收到的星星数:

star1    integer not null default 0,
star2    integer not null default 0,
...
star5    integer not null default 0,

但如果你这样做了,你就失去了"cooling off" ratings和改变用户想法的可能性。
另一方面,this accepted answer algorithm只需要存储平均值,这样就可以存储
stars    integer not null default 0,
voters   integer not null default 0,

……但现在用户无法撤回投票,甚至不知道他是否投票。
(您可以通过将每日或每周的投票存储到一个表中,包括datetime和voter id等等,然后在average表中“提取”较旧的结果来进行折衷。现在选民可以看到并撤销他上周所做的一切。
所以你需要做的是清楚地说明你的需求-用户能做什么?系统必须能够做什么?等等-并找出需要知道的信息;然后从中派生出表结构。如果数据太多(10000000条记录不多),您可以尝试向它投入更多的硬件,或者看看是否可以以某种方式扩展—例如,如果您(经常)不需要跨项目的信息(例如“最有星级的文章”),没有什么可以阻止您根据项目id在不同服务器上划分评级表,直到每个分区足够小,适合您的口味。

关于php - 使用MySQL在php中进行星级评定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40212158/

10-09 00:55