数据库基础知识

常见关系型数据库

Oracle,MySQL,MariaDB,SQLserver,Access等


常见非关系型数据库(键值存储,列存储,面向文档 三种)

memcached是一套分布式的快取系统,

redis是一个key-value存储系统

MongoDB是一个基于分布式文件存储的数据库

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。


关系型数据库采用了关系模型来组织数据的数据库

关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

关系,元组,属性,域,关键字(主键),关系模型

   优点 

 

  • 容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
  • 使用方便:通用的SQL语言使得操作关系型数据库非常方便
  • 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率

 瓶颈

  •     高并发阅读需求------网站用户并发性高,硬盘I/O瓶颈大,读写性能比较差
  •     海量数据的高效率读写-----网站每天产生的巨大数据量,一张包含海量数据的关系表中查询,效率是非常低的
  •     高可扩展性和可用性------具有固定的表结构,其扩展性极差,对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。不像web server和app server那样可以简单的通过添加更多的硬件和服务 节点来扩展性能和负载能力。

在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询

对于网站而言,一些特性不那么必要,,事物一致性,读写实时性,复杂SQL,多表关联查询等

关系型数据库的最大特点  事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有要求的系统中,如典型的银行系统。

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

虽然索引的建立在提高检索效率方面具有诸多积极的作用,但还是存在下列缺点  [1]   :
  • 在数据库建立过程中,需花费较多的时间去建立并维护索引,特别是随着数据总量的增加,所花费的时间将不断递增。
  • 在数据库中创建的索引需要占用一定的物理存储空间,这其中就包括数据表所占的数据空间以及所创建的每一个索引所占用的物理空间,如果有必要建立起聚簇索引,所占用的空间还将进一步的增加
  • 在对表中的数据进行修改时,例如对其进行增加、删除或者是修改操作时,索引还需要进行动态的维护,这给数据库的维护速度带来了一定的麻烦。

https://github.com/CyC2018

  • 事物的四大特性:
        原子性;隔离性;一致性;持久性。
  • 数据不一致:
        丢失修改;读到脏数据;不可重复读。

       对应的三级数据协议解决数据不一致问题。

【幻读、脏读、不可重复读】

  • 幻读:行不一致针对其他提交前后,读取数据条数的对比) 幻读是指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。可以针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。
  • 脏读:回滚+未提交;针对未提交数据)如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以“看到”该事务没有提交的更新结果,这样造成的问题就是,如果第一个事务回滚,那么,第二个事务在此之前所“看到”的数据就是一笔脏数据。
  • 不可重复读:(针对其他提交前后,读取数据本身的对比)不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的,所以,Read Uncommitted也无法避免不可重复读取的问题。
  • 数据隔离级别:mysql的innodb引擎对四个隔离级别都支持, 默认是Repeated Read

        为了防止数据不一致的情况。【四种,依次可以解决 丢失修改- 脏读-丢失修改和脏读-幻读】

1.Read uncommitted(未授权读取、可读未提交的):避免更新的丢失,但如果回滚可能出现脏读。

2.Read uncommitted(授权读取、读提交的):避免脏读,但可能被修改出现不可重复读。A读完-B修改-A再读-不可重复。

3.Repeatable read(可重复读取):X、S锁使用起。

4.Serializable(序列化):如果并行的事务的执行结果和某一个串行的方式执行的结果一样,那么可以认为结果是正确的)。

严格的事物隔离,一个接一个,不能并发执行。代价大。通过行级锁和间隙锁等实现???

  • 封锁的类型:

        排他锁(X型);共享锁(S锁)。

  • 封锁协议(三级)

1 级封锁协议:不丢失更新【修改+X+事务结束释放】

  • 事务 T 要修改数据 A 时必须加 X 锁,直到事务结束才释放锁。
  • 可以解决丢失修改问题;
