一次点赞功能设计探索

难点

  • 点赞次数如何统计
    • 实时用聚合查询(SQL: SELECT COUNT(1) FROM LIKE WHERE ARTICLE_ID=?)查询数据库条目
      • 性能问题太大
    • 将点赞次数保存在目标对象(ARTICLE.LIKE_COUNT)上,每次有点赞/取消赞行为则增减该数字
      • 写目标对象数据条目频繁
  • 未登录用户如何点赞,且可以记录点赞状态
    • 在数据库记录ip地址或保存在Cookie中的标记浏览器唯一性的长随机数,Like.visitor_id来作为访客的唯一标识
      • 如何在其登录后将未登录赞转换为关联实际用户的赞
      • visitor_id与user_id并存的情况下,user_id的意义大打折扣,未登录可以记录赞,是否还有必要记录登录赞
    • 浏览器缓存(推荐Html5.localStorage)
      • 服务端点赞次数统计如何实时加一
      • 如何防止客户端作弊,一直加一
      • 登录后需要发送用户点赞请求来同步数据
  • 多种赞目标(可以赞文章、评论、商品等)数据表结构设计
    • 用表继承的方式,父表记录user_id,create_time,status等通用信息,多个子表来标识不同对象(article_id/comment_id/product_id的一种)
      • 表过多
      • 每多一种点赞目标就要添加新表
    • 单表保存,多字段用外键指向赞目标主键
      • 空字段太多
      • 数据条数庞大
    • 单表保存,用一个表征类别的字段区分赞目标对象种类(type=article/comment/product),用一个字段记录目标主键
      • 无法使用外键约束来保证数据完整性
      • 数据条数庞大

缓存 消息队列 NoSQL