I have a fairly complex community site (in php/mysql) with a number of "things" that the registered users can "watch".
"Things" are: Posts, comments, event updates, user status changes, etc. At least 10 different types of "things" are available and a user can watch any other user's "things" (Think facebook)
"Watch" means: A user can watch any "thing" and see a feed of all updates / additions to each "thing" across all types of "things".
I have built a similar app with far fewer "things" that can be watched and my setup was basically this:
'watches' table fields: id, userId, itemId [id in foreign table], itemClass [reference id of foreign table]
A user could add a 'watch', a record was created in the 'watches' table and then we'd poll that table (and cache it) so as they browsed we could note (on the UI) if they were already watching a particular item or not, PLUS they could see and manage a list of everything in the system that they were watching. Pretty simple.
So, (after that long-winded intro), this community site we're building is going to need to scale more dramatically. Thousands of users will have hundreds of "things" being watched and we will have to poll not only the 'watches' table per se, but each foreign, join table to get the details to fill each user's watch feed.
If you're confused about what I mean, just think of the facebook friend feed that you have on your facebook home page. How does that get updated without running tons of queries?