关于点赞行为设计···
自建新闻从无到有。当然,评论、点赞也是一步步来的。
关于点赞的设计,也是会挖过坑,也把坑给填了。
需求是这样子的:点赞有【好球,警告】两个选项,点了可以取消,取消之后可以再点,也可以直接从好球直接切换到警告,同时好球和警告数也要跟着更新
采用数据库:mongodb,关于字段设计,一开始我是这样子的:
support : Number , 用来记录总的好球数
warning: Number 用来记录总的警告
supportList: Array 用来存有点赞行为的用户id,大概就是 [{uid:'12345',type:1},{uid:'123',type:2}]
---------------------------------------------------------------------------------------------------------
第一次点好球或者警告,support,warning就都是增1啦,而supportList的话,我就直接把用户的id和点赞类型push到了数组,然后的然后就是坑来了:
现在是用户要取消点赞,那是不是意味着我要到supportList遍历对象并移除有关该用户的键值对,如果是要更新的话,也是要遍历后再更新保存,想到这样子我就头大了。。。。
然后,我就想到···· 既然用户的id是唯一的,那这样子的话,我不就可以把用户的id作为键值对的键,然后行为作为值呢,然后字段也就变成了这样子啦:
support : Number , 用来记录总的好球数
warning: Number 用来记录总的警告
supportDict Object 用来存用户的点赞行为,形如{'5265':1,'5234':2},
用键值对来存用户的点赞行为效率是比数组对象要高很多的【是不是!】
首先是点赞行为【1为好球,2为警告】如{'5265':1,'5234':2}就表示用户5265点了好球,5234点了警告;
接下来就是取消行为【0为取消】,假设用户5265取消点好球,就直接更新{'5265':0,'5234':2},用0来表示当前没有行为,虽然可以移除5265这个字段,但不移除的话,我们就可以通过读取该字段下的键,知道用户曾经有点赞行为;
更新行为和取消行为类似,也是去更新字段的值;
其他需要修改的就是字段support、warining的值,如加1,减1;
-----------------------------------------------------
在查询点赞行为时,客户端会附带uid的参数;此时只要在supportDict上查询是否有该键,同时返回该键的操作行为即可,就不用像之前的设计还要去遍历数组,效率一下子就提升了。
-----------------------------------------------------
我的理解就是这样子啦。虽然我知道这篇文章会很少人看到,但是如果有人看到的话,可以和我分享下关于点赞更好的设计啦。