关注其他用户功能实现

首先实现了UserViewModel,一切有关界面上显示用户的信息,都经由User Model 转化为UserViewModel,然后进行显示。

数据库中有一个 Follow 表,结构为:

CREATE TABLE `followers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `follower_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_followers_user_id` (`user_id`),
  KEY `idx_followers_follower_id` (`follower_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

由用户及关注者用户字段组成。

当一个用户关注另一个用户时候,则插入一条数据:

// DoFollow 关注
func DoFollow(userID uint, followIDs ...uint) error {
	l := len(followIDs) - 1
	sqlStr := fmt.Sprintf("insert into %s (follower_id, user_id) values ", tableName)
	for i, v := range followIDs {
		sqlStr = sqlStr + fmt.Sprintf("(%d, %d)", userID, v)
		if i < l {
			sqlStr = sqlStr + ","
		}
	}
	d := database.DB.Exec(sqlStr)
	return d.Error
}

// DoUnFollow 取消关注
func DoUnFollow(userID uint, followIDs ...uint) error {
	sqlStr := fmt.Sprintf("delete from %s where follower_id = %d and user_id in (", tableName, userID)
	l := len(followIDs) - 1
	for i, v := range followIDs {
		sqlStr = sqlStr + strconv.Itoa(int(v))
		if i < l {
			sqlStr = sqlStr + ","
		}
	}
	sqlStr = sqlStr + ")"
	d := database.DB.Exec(sqlStr)
	return d.Error
}

查看关注者用户列表,都是通过连表查询,进行数据返回实现的。

转发功能考虑实现

搜了一下,实现办法五花八门,这里以一种容易理解的方式实现:

  • 在 tweet 表中增加 parent_id,如果是转发的 tweet,则 parent_id 不为空
  • 这种方式,存储上浪费空间,但是检索起来简单

还有一种方式,是建立一个 retweet 表,在其中进行操作。

有兴趣的可以参考:https://stackoverflow.com/questions/11654420/how-to-implement-twitter-retweet-action-in-my-database

##发推功能实现

直接往数据库中插入 Status 数据就好:

func (s *Status) Create() (err error) {
	if err = database.DB.Create(&s).Error; err != nil {
		log.Warnf("微博创建失败: %v", err)
		return err
	}

	return nil
}

timeline 考虑实现

timeline 的实现有很多讲究,最简单的是:

  • 建立一个与用户相关的inbox
  • 当关注的用户发tweet后,向与用户相关的 inbox 插入数据
  • 当用户执行删除的时候,再删除一遍……

这么做在数据量小的时候一切OK,假设一个用户有5000人关注,假如他一个小时发 10条消息,就有 5w 条消息要插入到数据库中。这效率肯定高不了。

可以将操作改为并行,或者引入 messagequeue 来进行改进。

参考链接:

https://learnku.com/articles/2750/dynamic-realization-of-the-principle-of-friends

@功能考虑实现



blog comments powered by Disqus

Published

2019-11-11

Categories


Tags