Click here to Skip to main content
15,898,588 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am just trying to figure out how facebook's database is structured for tracking notifications.

Wont go much into complexity like facebook is. If we imagine a simple table structure for notificaitons

notifications (id, userid, update, time);

We can get the notifications of friends using
SQL
SELECT `userid`, `update`, `time`
FROM `notifications`
WHERE `userid` IN
(... query for getting friends...)


However what should be the table structure to check out which notifications has been read and which hasn't ?


I dont know if this is the best way to do this, but since I got no ideas from anyone else, this is what I would be doing.


We have 2 tables

SQL
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


The idea is to select notifications from notifications table and join the notificationsRead table and check the last read notification and rows with ID > notificationid. And each time the notifications page is opened update the row from notificationsRead table.

The query for unread notifications I guess would be like this..

SQL
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...
 ))


The query above is not checked.

Now my understanding is that when a notification is added, we need to find the users friends and insert all those rows(a notification per friend) in the notification table right ? If this is correct, then, what would be the best way to achieve this ?

Triggers?
Write T-SQL (sql query in server side) to Select all the friends and then use SQL bulk copy?
Posted
Updated 3-Apr-13 20:30pm
v2

1 solution

Firstly, I think facebook is based on a NoSQL database architecture... But...

What I would do is have each users notification sequence have a sequential notificationId. Then if A is subscribed to or following or friended B then in the subscription link, record what the last read notificationId is and present everything greater.

This way you are only tracking where A is up to in B's notification sequence, not a record for every notification.

Should C also follow B, then the start point can easily be set to the current notificationId, so all the history doesn't appear.

Does this make sense, and help?
 
Share this answer
 
Comments
Member 7781963 5-Apr-13 4:23am    
Thanks for the answer. Can you please show me the DB Design? I am unable to understand your answer. Thanks.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900