数据库原理学习

数据库(Database):存放和提供数据的“库房”

数据(Data):数据库中存储的基本对象。

数据库管理系统(DBMS):位于用户与操作系统之间的一层数据管理软件。

数据库系统(Database System):包括数据库、DBMS、应用系统、数据库管理员(DBA)

主键(Primary Key):用于唯一的标识表中的某一条记录的属性或属性的集合。

外键(Foreign Key):用于与另一张表关联,外键为另一张表的主键

超键(Super Key):超键是能唯一区分元组的属性或属性的集合

键(候选键):去掉了超键中多余的属性,仍然能够保证区分不同的元组。

模式(Schema):一个数据库的描述,包括对数据库结构,数据类型,还有约束。

实例(Instance / State):数据库中在某一时刻存储的真实的数据。(Instance是Schema在某一时刻的具体化、实例化)

数据操纵语言(DML:Data Manipulation Language):增删改查

数据定义语言(DDL:Data Definition Language):定义、删除、修改数据库中的对象

数据控制语言(DCL:Data Control Language):用于控制用户对数据库操纵的权限

数据模型(Data Model):现实世界数据特征的抽象,用来定义数据如何组织,数据之间的关系怎样

并相容性(Union Compatibility):两个关系具有并相容性需要保证具有相同的属性个数,以及对于每个属性都有相同的域

视图(VIEW):视图是虚拟的表,并不是物理存储的数据。而是由基本表或其他视图派生的数据。对视图的更新,实际上转换为对实际基表的更新。

数据模型(Data Model):
基本概念:现实世界数据特征的抽象,用来定义数据如何组织,数据之间的关系怎样。

层次:

1.概念模型(Conceptual):按用户的观点来对数据和信息建模

2.逻辑/实现模型(Logical / Implementation):层次模型,网状模型,关系模型

3.物理模型(Physical):数据在具体DBMS产品中的物理储存方式

数据库系统的三级模式结构:


1.内模式(Internal Schema):(也称存储模式。)数据物理结构和储存方式的描述,是数据在数据库内部的表示方式

2.概念模式(Conceptual Schema):(也称全局模式。)有时简称“模式”。是对数据库中全体数据的逻辑结构和特征的描述

3.外模式(External Schemas):(也称子模式或者用户模式。)数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述

数据库系统的两级映射以及物理、逻辑独立性:
两级映射:

1.概念模式/内模式映射

2.外模式/概念模式映射

数据的物理独立性:

内模式与概念模式之间的映射提供了数据的物理独立性。当数据的物理结构发生变化时,只需要修改内模式与概念模式之间的映射即可。

数据的逻辑独立性:

概念模式与外模式之间的映射提供了数据的逻辑独立性。当数据的整体逻辑结构发生变化时,只需要修改各个外模式与概念模式之间的映射即可保证应用程序不受影响。

数据的约束条件:完整性约束
1. 域约束:对属性取值范围的约束

2. 键约束:每个关系必须要有主键,且每个主键必须不相同

3. 非空约束:属性值不能为NULL

4. 实体完整性约束:主键值不能为空

5. 参照完整性约束:外键可以取NULL值,但若外键为另一关系主键,则不能为NULL。

6. 用户定义的完整性

各种数据操作可能违反的完整性约束

插入操作:域约束、键约束、非空约束、实体完整性约束、参照完整性约束

删除操作:参照完整性约束

更新操作:域约束、键约束、非空约束、实体完整性约束、参照完整性约束

SQL语句执行顺序:
1. FROM子句组装来自不同数据源的数据

2. WHERE子句基于指定的条件对记录进行筛选

3. GROUP BY子句将数据划分为多个分组

4. 使用聚集函数进行计算

5. 使用HAVING子句筛选分组

6. 计算所有的表达式

7. 使用ORDER BY对结果集进行排序

控制冗余(Controlled Redundancy)与非控制冗余(Uncontrolled Redundancy)的区别:
未受控制的数据存储冗余会导致如下的问题:

1. 更新数据时的重复工作

2. 浪费空间

3. 数据可能会不一致

因此,理想情况下,我们应该设计一个没有冗余的数据库,但是有时候我们需要提高查询的效率,因此我们引入了控制冗余(Controlled Redundancy)

例如:

我们将学生名和课程号冗余存储于GRADE_REPORT表中,因为查询成绩的时候我们需要同时查询学生姓名以及课程号。

关系(Relation)与文件(files)或表(tables)的不同:
关系看上去像一张二维表

关系的域(属性的取值范围)为一组原子值(不可再分割的值)

关系中的元组必须各不相同

关系代数:
五种基本运算:并、差、笛卡尔积、选择、投影

