青训营笔记 - 数据库相关

37 阅读3分钟

后端与数据息息相关,数据库因此是逃不开的一环。本文以用户注册一个网站的账号为例,从数据库的一些简要介绍开始,到Go中对database操作相关封装的库的操作,体现数据流动过程。

存储系统

图片.png 存储系统,希望可以做到既有不易失,又物美价廉,存储空间大。而数据库相比于存储系统,体现出支持事务的优越性(ACID)。

  1. 作为后端软件的底座,性能敏感
  2. 存储系统软件架构,容易受硬件影响
  3. 存储系统代码,既简单又复杂

数据流动

用户注册信息 --> 后端服务器 --> 数据库 --> 其他系统

数据的持久化

  1. 校验数据的合法性:该用户是否已经存在?
  2. 修改内存:用高效的数据结构组织数据
  3. 写入存储介质:以寿命&性能友好的方式写入硬件

其中缓存贯穿整个存储体系,而拷贝这一操作很昂贵,应当尽量减少。

数据库基本信息

基本类别

关系型数据库描述实体间的关系

  • 结构化数据友好
  • 支持事务(ACID)
  • 支持复杂查询语言 SQL 而非关系型数据库
  • 对非结构化数据友好
  • 可能支持事务(ACID)
  • 可能支持复杂查询语言,比如SQL

事务特点

其中ACID为

  • Atomicity:事务内的操作要么全做,要么不做。原子性。
  • Consistency:事务执行前后,数据状态是一致的。比如转账,A->B 500元,则A账户内应少500元,并且B账户内多500元。
  • Isolation:可隔离多个并发事务,避免影响
  • Durability:事务一旦提交成功,数据保证持久性

主流存储产品相关分析

  1. 单机存储 单个计算机节点上的存储软件系统,一般不涉及网络交互。

    本地文件系统:

    • 一切皆文件
    • 系统繁多,但都遵循统一抽象接口
    • Index & Directory

    Key-value存储: 通过Key,索引value,value是内容,Key是门牌号

    • 常见使用方式:put(k,v) & get(k,v)
    • 常见数据结构:LSM-tree,某种程度上牺牲读性能,追求写入性能
  2. 分布式存储 单机存储基础上实现了分布式协议,设计大量网络交互。

    分布式文件系统:

    比如HDFS, 20s初,当时专用高级硬件很贵,同时数据存量很大,要求超高吞吐 ,核心特点有:

    • 支持海量数据存储
    • 高容错性
    • 弱POSIX语义,一些单机文件系统上的操作并不支持
    • 使用普通x86服务器,性价比高

    分布式对象存储:

    比如Ceph,一切皆对象,核心特点有:

    • 数据写入采用主备复制模型
    • 数据分布模型采用CRUSH算法
    • 一套系统支持对象接口、块接口、文件接口,但一切皆对象
  3. 单机关系型数据库 事务在单机内执行,也可能通过网络交互实现分布式事务。 Oracle, MySQL, PostgreSQL

  4. 单机非关系型数据库 mongoDB, Redis

  5. 分布式数据库 解决容量问题。存储节点池化,动态扩容。 解决性价比问题。

database/sql

封装好的包,希望用统一接口处理不同数据库相关服务。而且数据的存储受到硬件影响很大,硬件设备又五花八门,需要有抽象统一的接口。

可以用driver+DSN进行初始化DB连接。