第八节课之存储与数据库
数据案例
-
数据产生 小明同学下载了新的APP,因第一次登陆,他注册了一个账号。 相关的注册信息资料在按下“注册”按钮时便产生数据,数据实现从人流向机器的过程。
-
数据流动 一条用户注册数据可以写作如下格式。
{ "user_name": "小明", "password": "helloworld", "password_hint": "coding", // ... }该数据在注册后从终端流向后端服务器,并在需要时继续流向数据库及其它系统实现持久化。
-
数据持久化 数据在产生之后,必须要经过持久化才能得到妥善储存。倘若只存在后端服务器的内存之中,容易替换丢失或掉电丢失,这要求用户每次都需重新注册,也并不合理。 在数据持久化的过程中,需要先校验数据合法性,譬如检测“小明”的用户名是否已经存在。其次,则是修改内存,用高效的数据结构组织数据。最后则是写入存储介质,采用寿命和性能友好的方式写入硬件。
数据库与存储系统
存储系统
-
存储系统定义 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。它的接口需要涉及用户、介质、内存和网络。
-
存储系统特点 首先,它作为后端软件的底座,有性能敏感的特性。 其次,存储系统的代码既要求“简单”以使性能优化,又要求“复杂”保证功能完备运行稳定。 最后是存储系统的软件架构,容易受硬件影响,可能因硬件的变动优化而要修改软件架构。
-
存储器层级结构 存储器存在一个类似金字塔的结构,越往上价格越高、容量越小、性能越好、速度越快、越易掉电丢失。一般从上至下包括:
- 处理器寄存器
- 处理器缓存
- RAM
- 闪存
- 硬盘驱动器
- 磁带
-
从应用到存储介质 数据从应用到存储介质的过程,也是从金字塔顶向下传输数据的过程。 为了充分优化这一过程的性能,需要注意:
- 缓存的概念很重要,它贯穿于整个存储体系,每一层都可以看作为其下一层的缓存。
- 拷贝很昂贵,应该尽量减少这一操作。
- 硬件设备五花八门,需要抽象出统一的接入层简化设计。
-
RAID技术 RAID全称为“Redundant Array of Inexpensive Disks”。 它主张利用多块小磁盘替代大磁盘,实现高性能和高性价比;并引入冗余磁盘用作数据校验,以保证高可靠性。
数据库
- 关系 关系模型指的是任意元素组成的若干有序偶对,反应了事物间的关系。 在数学中对应了关系代数来表达,这是一种对关系做运算的抽象查询语言。 SQL语言则是方便人类阅读的关系代数表达形式。
- 关系型数据库
关系型数据库属于存储系统,但除了存储功能,它也发展了其他能力。
- 结构化数据友好
- 支持事务
- 支持如SQL的复杂查询语言
- 非关系型数据库
非关系型数据库也是存储系统,但一般不要求严格的结构化。
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
数据库与经典存储
- 结构化数据管理 数据在写入关系型数据库时,以表的形式管理。例如一条用户注册数据,在对应的数据表中插入一行(tuple),填入对应列的信息。 而在经典存储中,将数据写入文件,要自行定义管理结构,结构复杂不好管理。
- 事务能力
数据库支持事务,极大优化了其使用。
事务具有ACID的特性,分别为:
- 原子性(Atomicity),事务内的操作要么不做,要么全做。
- 一致性(Consistency),事务执行前后,数据库内数据状态一致。
- 隔离性(Isolation),可以隔离多个并发事务,实现并发操作,避免并发导致的错误。
- 持久性(Durability),事务一旦提交成功,数据保证持久性。
- 复杂查询能力 要进行复杂查询时,数据库可以很方便地支持以SQL为代表的复杂查询语言。SQL语言灵活、简洁且易读,方便用户使用。 而在经典存储系统中,要进行查询需要僵化复杂的代码,对用户不友好。