我正在研究某种社交网络。它类似于twitter / instagram,有用户,他们可以互相关注,发帖,撰写评论和制作喜欢。
我已经实施了一个通知系统,用户可以获得有关他所关注的人的活动的信息(他们喜欢和评论的内容)。
我使用了mysql查询。 这是查询的简化版本:
SELECT t.type, t.param1, t.param2, t.date_time FROM (
SELECT 'like' as type,
likes.user_id as param1,
likes.user_name as param2,
likes.date_time as date_time,
FROM likes
WHERE (SOME CONDITION GOES HERE)
UNION ALL
SELECT 'comment' as type,
comments.user_id as param1,
comments.user_name as param2,
comments.date_time as date_time,
FROM comments
WHERE (SOME CONDITION GOES HERE)
) as t ORDER BY t.date_time ASC
一切正常。
我的下一步要向用户展示他已收到多少新通知。
为此,我有一个解决方案,我想问你是否有效/或者你知道如何更好地实现它。
所以,解决方案是: 我将创建一个字段&total -notifications'在用户表中。 每次用户访问网站时,我都会获取mysql统计所有通知和 如果有多个通知而不是用户的字段,我会将它们之间的差异显示为' new'。
换句话说,每次用户访问网站时都会调用上面写的那种查询,但SELECT t.type
代替SELECT count(*)
。
我知道这对数据库来说是繁重的工作,所以有没有其他解决方案或者这没关系?
答案 0 :(得分:0)
好吧,创建一个名为notification store的新表,用户ID,通知类型,内容,看到的字段(bool)
然后,当发生任何事情时,在该表中添加所需的值。
然后在用户检查网站时执行
SELECT COUNT(*) WHERE user_id= current user id AND seen = 0.
然后使所有这些字段的值等于1,以便用户看到它们。
我希望我理解你的问题。
答案 1 :(得分:0)
首先,带有WHERE的SELECT计数(*)将扫描整个表/索引以返回计数。如果表具有适合查询的覆盖索引,它将基本上非常快,因为它只扫描索引。否则,它扫描整个表然后非常糟糕。对于total_notifications问题,您必须执行2个查询并比较该值以获取“新”。问题是你只想获得“新”,它假设只占所有活动的一小部分,但如果你明白我的意思,它必须获取这个查询中的所有活动行。我建议你添加一个新的字段名称“status”,其值为(“new”,“read”)。您还应该在覆盖索引中索引此字段。为了获得“新”,您只能运行1个查询,过滤行具有status ='new'。有了一个好的索引,这个查询会快速超级,它假设扫描一小部分索引。
SELECT count(*) as t_new FROM (
SELECT 'like' as type
FROM likes
WHERE (SOME CONDITION GOES HERE) AND status='New'
UNION ALL
SELECT 'comment' as type
FROM comments
WHERE (SOME CONDITION GOES HERE) AND status='New'
) as t
我相信您甚至可以通过在WHERE中添加“date_time> timestamp_of_last_activity_user_seen”来改进此查询。