
王中阳Go
V1
2023/03/09阅读:55主题:萌绿
「训练营专享」如何设计数据库表结构?
问题描述

如上图所示,红框中的视频筛选标签,应该怎么设计数据库表结构?
这是一个很好的应用场景,大家可以先自己想一下。不要着急看我的方案。
需求分析
-
可以根据红框的标签筛选视频 -
其中综合标签比较特殊,和类型、地区、年份、演员等不一样 -
设计表结构时要考虑到:
-
方便获取标签信息,方便把标签信息缓存处理 -
方便根据标签筛选视频,方便我们写后续的业务逻辑
设计思路
-
综合标签可以写到配置文件中(或者写在前端),这些信息不需要灵活配置,所以不需要保存到数据库中 -
类型、地区、年份、演员都设计单独的表 -
视频表中设计标签表的外键,方便视频列表筛选取值 -
标签信息写入缓存,提高接口响应速度 -
类型、地区、年份、演员表也要支持对数据排序,方便后期管理维护
表结构设计
视频表
-
id 视频主键id -
type_id 类型id -
area_id 地区id -
year_id 年份id -
actor_id 演员id
类型表
-
id 类型主键id -
name 类型名称 -
sort 排序字段 int类型 长度根据实际需求而定 比如长度为2,即不超过99
地区表
-
id -
name -
sort
年份表
-
id -
name -
sort
演员表
-
id -
name -
sort
缓存策略
可以使用ORM链式操作-查询缓存
示例代码:
package main
import (
"time"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
var (
db = g.DB()
ctx = gctx.New()
)
// 开启调试模式,以便于记录所有执行的SQL
db.SetDebug(true)
// 写入测试数据
_, err := g.Model("user").Ctx(ctx).Data(g.Map{
"name": "john",
"site": "https://goframe.org",
}).Insert()
// 执行2次查询并将查询结果缓存1小时,并可执行缓存名称(可选)
for i := 0; i < 2; i++ {
r, _ := g.Model("user").Ctx(ctx).Cache(gdb.CacheOption{
Duration: time.Hour,
Name: "vip-user",
Force: false,
}).Where("uid", 1).One()
g.Log().Debug(ctx, r.Map())
}
// 执行更新操作,并清理指定名称的查询缓存
_, err = g.Model("user").Ctx(ctx).Cache(gdb.CacheOption{
Duration: -1,
Name: "vip-user",
Force: false,
}).Data(gdb.Map{"name": "smith"}).Where("uid", 1).Update()
if err != nil {
g.Log().Fatal(ctx, err)
}
// 再次执行查询,启用查询缓存特性
r, _ := g.Model("user").Ctx(ctx).Cache(gdb.CacheOption{
Duration: time.Hour,
Name: "vip-user",
Force: false,
}).Where("uid", 1).One()
g.Log().Debug(ctx, r.Map())
}
作者介绍

王中阳Go
V1
专注Go语言的学习经验分享和简历优化