Mark read tuples are the user ID, the begin post ID of the tuple, and the end post ID of the tuple. If a post's ID is within a tuple's range and not in a save list for the user, it's considered 'read'.
So each week:
- Figure out the highest post ID older than 6 months.
- That becomes the new limiter ID.
- For each user, delete all read tuples where end_post_id <= limiter.
- If a tuple remains that has begin_post_id < limiter, set begin_post_id = limiter.
Now all queries looking for unread posts do two things:
- add a where clause: id > limiter
- look in the read tuples for that user to make sure it isn't marked read
- look in the saved list to see if it's saved anyways.
For the alternative, each category and article gets a mark read date per user. Then the articles go through the same aging process (but probably something more like the last 50 articles, or whatever) and the mark read stamps get pruned accordingly.
And actually what I'm talking about with respect to articles is original content (like one of Andrew's amazing culinary discussions) with trusted users and possibly submission queues. Links to outside articles would have a submission queue as well, with a link and a fair-use quote.