我有一个名为topic
的表,其中有一个名为like_count
的列。
是否可以在该表上写一个查询,询问“过去7天内给出我最喜欢的十大主题”,这意味着过去7天内对他们最喜欢的10个主题,没有创建一个额外的审计表?
我正在考虑通过创建一些审核表来实现这一目标,例如topic_like_audit
只有两列:topic_id
和created_at
。每当具有该ID的主题被喜欢时,新记录将存储在审计表中。然后,我可以编写一个查询,使用created_at
列聚合过去7天内的所有结果,并按照该时间范围内记录数量最多的结果进行排名。
但是我无法想象这是一个可扩展的解决方案......它可能在短期内起作用,但当你的主题有数百万甚至数十万的喜欢时,这肯定是坏事。
做这样的事情的任何好的,标准的解决方案,还是我的方法足够?附:我是DB noob。
答案 0 :(得分:1)
这取决于你是否可以容忍你的插入有点慢。
您可以做的是,最初您可以通过某些查询生成前十个主题的数据。 你可以在mysql或任何缓存层中维护这个列表。如果你维持在缓存级别会很好,因为你希望你的检索速度很快。
在新主题的每次插入时,您可以将当前主题与列表中的最小主题进行比较,如果当前较大,则可以交换它们。您可以使用优先级队列作为此事物的数据结构,从而导致O(logn)时间。
此过程可以进一步延迟,因为您最终可以拥有一致的系统而不是一致的系统。您可以将其推送到队列中,这可以由工作人员进一步处理。
答案 1 :(得分:1)
听起来你不能告诉他们什么时候喜欢""发生了?与每个"喜欢" (或者批次"喜欢")到日期时间(或者只是一天),你不能这样做。
当"喜欢"发生时,将其存储在包含TodaysLikes
和topic
的表格datetime
)中。在每天结束时,将昨天的数据汇总到包含LikesSummary
,topic
(非日期时间)和date
的摘要表(count
)中。然后将其从TodaysLikes
中删除。
然后这将获得前10名:
SELECT topic, SUM(count) AS likes
FROM LikesSummary
WHERE date >= CURDATE() - INTERVAL 7 DAY
ORDER BY likes DESC
LIMIT 10
进一步的优化不是直接将like_count
作为"喜欢"发生,但作为夜间摘要的一部分。 (这意味着like_count
不是最新的,但只计算在昨晚。