社交网络通知逻辑

时间:2014-07-23 04:20:09

标签: php mysql notifications logic social

我正在研究某种社交网络。它类似于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(*)

我知道这对数据库来说是繁重的工作,所以有没有其他解决方案或者这没关系?

2 个答案:

答案 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”来改进此查询。