最近有不少前端和测试转Go的朋友在交流群里聊:如何做表结构设计?
大家关心的问题阳哥必须整理出来,希望对大家有帮助。
设计数据库表结构需要考虑到以下4个方面:
在设计数据库表结构时,可以参考以下几个优雅的设计原则:
最后,需要提醒的是,优雅的数据库表结构需要在实践中不断迭代和优化,不断满足实际需求和新的挑战。
下面举个示例让大家更好的理解如何设计表结构,如何引入内存,有哪些优化思路:
如上图所示,红框中的视频筛选标签,应该怎么设计数据库表结构?
这是一个很好的应用场景,大家可以先自己想一下。不要着急看我的方案。
字段 |
注释 |
id |
视频主键id |
type_id |
类型表外键id |
area_id |
地区表外键id |
year_id |
年份外键id |
actor_id |
演员外键id |
其他和视频直接相关的字段(比如名称)我就省略不写了
字段 |
注释 |
id |
类型主键id |
name |
类型名称 |
sort |
排序字段 |
字段 |
注释 |
id |
类型主键id |
name |
类型名称 |
sort |
排序字段 |
字段 |
注释 |
id |
类型主键id |
name |
类型名称 |
要么是年份正序排列,要么是年份倒序排列,所以不需要sort字段
字段 |
注释 |
id |
类型主键id |
name |
类型名称 |
sort |
排序字段 |
表结构设计完了,别忘了缓存
首先这些不会频繁更新的筛选条件建议使用缓存:
目前很多框架都是支持自动缓存处理的,比如goframe和go-zero,官方文档都做了详细的介绍,不作为本文的重点。
可以使用ORM链式操作-查询缓存[1]
官方示例:
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": "xxx",
"site": "https://xxx.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())
}
DB缓存机制[2]
go-zero缓存设计之持久层缓存[3]
官方文档都做了详细的介绍,不作为本文的重点。
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
本文抛砖引玉,欢迎大家留言交流。
[1]ORM链式操作-查询缓存: https://goframe.org/pages/viewpage.action?pageId=1114346
[2]DB缓存机制: https://go-zero.dev/cn/docs/blog/cache/cache
[3]go-zero缓存设计之持久层缓存: https://go-zero.dev/cn/docs/blog/cache/redis-cache