我只是想弄清楚Facebook的数据库如何构造用于跟踪通知。
我不会像Facebook这样深入研究复杂性。如果我们想象一个简单的通知表结构:
notifications (id, userid, update, time);
我们可以使用以下方式获取朋友的通知:
SELECT `userid`, `update`, `time` FROM `notifications` WHERE `userid` IN (... query for getting friends...)
但是,应该使用什么表结构来检查已读取和未读取哪些通知?
我不知道这是否是执行此操作的最佳方法,但是由于我没有别人的想法,所以我会这样做。我希望这个答案也能对其他人有所帮助。
我们有2张桌子
notification ----------------- id (pk) userid notification_type (for complexity like notifications for pictures, videos, apps etc.) notification time notificationsRead -------------------- id (pk) (i dont think this field is required, anyways) lasttime_read userid
这个想法是从通知表中选择通知,并加入notificationsRead表,并检查最后读取的通知和ID> Notificationid的行。并且每次打开通知页面时,都会更新notificationsRead表中的行。
我想查询未读通知的查询将是这样。
SELECT `userid`, `notification`, `time` from `notifications` `notificationsRead` WHERE `notifications`.`userid` IN ( ... query to get a list of friends ...) AND (`notifications`.`time` > ( SELECT `notificationsRead`.`lasttime_read` FROM `notificationsRead` WHERE `notificationsRead`.`userid` = ...$userid... ))
上面的查询未选中。感谢@espais的db design的想法