从零开始写数据库(一)

前言

近些年各种数据库层出不穷,归根结底是因为互联网的快速发展,现有数据库无法满足需求。

数据库技术高深莫测,今天我们就来自己动手实现一个数据库系统。实现语言为Go。

当今数据库可分为几大类型

  1. Relational DBMS,传统的关系型数据库也就是我们常说的以SQL为查询语言的数据库,代表作有MySQL、PostgreSQL
  2. Document store,文档数据库,数据模式自由,代表作有MongoDB
  3. Key-value store,键值存储数据库,代表作有Redis
  4. Search engine,搜索引擎,代表作有Elasticsearch
  5. Wide column store,宽行数据库,代表作有Cassandra

虽然说数据库类型很多,但是其底层都离不开一个存储引擎。这个存储引擎多半是个KV数据库系统

我们以业内比较早,实现清晰的LevelDB作为参考实现

新建项目

在GitHub上新建一个项目LevelGo

新建文件main.go

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Printf("Hello, world!")
}

运行程序

1
go run main.go

输出结果

1
Hello, world!

基于内存的数据库

新建文件db.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

// 声明一个map
var m map[string]string

// 初始化map
func init() {
m = make(map[string]string)
}
// 新建,修改
func Put(key string, value string) {
m[key] = value
}
// 删除
func Delete(key string) {
delete(m, key)
}
// 读取
func Get(key string) string {
return m[key]
}

修改main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

func main() {
fmt.Println("Hello, world!")

// 插入
Put("hello", "world")

// 读取
fmt.Println(Get("hello"))

// 删除
Delete("hello")

// 读取
fmt.Println(Get("hello"))
}

运行

1
2
3
4
go run *.go

Hello, world!
world

当然一个完整的数据库不可能这么简单

这是一个内存数据库,不能持久化数据。而且支持的存储类型只有string一种