数据库
- 持久化: 我们不可能每次登录app都要重新注册,为了确保不那么麻烦,我们数据持久化后,下次直接登
- 整个:用户界面--》数据(姓名、密码)--》后端服务器(处理这条数据)--》数据库--》其他系统
数据库工作:
- 校验数据的合法性:查看小明是否存在
- 修改内存:用高效的数据结构组织数据
- 写入存储介质:寿命&性能写入硬件(重点强调:寿命)
存储系统:
-
缓存【很重要】
-
拷贝【很昂贵】
-
硬件设备五花八门,需要有抽象统一的接入层
-
RAID技术:(redundant array of inexpensive disks)
- 价格:单块大容量磁盘 > 多块小容量磁盘
- 性能:单块 > 多块并发写入
- 容错:单块有限,不安全
- RAID 0、RAID 1、RAID 0+1
关系: Relation = 集合 = 反应了事物之间的关系。 关系模型。 关系代数。
SQL = 一种DSL = 关系做运算的语言
数据库:
-
关系型数据库:就是一种存储系统
- 结构化数据友好
- 支持事务
- 支持复杂查询语言(SQL)
-
非关系型数据库:不要求严格的结构化数据
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
事务:ACID
- Atomicity: 事务要么全做,要么不做
- Consistency: 数据状态一致性
- Isolation: 并发执行
- Durability: 成功提交后,保证数据持久性
存储 & 数据库
单机存储系统:本地文件系统、key-value
Database/sql
import (
"database/sql"
"github.com/go-sql-driver/mysql" // 使用driver + DSN
)
func main () {
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/hello")
// 初始化 DB数据库连接
rows, err := db.Querry ("select id, name from users where id = ?", 1)
if err != nil {
// xxx
}
defer rows.Close()
// 执行一条SQL,通过rows取回返回的数据处理完毕,需要释放链接Close()防止内存泄漏
var users []User
for rows.Nexts() { // 不断获取下一跳数据
var user User
err := rows.Scan(&user.ID, &user.Name) // 获取每一个元素
if err != nil { // 检验
//xxx
}
users = append (users, user)
}
// 数据、错误处理
if rows.Err() != nil {
// ...
}
// 比较重要的错误处理。 很容易遗漏
}