认识数据库 | 青训营笔记

92 阅读4分钟

这是我参与「第五届青训营」伴学笔记创作活动的第11天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。

如果不做数据持久化,系统将没有长期的记忆。

数据库可能需要达到的效果

  1. 校验数据合法性
  2. 高效的数据结构组织数据
    1. 内存中的:便于写入存储介质
  3. 写入存储介质:以寿命&性能友好的方式写入长期存储介质。

挑战

  1. 数据不丢失?
  2. 多人修改?(同步,并发,一致性?)
  3. 结构化数据,那么其他数据呢?
  4. 多种操控数据库的方式?
  5. 除了数据库之外的存储系统?

存储系统

  1. 提供读写,控制类接口
  2. 能安全有效将数据持久化的软件

系统特点

  1. 性能敏感
  2. 易受硬件影响(或硬件无关的设计?)

数据从应用到存储介质 缓存十分重要 拷贝很昂贵,需要减少

RAID 技术

背景:

  1. 单块大容量磁盘==价格 ==> 多块小容量磁盘
  2. 单块写入==性能== < 多块并发
  3. 单块磁盘的容错性有限

数据库

数据库= =存储系统?

关系 :Relation

关系代数:对关系做运算

  1. 笛卡尔积
  2. ...

SQL:一种DSL domain specific Language

关系型数据库特点

关系型数据库指的是使用关系模型(二维表格模型)来组织数据的数据库。

首先它是存储系统,但是又有其他能力:

  1. 结构化数据友好
  2. 支持事务——ACID
  3. 支持复杂查询(可能没有到所有关系代数的阶段)
  4. 数据存储在磁盘,安全可靠

传统关系型数据库的缺陷:

  • 高并发读写能力差:网站类用户的并发性访问非常高,而一台数据库的最大连接数有限,且硬盘 I/O 有限,不能满足很多人同时连接。
  • 海量数据情况下读写效率低
  • 无法快速容纳新的数据类型

非关系型数据库(NOSQL)的特点

非关系型数据库又被称为 NoSQL(Not Only SQL 。通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据。

常见的NoSQL分类:

  1. 键值数据库:redis、Memcached、Riak
  2. 列族数据库:Bigtable、HBase、Cassandra
  3. 文档数据库:MongoDB、CouchDB、MarkLogic
  4. 图形数据库:Neo4j、InfoGrid

特点:

  1. 速度快,效率高(甚至采用内存作为载体)
  2. 高并发,拓展简单
  3. 近年来来时逐渐支持SQL子集查询
  4. 虽然支持拓展,但是数据的一致性需要通过一定策略才能保障。

思考

  1. 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
    • 如果系统不崩溃,批操作每次都正常完成,那么不会导致原子性问题。
    • 但是出现crash的情况,可能会出现原子操作被拆开的现象,解决方案是建立错误回滚机制,事务异常之后,应该回滚到上一个保障数据一致性的点。
  2. 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
    • 可以
      • ...
  3. 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
    • 两阶段锁:锁升级策略,读数据需要获取共享锁(支持并发读),写数据获取独占锁(不允许其他读写)。
  4. 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?
    • 可能要根据日常查询需要设计....

:)