青训营大作业数据库设计初探 | 青训营

93 阅读3分钟

项目结构

  • 安卓客户端-API端(http协议)-service端(RPC协议)-缓存-数据库
douyin
|--	apps
	|--	api
		|--	user       调用rpc服务   
	|-- rpc
		|-- user       用户登录注册和信息获取(已完成)
		|-- video      视频部分
|--	readme.md
|--	go.mod
|--	pkg                公共部分
	|-- authcrypto.go  auth获取token和鉴权
	|-- userdb.go      user结构体和数据库缓存的连接函数

数据库设计

Pasted image 20230809131327.png

type User struct {
	ID int64                  // 主键(用户id)
	Username string           // 用户名
	Password string           // 密码
	
	FansCount int64           // 粉丝数
	FollowerCount int64       // 关注数
	Avatar string             // 用户头像
	Name string               // 用户昵称
	BackgroundImage string    // 顶部头图
	Signature string          // 个人简介
	TotalFavorited string     // 获赞数量
	WorkCount int64           // 作品数
	FavoriteCount int64       // 喜欢数量
}

// 是否关注这个人   一对多   一个用户关注多个人
type fans_followers {
	ID int64                  // 主键
	FansId int64              // 粉丝id
	FollowerId int64             // 关注者id
}

// 是否喜欢这个视频   一对多   一个用户对应多个视频
type users_favor_videos {
	ID int64                  // 主键
	UserId int64              // 用户id
	VideoId int64             // 喜欢的视频id
}

type Video struct {
	ID int64                  // 主键(视频id)
	UserId int64              // 用户id
	PlayUrl string            // 视频播放地址
	CoverUrl string           // 视频封面地址
	FavoriteCount int64       // 视频点赞总数
	CommentCount  int64       // 评论总数
	Title string              // 视频标题
	CreatedAt int             // 创建时间
}

// 视频的评论  一对多  一个视频对应多个评论
type Comment struct {
	ID int64                  // 主键
	VideoId int64             // 视频id
	UserId int64              // 用户id
	Content string            // 发布内容
	CreatedAt int             // 发布时间
}

// 是否进行聊天   多对多   发布者和接收者的id都需要操作
type Chat struct {
	ID int64                  // 主键
	Content string            // 消息内容
	CreatedAt int             // 发送时间
	ToUserId int64            // 发布者id
	FromUserId int64          // 接收者id
}

设计思路,将视频信息,用户信息分表,然后让再创建进行关联的表 最大程度保证微服务的解耦 而且以后有新的扩展可以直接增加关联的表或者修改原有的关联表,确保了较好的可扩展性 简单来说就是首先创建相应的视频 用户资源 他们之间的交互通过关联表实现

设置Redis-MQ-MySQL 查询:首先redis查询队列,然后mysql查询 写入:先积压在redis中,然后再进行写入

聊天(一般都是短时间内聊天,会频繁的查看聊天记录和增加聊天记录) 使用redis缓存 添加几天的过期时间,先写入缓存,再写入数据库,查询先查询缓存,再查询数据库

评论和点赞(流量大的博主可能会出现短时间内大量的点赞和评论) 使用redis的缓存的消息队列的积压去完成吞吐

用户信息和视频信息(不断刷视频会读取大量的用户信息和视频信息) 按照时间排序,将设置过期时间,先写入缓存,再返回给用户,在一定时间内用户访问的都是缓存的视频以此解决高并发的访问

这么设计其实只是根据自己的经验一个模拟的预期结果,真实可能需要统计数据去优化(比如过期时间的设计,还有就是保证数据库和缓存的一致性)

用户注册

需求

  • 用户名不能重复
  • 用户名和密码小于32位
  • 注册完设置默认的值(头图,头像,昵称,粉丝数等)

RPC服务

请求
username
password
返回
用户id
{
    "status_code": 0,
    "status_msg": "登录成功",
    "user_id": 1,
    "token": "eyJhbGciOiAiSFMyNTYiLCJ0eXAiOiAiSldUIn0=.eyJFeHAiOjE2OTIzMjY0OTMsIklhdCI6MTY5MjI0MDA5MywiSWQiOjF9.39bECbrjIlgAwqV-qzmTsmsDZAWYXbzCj3NH0eLRkhE="
}

用户登录

需求

  • 验证用户名和密码是否正确
  • 密码在数据库中存储也是加密的状态(通过用户名+密码md5加密),保证数据库泄露仍然安全

用户信息

需求

  • 通过user_id在user表查询相应的用户信息

投稿接口

  • 将取得的视频进行压缩 可能需要相应的编码和解码格式
  • 储存在静态资源服务器上,返回数据的时候将域名和路径进行拼接
  • 使用nginx 配置静态资源

问题反馈