如何实现像Facebook这样的通知系统?

时间:2012-09-21 07:49:09

标签: php mysql facebook

我想做一个类似Facebook的通知系统,但我不能想办法,如何实现它。

我在这里读到了各种各样的意见,比如有一张桌子,其他人说要有两张。

然而,我只尝试了最有效的方法,只有neccesarry数据条目。 到目前为止,这是我的notfication表: id,uid,type,read(boolean),date。

所以我想到了一个例子:

插入评论,呼叫通知功能,插入我的uid(user_id),输入(评论,等等),阅读=' 1',NOW()。

我将读数设置为1,因为我不希望在发布内容时收到通知。然后我想我会通过将所有其他用户的读数设置为0来更新notification,因为他们还没有读过这篇新帖子。

但是现在我想到的是另一篇文章将在5秒后发布或者其他什么。然后所有其他read条目再次设置为0,这是正确的,但在这种情况下,我不能想到为每个单个用户显示(SELECT)正确的结果。 因为没有指定哪个用户错过了哪些新通知。

我希望你能跟随我并提出任何建议。如果我以错误的方式做这件事,我也会很感激。

2 个答案:

答案 0 :(得分:5)

首先,您必须知道您的通知是否广泛投放到您的所有用途,还是可以是用户特定的。在Facebook的情况下,我会说这是第二种选择。

我的第一个建议是找到一个实现此功能并查看其代码的开源项目(或者甚至可能是2个)。

我的第二个建议是写下此功能的所有要求,通常,一个小的限制可以引起对表结构的修改甚至添加新表(例如,可以发送通知到一次有多个用户?用户可以向另一个用户发送通知吗?...)。

这是我的方式,使用2个表,一个用于消息,一个用于与用户的NtoN关系: 表格通知

ID // auto increment ID
sender_id // Can be a subsystem or another user. To be defined / optional. Does not have to be a foreign key.
title // Title of the notification
body // The text message
type // warning, message, error or any notification class you can think of
... // you can add other options, like priority, attachment...

表格Notification_User

notification_id // Foreign Key for the notification
receiver_id // Foreign Key for the user
is_read // is the notification read
is_deleted // is the notification deleted, this implements a Trash bin like feature
created_at // time at which the notification was sent
read_at // time at which the notification was read
deleted_at // Time at which the notification was deleted

答案 1 :(得分:3)

我建议您使用包含列(notification_id和notification_msg和create_date)的通知表来存储所有通知。然后让另一个表notification_user包含列(userid,notificationid,read),您可以使用通知ID存储所有userid。 因此,如果您为1000个用户说了一个通知,则将消息存储在第一个表中,然后将1000个用户的ID和通知ID存储在第二个表中。这样,您可以轻松跟踪用户何时阅读特定通知并将读数设置为1。