「训练营专享」如何设计数据库表结构?

GOLANG ROADMAP

问题描述

TIP

如下图所示,红框中的视频筛选标签,应该怎么设计数据库表结构?

这是一个很好的应用场景,大家可以先自己想一下。不要着急看我的方案。

需求分析

TIP

  1. 可以根据红框的标签筛选视频

  2. 其中综合标签比较特殊,和类型、地区、年份、演员等不一样

  3. 设计表结构时要考虑到:

    • 方便获取标签信息,方便把标签信息缓存处理

    • 方便根据标签筛选视频,方便我们写后续的业务逻辑

设计思路

TIP

  1. 综合标签可以写到配置文件中(或者写在前端),这些信息不需要灵活配置,所以不需要保存到数据库中
  2. 类型、地区、年份、演员都设计单独的表
  3. 视频表中设计标签表的外键,方便视频列表筛选取值
  4. 标签信息写入缓存,提高接口响应速度
  5. 类型、地区、年份、演员表也要支持对数据排序,方便后期管理维护

表结构设计

TIP

视频表

  • 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

缓存策略

TIP

可以使用ORM链式操作-查询缓存open in new window

示例代码:

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())
}
Last Updated 2024-01-16 09:49:33