我正在制作5星评级,工作正常。现在我想优化数据库。
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`)
)
这是我目前的数据库。现在,如果10,000个用户对同一篇文章评分,我在一个表格中获得了10000条记录。
有人可以帮我理解和优化数据库吗?
答案 0 :(得分:1)
这取决于您的评级算法和要求 。您只需使用五个字段而不是一个字段记录收到的星数:
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,
...但是现在用户无法撤回他的投票,甚至不知道他是否已经投票。
(您可以通过将每日或每周投票存储到一个表格中,使用日期时间和选民ID以及其他任何内容进行妥协,然后在平均表格中“提取”旧的结果。现在投票人可以看到并撤消他在上一次做的事情。周)。
所以您需要做的是明确说明您的要求 - 用户可以做些什么?系统必须做什么?等 - 并制定需要知道哪些信息;然后从那里派生表格结构。如果数据太多(10,000,000条记录不多),您可以尝试向其投入更多硬件,或者查看是否可以某种方式进行扩展 - 例如,如果您不(通常)需要跨文章信息(例如“没有什么能阻止你根据文章ID在不同服务器上对评级表进行分区,直到每个分区都足够小,以满足你的口味。