最近项目中碰到了一个需求:对一条新闻实现点赞功能(点赞,取消点赞,是否已点赞):web
一:一开始是打算在新闻表中用一个字段来记录这条新闻的点赞总数,后面想到假设有不少人对这条新闻进行点赞和取消点赞的操做的话,没作一个操做都要进行一次数据库的读写,会比较消耗性能,因此后面转变了一下思路:设计一张中间表记录下用户id,新闻id,点赞的时候新建一条数据,取消点赞的话就删除一条数据,而后这条新闻的点赞数,是否已点赞(登陆用户)就均可以获得了;点赞数的话只要根据新闻id统计下数量便可,是否已点赞:只需根据用户id,新闻id查找是否存在记录便可;咱们还能够在中间表中添加一个字段source_type来表示来自哪一个终端(web,wechat等),后续就能够统计各个终端的状况了;如今的中间表以下:sql
新闻点赞表: id 、repId(新闻id)、userId(用户id)、sourceType(来源终端);
二:如今的新闻通常下面都会有网友的评论,虽然项目暂时还无需实现这样的要求,可是咱们也能够来思考一下。按照上面点赞功能的思路,评论是否是也能够借鉴一下呢?可能咱们会想再加一个关联表:数据库
评论表: id 、repId(新闻id)、userId(用户id)、sourceType(来源终端)、content(评论内容)、createDate(建立时间)、updateDate(修改时间);
这样的话咱们就能够实现功能:根据repId获取某条新闻的所有平论、显示评论的时间等;性能
三:咱们在今日头条上看新闻的时候会发现评论也是能够点赞的,那咱们就再思考一下,有同窗会想和上面的新闻点赞表同样再加个评论点赞表,这样的话其实有些多余,咱们能够将原有的新闻点赞表改造一下,添加一个点赞资源类型resourceType(用于表示点赞的是哪类资源,好比新闻、评论),而后还须要再加一个resourceId用来表示具体那条资源,完整表结构以下:spa
资源点赞表: id 、resourceType(资源类型)、resourceId(资源id)、userId(用户id)、sourceFrom(来源终端);
四:一样类比今日头条,网友能够对评论进行回复,每条评论都有被回复的总数等功能(例如:“xxx回复了xxx:xxxxxxx”),该如何实现呢?设计
仍是经过改造评论表,能够添加一个回复给哪条评论的字段replyTo,其值是被回复的评论的id;最外层的评论(相似组织机构)的replyTo字段设置为0即 可;这样经过sql就能够统计出某条评论的回复数,而后关联用户表便可实现xxx恢复了xxx;改造后的评论表以下:资源
评论表: id 、repId(新闻id)、replyTo(回复给哪条评论的id)、userId(用户id)、sourceType(来源终端)、content(评论内容)、createDate(建立时间)、updateDate(修改时间);