2 级封锁协议:不读脏数据【读取+S +读完释放  &&  修改+X】
  • 在 1 级的基础上,要求读取数据 A 时必须加 S 锁,读取完马上释放 S 锁。
  • 可以解决读脏数据问题,因为如果一个事务在对数据 A 进行修改,根据 1 级封锁协议,会加 X 锁,那么就不能再加 S 锁了,也就是不会读入数据。

3 级封锁协议:可重复读 【读取+S+事务结束释放 && 修改+X+事务结束释放

  • 在 2 级的基础上,要求读取数据 A 时必须加 S 锁,直到事务结束了才能释放 S 锁。
  • 可以解决不可重复读的问题,因为读 A 时,其它事务不能对 A 加 X 锁,从而避免了在读的期间数据发生改变

两段锁协议(Two-Phase Locking-2PL)

两段锁协议规定所有的事务应遵守的规则:

  ① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
  ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
  即事务的执行分为两个阶段:
  第一阶段是获得封锁的阶段,称为扩展阶段。

  第二阶段是释放封锁的阶段,称为收缩阶段。



 定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。

对于遵守两段协议的事务,其交叉并发操作的执行结果一定是正确的。值得注意的是,上述定理是充分条件,不是必要条件。一个可串行化的并发调度的所有事务并不一定都符合两段锁协议,存在不全是2PL的事务的可串行化的并发调度。

遵循两段锁协议的事务有可能发生死锁。此时事务T1 、T2同时处于扩展阶段,两个事务都坚持请求加锁对方已经占有的数据,导致死锁。又有了一次封锁法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议,但两段锁并不要求事务必须一次性将所有要使用的数据全部加锁,这一点与一次性封锁不同,这就是遵守两段锁协议仍可能发生死锁的原因所在。


范式
关系数据库的范式理论为了解决四种异常
1.数据冗余
2.插入异常(eg:选课信息表中,还没选课的学生信息无法插入)
3.修改异常
4.删除异常

高级别范式的依赖基于低级别的范式。【对于函数依赖 W->A,A依赖于W,如果能找到 W 的真子集使得 A 依赖于这个真子集,那么就是部分依赖,否则就是完全依赖】

如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码用于唯一表示一个实体。键码可以由多个属性构成,每个构成键码的属性成为码。 主键是概括表关系的最小属性集合。

  • 第一范式:属性不可分,数据表的列不可再分
  • 第二范式:每个非主属性完全函数依赖于键码首先满足第一范式,并且表中非主键列不存在对主键的部分依赖,
       主键为 学号、课程名,但是有院长名 依赖于 学院 依赖于 学号,是部分依赖于主键,so  不是第二范式。下图 分解后的是。



  • 第三范式:非主属性不传递依赖于键码。满足第二范式,并且表中的列(非主属性)不存在对非主键列的传递依赖。
         上图2  院长名 依赖于 学院,学院依赖于 学号(主键),可以把图继续分解,为(学号->姓名->学院,学院->院长)所以是第三范式。对主键的传递依赖就消失了。
  • BC范式:所有属性不传递依赖于键码。

关系模式 STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖:


分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。????

数据库模式 概念模式和逻辑模式,概念模式可以用概念 - 关系来描述;逻辑模式使用特定的数据模式(比如关系模型)来描述数据的逻辑结构,这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。

  • 模式:全局逻辑结构

        把模式的全局逻辑结构和内模式的物理结构联系起来,该映像可以保证数据和应用程序的物理独立性。

  • 外模式/模式映像:局部逻辑结构

        把外模式的局部逻辑结构和模式的全局逻辑结构联系起来。该映像可以保证数据和应用程序的逻辑独立性。

  • 内模式:物理结构。

        又称为存储模式,描述记录的存储方式,例如索引的组织方式、数据是否压缩以及是否加密等等。

ER图  Entity-Relationship,包含三个部分:实体、属性、联系( 1 对 1,1 对多,多对多三种)。

数据模型 由数据结构、数据操作和完整性三个要素组成。

数据库系统 包括了数据库,数据库管理系统,应用程序以及数据库管理员和用户,还包括相关的硬件和软件。也就是说数据库系统包含所有与数据库相关的内容。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值