1. 设计数据库结构
这个Golang后端大师班中,我们将学习如何使用Golang
、PostgreSQL
和Docker
从头开始设计、开发和部署一个完整的后端。
课程包括:
- 设计数据库模式并从中自动生成 SQL 代码
- 深入了解数据库隔离级别、事务以及如何避免死锁
- 自动生成 Golang 代码与数据库交互
- 使用
Gin
框架开发RESTful
后端 Web 服务 - 使用用户身份验证、
JWT
和 PASETO 保护 API - 使用接口和模拟编写具有高覆盖率的更强大的测试集
- 构建用于部署的最小
Docker
映像并使用Docker-compose
进行开发 - 设置
Github Action
以自动构建应用程序并将其部署到AWS Kubernetes
集群 - 注册域并配置
Kubernetes
入口以将流量路由到 Web 服务 - 使用 Let’s Encrypt 为域启用自动颁发和更新 TLS 证书
- 其他
学习笔记的改进:
替换为符合国内使用习惯的服务或软件,比如:
- 自建的
Gitlab
替代Github - 腾讯云或阿里云的Kubernetes替代亚马逊云的Kubernetes
课程项目:一个简单的银行系统
主要功能时,它为前端提供API接口来做以下事情:
- 创建和管理银行账户
账户由所有者的姓名、余额和币种组成 - 记录每个账户的所有余额变化
每次账户中增加或减少钱,都会生成一个账户变化记录的账目 - 在两个账户直接转账
它应该是个事务处理,要么两个账户都更新成功,要么都不成功。
通过这个小项目,来学习整个Golang
后端的开发过程。
已完成的笔记
- 设计数据库结构
- 安装Docker和Postgres
- 如何使用Golang编写和执行数据库迁移
- 从SQL中生成Golang CRUD代码
- 使用Golang为数据库CRUD写单元测试
- Golang操作数据库事务的方法
- Golang如何处理数据库事务锁
本节的内容:数据库设计
- 数据库设计
使用dbdiagram设计数据库结构 - 生成
SQL
代码
1、使用dbdiagram设计表结构
打开https://dbdiagram.io/,点击 Go To App 按钮
删除左侧所有的示例代码,成为一个新的工作空间,项目命名为银行
,如下图:
2、创建一个账户表(accounts)
- 字段:
id
、主键、自增,数据类型使用bigserial
,范围更大的整形。 - 字段:
owner
,用于保存账户所有者的名字,数据类型可以是text
或者varchar
- 字段:
balance
账户的可用余额,简单的示例,这里用了bigint
数据类型,实际情况金额可能不会是整数。 - 字段:
currency
币种,varchar
- 字段:
created_at
账户的创建时间, 数据类型使用timestamptz
,而不是timestamp
,因为timestamptz
包含时区信息,默认值设置为now()
,让数据库自动为我们生成当前时间。
在左侧编辑区,输入下面的内容,右侧会自动生成一个图
Table accounts as a {id bigserial [pk, increment]owner varchar [not null, note: '账户所有者的名字']balance bigint [not null, note: '余额']currency varchar [not null, note: '币种']created_at timestamptz [not null, default: 'now()']
}
3、账目表(entries),记录账户余额的所有变化
- 字段:
id
、主键、自增,数据类型bigserial
- 字段:
account_id
账户id,和account
表属于1对多的关系,1个账号可以有多条账目数据。 - 字段:
amount
金额, 数据类型bigint
- 字段:
created_at
,数据类型timestamptz
,默认now()
Table entries as e {id bigserial [pk, increment]account_id bigint [not null, note: '账户ID', ref: > a.id]amount bigint [not null, note: '金额']created_at timestamptz [not null, default: 'now()']
}
ref: > a.id
代表和accounts
表的关联关系
4、转账表(transfers),记录两个账户之间的转账
- 字段:
id
、主键、自增,数据类型bigserial
- 字段:
from_account_id
, 从哪个账户转账,数据类型bigserial
, 和account
表属于1对多的关系 - 字段:
to_account_id
, 转到哪个账户上,数据类型bigserial
,和account
表属于1对多的关系 - 字段:
amount
转账金额,数据类型bigint
- 字段:
created_at
,数据类型timestamptz
,默认now()
Table transfers as t {id bigserial [pk, increment]from_account_id bigint [not null, ref: > a.id]to_account_id bigint [not null, ref: > a.id]amount bigint [not null, note: '金额,只能为正数']created_at timestamptz [not null, default: 'now()']
}
5、添加索引
Table accounts as a {id int [pk, increment]owner varchar [not null, note: '账户所有者的名字']balance bigint [not null, note: '余额']currency varchar [not null, note: '币种']created_at timestamptz [not null, default: 'now()']indexes {owner}
}Table entries as e {id bigserial [pk, increment]account_id bigint [not null, note: '账户ID', ref: > a.id]amount bigint [not null, note: '金额,可以为正数,也可以为负数']created_at timestamptz [not null, default: 'now()']indexes {account_id}
}Table transfers as t {id bigserial [pk, increment]from_account_id bigint [not null, ref: > a.id]to_account_id bigint [not null, ref: > a.id]amount bigint [not null, note: '金额,只能为正数']created_at timestamptz [not null, default: 'now()']indexes {from_account_idto_account_id(from_account_id, to_account_id)}
}
调整一下右侧的布局
6、导出SQL
点击菜单上的Export to PostgreSQL
,导出建表的SQL脚本
如下:
CREATE TABLE "accounts" ("id" SERIAL PRIMARY KEY,"owner" varchar NOT NULL,"balance" bigint NOT NULL,"currency" varchar NOT NULL,"created_at" timestamptz NOT NULL DEFAULT 'now()'
);CREATE TABLE "entries" ("id" SERIAL PRIMARY KEY,"account_id" bigint NOT NULL,"amount" bigint NOT NULL,"created_at" timestamptz NOT NULL DEFAULT 'now()'
);CREATE TABLE "transfers" ("id" SERIAL PRIMARY KEY,"from_account_id" bigint NOT NULL,"to_account_id" bigint NOT NULL,"amount" bigint NOT NULL,"created_at" timestamptz NOT NULL DEFAULT 'now()'
);ALTER TABLE "entries" ADD FOREIGN KEY ("account_id") REFERENCES "accounts" ("id");ALTER TABLE "transfers" ADD FOREIGN KEY ("from_account_id") REFERENCES "accounts" ("id");ALTER TABLE "transfers" ADD FOREIGN KEY ("to_account_id") REFERENCES "accounts" ("id");CREATE INDEX ON "accounts" ("owner");CREATE INDEX ON "entries" ("account_id");CREATE INDEX ON "transfers" ("from_account_id");CREATE INDEX ON "transfers" ("to_account_id");CREATE INDEX ON "transfers" ("from_account_id", "to_account_id");COMMENT ON COLUMN "accounts"."owner" IS '账户所有者的名字';COMMENT ON COLUMN "accounts"."balance" IS '余额';COMMENT ON COLUMN "accounts"."currency" IS '币种';COMMENT ON COLUMN "entries"."account_id" IS '账户ID';COMMENT ON COLUMN "entries"."amount" IS '金额,可以为正数,也可以为负数';COMMENT ON COLUMN "transfers"."amount" IS '金额,只能为正数';
好了,本节内容就是这样,下节,我们将使用这个导出的SQL脚本
,在Docker中的Postgres
数据容器中使用。
1. 设计数据库结构相关推荐
- Oracle-Oracle数据库结构
再谈Oracle数据库结构 之前写了一篇文章<Oracle-知识结构漫谈> 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新. Oracle ...
- 【PowerDesigner】一款超好用的E-R图工具,快速构建出高质量的数据库结构,提高开发效率和代码质量
博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作.目前在学习和分享:数据结构.Go,Java等相关知识. 博主主页: @是瑶瑶子啦 所属专栏: Mysql从入门到精通 近期目标:写好专栏的每 ...
- 设计数据库的画图软件
好的,设计数据库的画图软件可以帮助您通过图形化界面来规划和设计数据库结构.这些软件通常具有以下功能: 用于创建和编辑数据库表的图形化工具 用于创建数据库关系的图形化工具 用于定义数据类型和约束的图形化 ...
- db2查看表结构_作为后端开发如何设计数据库系列文章(一)设计传统系统表结构(Java开发)...
本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. 以前经常能够看到,数据库范式,现在说数据库三大范式的少了. 三大范式我以前也很严格的弄 ...
- mysql性能结构优化原理_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...
一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...
- 作为后端开发如何设计数据库系列文章(一)设计传统系统表结构
本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. 以前经常能够看到,数据库范式,现在说数据库三大范式的少了. 三大范式我以前也很严格的弄 ...
- 后端开发如何设计数据库系列文章(二)设计大数据量表结构
上篇文章讲解了传统数据库的一些设计注意点. 本篇为第二篇,在大数据量的情况下,如何去提前设计这个表结构,来达到一个比较好的效果.对于团队,对于后续的维护和扩展都带来更大的便利. 自增id 自增id还是 ...
- 后端开发如何设计数据库系列文章(一)设计传统系统表结构(Java开发)
本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. 以前经常能够看到,数据库范式,现在说数据库三大范式的少了. 三大范式我以前也很严格的弄 ...
- PowerDesigner一键导出数据库设计表结构
1.背景 帮朋友弄下数据库设计,又用到PowerDesigner,因为还要数据库设计文档(word),还想着怎么把数据库结构导出呢,发现以前弄过,一键导出,很方便,分享下,祝好运! 2.解决方案 2. ...
最新文章
- AngularJS转换请求内容
- UIPickerView隐藏透明条
- 安装GCC-8.3.0及其依赖
- Leaflet中对鼠标按下、移动事件监听实现移动单个图形
- 12_信息熵,信息熵公式,信息增益,决策树、常见决策树使用的算法、决策树的流程、决策树API、决策树案例、随机森林、随机森林的构建过程、随机森林API、随机森林的优缺点、随机森林案例
- 超炫的iphone应用UI/UX设计赏析
- 使用Apache Hadoop计算PageRanks
- oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
- C语言库函数大全及应用实例三
- 云服务器学习linux_云服务器怎么选linux系统
- 2006年上半年开发心得
- Scratch2exe-ch将sb2文件转换为exe文件
- wav音频文件格式解析【个人笔记】(自用)
- Java拦截器和过滤器的作用和区别
- 页面加载时,有较长时间的白页,有可能是什么原因造成的
- 货币市场基金基础知识
- Windows, 使用https访问网页提示此网站的安全证书有问题解决方法
- 平面设计基本艺术表现形式有哪些
- FFmpeg源代码简单分析-其他-日志输出系统(av_log()等)
- navicat ssh postgresql 报错:no password supplied
热门文章
- html5我的心灵小屋,描写我的小屋优美句子
- 为什么梦幻西游服务器名字有显示但是区名字没有了,梦幻西游:三月份的第一个新区注定要变鬼,从名字就能看得出来...
- 沉密神采,如对至尊 --中国书法
- VR全景拍摄时必须注意的事项有哪些
- 中兴通讯刀片服务器,中兴通讯发布行业首个OLT内置刀片技术白皮书
- 外汇平台哪个比较好 2017年排行总结 Flyerinternational稳居前五
- Pytorch的优化器总结归纳
- DIV+CSS布局心得
- c语言1e5是什么类型,c语言基础知识
- 解决Win10桌面图标/开始菜单磁贴图标变成白色的问题