04-数据库基础
1. 数据设计
1.1. 数据持久化
- 为什么持久化:
- 知识:数据被记录(record)、存储(storage)、回忆(recall)。
- 持久化历史
- 实物记录(绳结、泥板、⽵⽚、绢布、纸张)
- 电子文件
- 数据库系统
1.2. 关系型数据库
1.2.1. Relation in Concept Model 概念模型上的关系
1.2.2. Relation in database 数据库中的关系
- 列:属性
- 行:元组
1.2.3. Concept model->Logic model ->Physical model 概念模型 -> 逻辑模型 -> 物理模型
1.3. 索引
1.3.1. 为什么使用索引
- 在数据库系统的使用过程当中,数据的查询是使用最频繁的⼀种数据操作。
- 最基本的查询算法当然是顺序查找(linear search),遍历表然后逐⾏匹配⾏值是否等于待查找的关键字,其时间复杂度为O(n)。
- 对于算法规模较小的表,负载轻的数据库,也能有好的性能。
- 对于数据量比较大的表,这时候的算法显然是糟糕的,性能就很快下降了。
- 好在计算机科学的发展提供了很多更优秀的查找算法,例如**二分查找(binary search)、⼆叉树查找(binary tree search)**等。如果稍微分析⼀下会发现,每种查找算法都只能应⽤于特定的数据结构之上,
- 二分查找要求被检索数据有序
- 二叉树查找只能应⽤于二叉查找树上
- 数据本身的组织结构不可能完全满⾜各种数据结构(例如,理论上不可能同时将两列都按顺序进⾏组织),所以,在数据之外,数据库系统还维护着满⾜特定查找算法的数据结构,这些数据结构以某种⽅式引⽤(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
- 索引是对数据库表中⼀个或多个列的值进⾏排序的结构。与在表中搜索所有的⾏相⽐,索引⽤指针指向存储在表中指定列的数据值,然后根据指定的次序排列这些指针,有助于更快地获取信息。通常情况下,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引将占⽤磁盘空间,并且影响数据更新的速度。但是在多数情况下,索引所带来的数据检索速度优势⼤⼤超过它的不⾜之处。
1.3.2. 为什么是B+树
- ⽂件很⼤,不可能全部存储在内存中,故要存储到磁盘上
- 索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使⽤B-/+Tree,还跟磁盘存取原理有关。)
- 局部性原理与磁盘预读,预读的⻓度⼀般为⻚(page)的整倍数,(在许多操作系统中,页的大小通常为4k)
- 数据库系统巧妙利⽤了磁盘预读原理,将⼀个节点的⼤⼩设为等于⼀个⻚,这样每个节点只需要⼀次I/O就可以完全载⼊,(由于节点中有两个数组,所以地址连续)。⽽红⿊树这种结构,h明显要深的多。由于逻辑上很近的节点(⽗⼦)物理上可能很远,⽆法利⽤局部性
1.4. 索引实现
- InnoDB索引和MyISAM索引的区别:
- ⼀是主索引的区别:InnoDB的数据⽂件本身就是索引⽂件。⽽MyISAM的索引和数据是分开的。
- ⼆是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值⽽不是地址。⽽MyISAM的辅助索引和主索引没有多⼤区别。
1.4.1. MyISAM(早期默认)
- 不支持复杂的事务操作
- 每一个横行都是非叶节点
- 存储的是地址,索引和数据是分开的
1.4.2. innoDB
- 索引结构和值是在一起的
1.5. 将类图映射为关系表
1.5.1. ORM(Object-Relation Mapping)
- 通常⼀个类/对象映射为⼀张表
- 类的属性映射为表的列名
- 类的实例对象就是表的⾏
- 要为每个转换后的表建⽴主键
- 类/对象通过引⽤来唯⼀标识⾃⼰
- 关系/表通过主键类唯⼀标识⾃⼰
- 处理关联
- 类/对象通过链接实现关联
- 关系/表通过主键/外键对实现关联
- 1:1关联:其中⼀个表的主键,作为另⼀个表的外键;两端等价
- 1:N关联:将1端表的主键,作为N端表的外键
- M:N关联:建⽴中间表,将M的主键和N的主键都作为中间表的外键
- 在包含/聚合关联中,将整体的主键放在部分中作为外键
- 关联的最⼩基数为0,意味着相应外键可以为NULL