数据库原理与流
数据库基础
什么是数据库?
数据(Data):数据是数据库中存储的基本对象。
数据库(DB):是存储在计算机系统内的有结构的数据集合,是相关数据的集合,数据由数据库管理系统统一管理和维护。
数据库管理系统(DBMS):位于用户与操作系统之间的一层数据管理软件,数据库管理系统和操作系统一样是计算机的基础软件。
数据库系统(DBS):数据库系统由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
关系型数据库的基本特点
数据结构化:数据库系统实现了整体数据的结构化,这是数据库的最主要的特征之一。
实现数据共享:因为数据是面向整体的,所以数据可以被多个用户、多个应用程序共享使用,可以大幅度地减少数据冗余,节约存储空间,避免数据之间的不相容性与不一致性。
数据独立性高:数据的独立性包含逻辑独立性和物理独立性,其中,逻辑独立性是指数据库中数据的逻辑结构和应用程序相互独立,物理独立性是指数据物理结构的变化不影响数据的逻辑结构。
数据统一管理与控制:数据的统一控制包含安全控制、完整控制和并发控制。
术语
id | name | score |
---|---|---|
1 | cc | 10 |
2 | dd | 20 |
实体:客观存在并可相互区别的事物(如上表)
属性:实体所具有的某一特性(如上表的id、name、score)
元组:实体的具体数据(如上表的数据,第二、三行都为元组)
码:关键字,可以用于标识一个实体的唯一性(类似上表的id)
关系模式:关系名与其属性集合的组合称为关系模式(关系模型)
域:关系模型需要元组的每一个分量都是原子性的,即它必须属于某种元素类型,如Integer、String等等,不能是列,集合,记录,数组!
数据模型
数据结构:数据模型中的数据结构主要描述数据的类型、内容、性质以及数据间的联系等。数据结构是数据模型的基础,数据操作和约束都建立在数据结构上。不同的数据结构具有不同的操作和约束。
数据操作:数据模型中数据操作主要描述在相应的数据结构上的操作类型和操作方式。
数据完整性约束:数据模型中的数据约束主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。
数据完整性
实体完整性:每一行数据都是唯一实体
域完整性:表中字段需有约束
参照完整性:主键与外键对应,保证数据一致性,防止无意义数据
模型类型
概念数据模型:主要用来描述世界的概念化结构。概念模型用于信息世界的建模,一方面应该具有较强的语义表达能力,能够方便直接表达应用中的各种语义知识,另一方面它还应该简单、清晰、易于用户理解。
逻辑据模型:这是用户从数据库所看到的模型,是具体的DBMS所支持的数据模型,此模型既要面向用户,又要面向系统,主要用于数据库管理系统(DBMS)的实现。
物理数据模型:是面向计算机物理表示的模型,描述了数据在储存介质上的组织结构,它不但与具体的DBMS有关,而且还与操作系统和硬件有关。
模块查找机制
Node
应用由模块组成,其模块系统借鉴了CommonJS
模块规范,但是并未完全按照规范实现,而是根据自身需求增加了一些特性,算是CommonJS
模块规范的一个变种。
CommonJS模块规范:主要由模块引用、模块定义和模块标识三部分组成。
模块引用的几个过程
路径分析
文件定位
编译执行
模块的分类
核心模块:Node提供
文件模块:用户编写的模块
模块的加载过程
缓存
路径分析
文件定位
编译执行
Stream流
数据处理模式:
buffer
模式、stream
模式
buffer
模式:一次性读取、写入数据
stream
模式:可同时读取并操作数据
Stream类型
Readable 可读流
Writable 可写流
Duplex 可读可写流(双工流)
Transform 在读写过程中可以修改和变换数据的Duplex流(转换流)
流中数据的模式
二进制模式,字符串、buffer(字节)
对象模式
非阻塞异步IO
阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式。当数据没有准备的时候,阻塞需要等待调用结果返回之前,进程会被挂起,函数只有在得到结果之后才会返回。非阻塞和阻塞的概念相对,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
IO模型
同步阻塞IO
同步阻塞 IO 模型是最常用的一个模型,也是最简单的模型。在Linux中,默认情况下所有的socket都是blocking。阻塞就是进程休息, CPU处理其它进程去了。
用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据,在等待数据到处理数据的两个阶段,整个进程都被阻塞。不能处理别的网络IO。调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。在调用recv()/recvfrom()函数时,发生在内核中等待数据和复制数据的过程,大致如下图:
同步阻塞 IO 整个过程都是阻塞的,对于用户可以及时返回数据,无延迟,对于开发者来说简单省事,对于系统来说无法应对高并发访问,以及用户在等待期间也无法进行其他任何操作。
异步非阻塞IO
用户线程的继续执行,和操作系统准备IO数据的过程是同时进行的,因此才叫做异步IO。 按照IO数据的两个过程,又可以分为两种: 在等待数据的过程中,用户线程继续执行,在拷贝数据的过程中,线程在阻塞,这就是异步阻塞IO。
在等待数据的过程中,和拷贝数据的过程中,用户线程都在继续执行,这就是异步非阻塞IO。用户线程既没有参与等待过程也没有参与拷贝过程,所以它是异步的。当它接到通知时,数据已经准备好了,它没有因为IO数据而阻塞过,所以它又是非阻塞的。合起来就是异步非阻塞IO。