开发者社区> 问答> 正文

如何设计一个“已读”系统?

首页内容源全部用户是一致的,是若干新闻
每个用户点开一个新闻后,该新闻将标记为“已读”,该用户再刷新首页这条新闻就在首页不存在了,也就是说首页仅存在用户未读过的新闻

那么这样的数据库表结构应如何设计?
每个用户首页列出新闻的 SQL 语句应该是怎样的?

(主要的问题并不是如何设计表结构来储存用户“已读”的新闻,而是首页如何根据用户已读的新闻列出每个用户不同的首页内容,即首页 SQL 应该是怎样的)

展开
收起
a123456678 2016-07-01 15:09:25 2653 0
1 条回答
写回答
取消 提交回答
  • 这个问题是一个很综合的问题,不是单靠 SQL 就能很好解决的(虽然也能)。

    按你的思路分析技术可行性
    新闻和每个人的已读状态,其实是一张二维表,横纵坐标分别是新闻ID和用户ID,这张二维表的大小是新闻数和用户数的乘积,那是相当的大。

    所以,从建表来说,不管你是建一张新闻与用户的状态关系表,还是为用户建一张已读新闻状态表或者为新闻建一张已读用户状态表,都不是很好的方案。

    如果是新闻用户状态关系表,假如有10,000用户,1,000新闻,这张表的数据在最大的情况会有10,000,000条记录。
    建用户的新闻状态表和建新闻的用户状态表都一样,需要个巨大的字段,一般可能是TEXT和BLOB,非常不利用搜索。
    在这种情况下,即使使用 No-SQL,都难以解决问题。所以需要变通。

    分析合理的需求
    首先一个问题,你显示在首页上的新闻可能会显示很旧的新闻么?换句话说,如果所有近一个月的新闻该用户都读完了,你会把上个月的新闻显示给他么……?不会吧!这样的话,新闻本身已经没有意义了。

    那么,合理的作法是什么呢?应该是显示在某个时间段内的新闻,比如最近3天。先限定一个范围,然后再来思考这个范围内的逻辑。

    但是要加一个逻辑处理,就是这3天的新闻,用户都看完了怎么办?理论上来说,应该显示最新的新闻出来,即使已经看过了。

    当然这只是一个粗略的分析,具体是什么情况我并不清楚,需要你自己根据需求去研究细化。

    合理需求下的实现
    近3天的新闻已经是一个不大的量了,在这个范围内,完全可以按照之前的想法进行实施,不管用上面哪种方法,都不会有巨大的数据量(当然要记得删旧数据,即3天前的相关数据)。

    2019-07-17 19:50:05
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载