关系型数据库与Go | 青训营

61 阅读3分钟

ACID 是数据库管理系统(DBMS)中用于确保事务的可靠性和一致性的核心概念。它代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个属性:

  1. 原子性(Atomicity) :事务被视为一个原子操作,要么全部执行成功,要么全部失败。如果事务的任何部分失败,整个事务会被回滚,使数据库保持一致状态。
  2. 一致性(Consistency) :事务在开始和结束时,数据库必须处于一致状态。这意味着事务的执行不能违反预定义的规则和约束,从而确保数据库的完整性。
  3. 隔离性(Isolation) :事务的执行是相互隔离的,即一个事务的操作不应干扰其他事务。隔离性保证了事务并发执行时的正确性,避免了数据混乱。
  4. 持久性(Durability) :一旦事务提交,其所做的改变将被永久保存在数据库中,即使系统崩溃也不会丢失。

数据库的发展史:

数据库的发展可以分为几个阶段:

  1. 文件系统阶段:数据存储在文件中,应用程序需要自己管理数据的读写操作,不具备数据的共享和一致性。
  2. 层次数据库阶段:数据被组织成树状结构,允许更好的数据组织,但难以应对复杂关系和查询。
  3. 关系数据库阶段:引入了关系模型,数据被组织成表格,具备了更强的灵活性和查询能力。例如,IBM的System R和Oracle。
  4. 对象数据库阶段:将面向对象的概念引入数据库,允许存储对象和对象之间的关系,但没有广泛应用。
  5. NoSQL 和 NewSQL 阶段:为了应对大数据和分布式计算的挑战,出现了多种非关系型数据库(NoSQL)和新型关系型数据库(NewSQL),如MongoDB、Cassandra、Google Bigtable、NewSQL 数据库等。

数据库的关键技术:

  1. 数据建模和设计:确定数据模式、实体关系以及各种约束。关系数据库使用表格来表示实体和属性,通过主键和外键建立实体之间的关系。
  2. 查询语言和优化:SQL 是关系数据库的标准查询语言,数据库优化器负责解析和优化查询,以提高查询性能。
  3. 事务管理:保证数据的 ACID 特性,确保数据的完整性和一致性。事务管理器负责事务的开始、提交和回滚。
  4. 索引和存储结构:使用索引提高查询性能,存储引擎负责数据在磁盘上的存储方式。
  5. 并发控制:处理多个事务同时执行时可能出现的数据冲突和不一致性,保证隔离性。

以下是一个简单的 Python 示例,展示了如何使用 SQLite(一种嵌入式关系数据库)来创建表格、插入数据和执行查询:

`

// 创建表格

_, err = db.Exec(`
	CREATE TABLE IF NOT EXISTS employees (
		id INTEGER PRIMARY KEY,
		name TEXT,
		salary REAL
	)
`)
if err != nil {
	log.Fatal(err)
}

// 插入数据
insertStmt := `
	INSERT INTO employees (name, salary) VALUES (?, ?)
`
_, err = db.Exec(insertStmt, "Alice", 50000)
if err != nil {
	log.Fatal(err)
}
_, err = db.Exec(insertStmt, "Bob", 60000)
if err != nil {
	log.Fatal(err)
}

// 执行查询
rows, err := db.Query("SELECT id, name, salary FROM employees")
if err != nil {
	log.Fatal(err)
}
defer rows.Close()

// 遍历查询结果
for rows.Next() {
	var id int
	var name string
	var salary float64
	err := rows.Scan(&id, &name, &salary)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("ID: %d, Name: %s, Salary: %.2f\n", id, name, salary)
}

// 检查遍历过程中是否有错误
if err = rows.Err(); err != nil {
	log.Fatal(err)
}

} `