关系代数解释器:关系代数解释器(模拟关系代数)

内连接的种类:

1. 等值连接

2. 不等连接

3. 自然连接

SQL语句:
表结构的复制(不包含表之间的关系)

SELECT  *  INTO  COPY_DEPARTMENT  FROM DEPARTMENT  WHERE 1=0;

三值谓词逻辑:
1. TRUE

2. FALSE

3. UNKNOWN

只有在比较结果为TRUE是才确定为真,e.g. (TRUE与UNKNOWN交为UNKNOWN, 此元组不会出现在结果中)

数据库应用系统设计的基本过程:
Phases of Database Design andImplementation Process(数据库设计的基本过程) 

Phase 1:Requirements Collections and Analysis(需求收集与分析)

Phase 2:Conceptual Database Design(概念结构设计)

Phase 3:Choice of a DBMS(选择合适的DBMS)

Phase 4:Data Model Mapping (Logical Database Design)(逻辑结构设计)

Phase 5:Physical Database Design(物理结构设计)

Phase 6:Database System Implementation(数据库实施)

Phase 7:Database System Operation and Maintenance(数据库运行和维护)

ER图符号解释:


将ER模型映射成逻辑模型的步骤:
1. 映射强实体型

2. 映射弱实体型

3. 映射1 : 1 二元联系型

4. 映射1 : N 二元联系型

5. 映射M : N二元联系型

6. 映射多值属性

7. 映射N元联系

数据库范式:
1NF(First Normal Form):当且仅当所有域只包含原子值,即每个分量都是不可再分的数据项,则称实体E满足第一范式

2NF(Second Normal Form):当且仅当实体E满足第一范式,且每一个非键属性完全依赖主键时,满足第二范式

3NF(Third Normal Form):当且仅当实体E是第二范式(2NF),且E中没有非主属性传递依赖时,满足第三范式
---------------------
作者:jokes000
来源:CSDN
原文:https://blog.csdn.net/jokes000/article/details/7521259
版权声明:本文为博主原创文章,转载请附上博文链接!

正是数据库管理的需要催生了数据库管理系统DBMS,而关系型数据库管理系统为RDBMS

常见的数据模型有三种:
- 层次模型
- 网状模型
- 关系模型

一、关系数据库的产生
在DBMS出现之前,人们用文件来管理数据,但存在很多缺陷:
1. 数据冗余和不一致性。数据冗余表示在每个shell脚本中基本上都是/bin/bash,但很多用户使用的都是bash,那么这个可能出现多次,冗余量很大;不一致性,比如有一个数据在多个文件中都被使用,那么修改的时候,需要把每个文件都手动修改。
2. 数据访问困难。如果数据库有上千万行数据,那么我们使用时,需要把这上千万行数据全部载入内存中,再使用,对硬件的要求会很高而且载入时间很长,但其实我们需要比较的也只是那一行数据而已。
3. 数据孤立。由于数据保存在不同的文件里面,所以这些文件之间的格式可能各不相同,所以后续开发一个软件来管理的话非常困难,因为它们不满足某一个规范,使得数据之间是相互孤立的。
4. 完整性问题。例如两个转账的用户之间数额的总和应该是一样的,但如果在转账的过程中出现了问题,那么文件就无法解决,除非应用程序设计上解决,但应用程序本身并无法理解数据之间的逻辑问题。
5. 原子性问题。类似于完整性问题,数据必须从一个稳定的状态转换为另外一个稳定的状态。
6. 并发访问异常问题。按道理来讲,如果一个用户访问数据库文件的前十行,另一个用户访问最后十行,本身他们俩并不会冲突,但如果某个用户需要修改的话,另外一个用户并不能访问。因为为了保证文件的完整性,我们会加锁的,但文件级别的锁安全性太高,并不适合这种访问。
7. 安全性问题。部分访问授权很难实现,很难使某一个用户只能看到其中指定的某些字段。

因为这些问题,所以出现了关系数据库
1. 关系数据库想要解决数据冗余问题,它将每一个关系都看成了一个表,每一列都看成是一个属性,每一行看成是他的一个元组(也就是数据)如果有许多相同值的话,它将具有相同字段的值独立出来,把一张表拆分成两张表,降低所谓的冗余度,这种关系也叫做E-R关系模型(实体关系模型)

常见的关系模型(结构化数据模型)
关系模型:用一张二维表来表示关系模型
实体关系模型:将一张表拆分,让它们产生某种联系
对象关系模型:存储一些比较大的文件如何存储呢?可以将一个比较大的文件先存储在数据库文件管理系统当中的某一个存储空间上,表中用一个指针指向这么某一个数据,把它当作一个存储对象来进行管理。
半结构化数据模型:结构化是指每一行存储的都是一样的,比如/etc/passwd文件中,第一个字段为用户名,第二个为密码等。半结构化表示它并不是唯一的,可能第一行存储的是用户名和性别,第二行存储的是用户名和年龄这种,所以每一行存储不止存储它的数据,还存储它的标签。
2.关系:关系代数,支持代数运算,比如两个集合的交集、并集等。

二、SQL和关系型数据的结构
SQL:Structure Query Language(关系结构化语言)

1、sql分类
DML:数据操作语言,增删改查都是DML语句:INSERT、DELETE、UPDATE、SELECT
DDL:数据定义语言,实现数据对象的存储和定义。CREATE、DROP、ALTER
关系数据库RDB的对象基本有:库、表、索引、视图、用户、存储过程、触发器、事件调度器等。
实现数据定义时,必须考虑数据的约束关系。数据库需要能够自己检查出来有没有逻辑性的错误,所以建立的时候注意它的有效数据范围。
域约束:数据类型的约束
外键约束:引用完整性约束
主键约束:某字段能唯一标识此字段所属的实体,并且不允许为空,一张表中只能有一个主键
唯一性约束:每一行的某字段都不允许出现相同值,可以为空,一张表中可以有多个
检查性约束:比如年龄只能时int型
DCL:数据控制语言。GRANT、REVOKE,用来定义数据库中用户的访问权限
2、关系型数据的结构
表示层:表
逻辑层:存储引擎,实现表和数据文件的解构
物理层:数据文件
数据存储和查询
存储管理器
查询管理器
负责接收用户查询,理解用户查询,并将用户的查询包括存储转换为对应的存储管理器可以理解的语句,存储管理器将数据存储到磁盘上或从磁盘上删除的这么一种组件

存储管理器应该具有的组件(功能):权限及完整性管理器、事务管理器、文件管理器、缓冲区管理器

查询管理器应该具有的组件(功能):DML解释器、DDL解释器、查询执行引擎
数据存储和查询的执行过程:
1. 查询管理器接收用户查询,并理解。使用DML和DDL解释器
2. 将DML和DDL解释器的结果给查询执行引擎
3. 查询执行引擎的结果给存储管理器
4. 存储管理器将操作写入磁盘中

mysql是单进程多线程的
mysql不允许一个进程为两个用户同时提供服务,比如一个用户请求访问某一个表,而第二个用户同时访问同样的数据,这两个请求不能使用同一个进程得到服务,原因是因该考虑是否两个用户对这个数据是否都有访问权限,如果其中一个没有,那么数据的安全性不能得到保障.

单进程
多线程

守护线程:比如数据库将数据从缓冲区管理器写到磁盘上去,这个操作和应用没有任何关系,所以这些都是需要数据库本身来完成的.
应用线程

但因为数据库的请求很多时候需要的数据量是很大的,比如现在有十个用户同时对某个数据库访问,第一个用户需要载入256M的数据,第二个用户需要1G的数据等等.所以数据库通常是一个系统最慢的节点所在,应该尽量避免数据库的交互.那么应该怎么提高数据库的交互速度?

缓存:第一次查询后保存缓存第二次访问时直接使用结果
线程重用(thread reuse):一个用户退出之后,它的线程空闲下来之后不直接删除该线程,放在空闲线程池中,以后用户使用,直接用这个空闲的去响应它
三、关系运算
关系运算主要为了实现mysql语句的执行

投影:只输出指定属性
选择:只输出符合条件的行,类似于通过WHERE完成
自然连接:具有相同名字的所有属性上所有取值相同的行
笛卡尔积:不考虑表与表只见的关系,直接连接
并:和求并集相同
四、sql语言的组成部分
SQL语言的组成部分:DDL、DML、完整性定义语言(DDL的一部分功能)、视图定义、事务控制、嵌入式SQL和动态SQL、授权

使用程序设计语言如何与RDBMS交互
- 嵌入式SQL:与动态SQL类似,但是其语言必须在程序编译时完全确定下来,并由预处理器进行处理
- 动态SQL:程序设计语言使用函数(mysql_connect())或者方法与RDBMS服务器建立连接,并进行交互,通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理。

五、mysql插件式存储引擎
mysql不同的存储引擎可以实现不同的功能
- 5.5.8之前,默认引擎为MyISAM
- 5.5.8之后,默认引擎为InnoDB
简单来讲,MyISAM不支持事务,而InnoDB支持事务。所以InnoDB更适合在线事务处理系统

数据库逻辑请求过程
---------------------
作者:皛皛
来源:CSDN
原文:https://blog.csdn.net/lcl_xiaowugui/article/details/81450770
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/klb561/p/10344255.html