关系型数据库

一、数据模型

1.层次数据模型(Hierarchical data model)

数据之间存在着像树一样的层级关系

定义:

  • 有且只有一个结点没有双亲结点,这个结点称为根结点
  • 根以外的其它结点有且只有一个双亲结点

特点:

  • 结点的双亲是唯一的;
  • 只能直接处理一对多的实体联系 ;
  • 任何记录值只有按其路径查看;
  • 没有一个子女记录值能够脱离双亲记录值而独立存在

2.网状数据模型(Network data model)

数据之间存在着像网一样的关系

定义:

  • 允许一个以上的结点无双亲;                                                                                                                                                   
  •  一个结点可以有多于一个的双亲

特点:

  • 允许多个结点没有双亲结点                                                                                                                                                        
  • 允许一个结点有多个双亲结点                                                                                                                                                     
  • 允许两个结点之间有多种联系                                                                                                                                                     
  • 要为每个联系命名,并指出与该联系有关的双亲记录和子女记录

以上两种模型用指针(pointer)连接数据表示他们之间的关系,指针就是表示数据在硬盘上存储位置的架构,必须要知道数据的物理地址才能处理数据,因此灵活高速地检索数据非常困难

3.关系数据模型(Relational data model)

关系型数据库采用关系模型作为数据的组织方式,数据的逻辑结构是一张二维表

完整性约束条件:实体完整性;参照完整性;用户定义的完整性

术语对比:

关系名表名
关系(Relation)—— 一个关系对应通常说的一张表一张二维表
元组(Tuple)—— 表中的一行即为一个元组记录 或 行
属性(Attribute)——表中的一列即为一个属性,给每一个属性起一个名称即属性名字段 或 列
主码,主键(Primary Key)——也称码键,表中的某个属性组(一个或多个),它可以唯一确定一个元组 
外键(foreign key)——如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 
域(Domain)——是一组具有相同数据类型的值的集合,属性的取值范围来自某个域。 
分量——元组中的一个属性值一条记录中的一个列值
关系模式——对关系的描述表头(表格的描述)

    数值为空 叫做 空值(NULL)

操作:

  • 投影(Projection):抽取表中某一列的运算
  • 选择:抽取表中某一行的运算
  • 连接:外键参照其他表格中的主键时,通过连接把两个表格黏合起来
  • 并:抽取两个表格中所有行的运算
  • 交:抽取两个表格中 都有的行
  • 差:抽取一张表格独有行的运算
  • 笛卡尔积:将两个表格中所有行 排列组合
  • 除:从“被除表格”中调出包含“除表格”中包含的所有行,然后再从中去掉“除表格”中包含的所有行

关系必须是规范化的,满足一定的规范条件。最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表

二、设计数据库

1.E-R模型(Entity,Relationship)

概念:从现实世界抽取实体,分析实体之间的关系                                                                                                                                      基数:实体之间的对应个数

E-R模型的分析方法:一对一;一对多;多对多                                                                                                                                             用E-R模型分析出来的结果不一定只有一个,因为观察世界的方法多种多样,我们只要按照自己的方法就行

规范化:规范化 就是将现实世界 落实在 关系数据库表格 的工作

    范式:一张数据表的表结构所符合的某种设计标准的级别

  • 第一范式:未分割的表格 称为 非范式(表中还有表),分割非范式,得到的表格称为 第一范式。                                                                                    第一范式(first normal form)将表格分割为单纯的二元表格
  • 第二范式:主键的值一旦确定,其他列的值也随之确定                                                                                                                                函数依赖:通过某一列的值确定其他列的值                                                                                                                                根据主键和其他列之间的函数依赖关系分割表格
  • 第三范式:按照 只能由主键确定其他列的值 分割的表格,去除传递依赖分割表格得到的                                                                            传递依赖:通过某一列的值间接确定其他列的值                                                                                                                        关系数据库中,通常使用第三范式表格

举例:

非范式

    未分割的表格中一行有两个以上的数值,我们称之为“非范式”。

    最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表

第一范式

分割非范式,得到了第一范式

    然而,如果一个还没卖出的商品“橙子”到货的话,是不能往第一范式②里面添加的,所以无法正确地管理商品。表②中关于商品的数据和销售的数据混在一起了,还不能独立管理商品!

第二范式

    销售表(第一范式①)已经是第二范式

    把第一范式②分成两个,通过主键可以确定其他列的值,表①中把“商品编码”看做主键,表②中把“报表编码”+“商品编码”看做主键

    表③中,一个水果都没有进口的“萨藏纳王国”是不能加入进去的,也即是说,出口国相关的数据和销售相关的数据混在一起了!而且,出口国名称是通过“报表编码”确定的,但实际上如果报表编码确定得话,出口国编码也就确定了,因此也就间接地确定了出口国的名称。(传递依赖:通过某一列的值间接确定其他列的值 )

第三范式

    第二范式③去除上文提到的间接关系(传递依赖),得到第三范式。

2.设计关系型数据库

概念模式(conceptual schema):将现实世界模型化,是确定数据库理论结构的阶段;                                                                                                                        概念模式的设计是通过E-R模型把握现实世界,进而规范化表格来实现的

内部模式(Internal Schema):是从计算机内部看到的数据库,是确定数据库物理构造的阶段;                                                                                                     内部模式的设计是通过设计数据库高速检索方法来实现

外部模式(External Schema):是从用户和应用的角度观察的数据库;                                                                                                                                              外部模式的设计是通过设计应用程序所必要的数据来实现的

三、什么是数据库

4个基本概念:

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

数据库(Database,DB):长期存储在计算机内、有组织、可共享的大量数据集合

数据库管理系统(DBMS):

  • 数据定义功能:提供数据定义语言(DDL)
  • 数据组织、存储和管理:提供数据操纵语言(DML)
  • 数据操纵功能
  • 数据库的事务管理和运行管理
  • 数据库的建立和维护

数据库系统(DBS)

  • 数据库
  • 数据库管理系统
  • 应用程序
  • 数据库管理员

数据库系统的特点:

  • 数据结构化
  • 数据的共享性高、冗余度低且易扩充
  • 数据独立性高
  • 数据由数据库管理系统统一管理和控制

四、使用数据库

4.1事务

使用数据库的用户可以利用数据库进行数据的检索、插入、更新、删除,用户的一连贯操作我们称之为数据库事务(Transaction)。

ACID属性(要求数据库事务具有的性质):

  • A(Atomicity) 原子性 数据库事务必须结束于提交或回滚中的任意一个任务

    提交(commit)
    回滚(rollback)

  • C(Consistentency) 一致性 执行数据库事务时不能损坏数据库的一致性

    使数据库不发生矛盾:更新遗失(lost update) 并行处理数据库时,多个事务可能同时访问相同的表格或行。此时,根据事务的处理顺序自然会发生矛盾。在数据库中,事务即时并列访问相同的资源,也不会发生矛盾。

  • I(Isolation) 隔离性 两个事务的执行是互不干扰的,一个事物不可能看到其他事务运行时,中间某一时刻的数据

    可序列化(serializable):即时多个事务并行处理也和逐个处理得到的结果一样
    锁(lock):由于安排可序列化,就有必要进行同时执行控制(concurrency control),通常由 锁 来控制,读取数据时使用共享锁(share lock),写入数据时使用独占锁(exclusive lock)。使用共享锁时,其他事务可以加设共享锁,但不能加设独占锁;使用独占锁时,无论是共享锁还是独占锁,其他事务都不可以加设。
    使用 两相锁 确保可序列化
        在确保数据库事务可序列化过程中,对于锁的设定和解除需要遵守一定的规则。
        两相锁:各事务是由加设锁和解除锁两相构成
    锁的粒度:加锁的范围
    其他同时执行控制
        时间戳控制:数据库事务给每一个被访问的数据打上了一个“时间戳”的时间印记。时间戳控制法是指某个事务要读写这个数据时,比这个事物拥有更早时间戳的事务更新了数据的情况下,不允许读写数据的方法。不许读写的情况下,回滚此事务。
        乐观控制:是一种暂时允许各事务读取的处理方法。从写入点开始,确认是否由其他的事务更新了数据,若其他事务更新了数据,则回滚。
    隔离级别(isolation level)
        概念:在现实的数据库中,同时执行的事务不断增加,因此能够逐渐控制事务之间互相干涉的级别,这叫做隔离级别
        设置隔离级别:SET TRANSACTION
            例如:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

  • D(Durability) 持久性 在事务完成之后,该事务对数据库所作的更改便持久地保存在数据库之中,并不会被回滚

    故障恢复
    检查点和恢复

事务控制语句:

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;

  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier 把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

4.2索引

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

索引的分类:

主键索引

一个列设置为主键会默认创建一个主键索引。

主键:是表中的唯一标示键。作用:保证实体的完整性;加快数据库的操作速度;增加新的表记录时,数据库会自动检索新记录的主键值,不允许该值与其他表中记录的主键重复;数据库会按主键值的顺序显示记录,如果没有设定主键,则按输入的顺序显示记录。

随表一起建索引:

CREATE TABLE customer (
id INT ( 10 ) UNSIGNED AUTO_INCREMENT,
customer_no VARCHAR ( 200 ),
customer_name VARCHAR ( 200 ),
PRIMARY KEY ( id )

添加主键索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)

单列索引

一个索引只包含单个列,一个表可以有多个单列索引。

创建索引:

CREATE INDEX indexName ON table_name (column_name);

修改表结构(添加索引):

ALTER table tableName ADD INDEX indexName(columnName);

随表创建索引

CREATE TABLE mytable(  
ID INT NOT NULL,    
username VARCHAR(16) NOT NULL,   
INDEX [indexName] (username(length))  
);  

删除索引:

DROP INDEX [indexName] ON mytable; 

唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。严格来说主键索引是唯一索引的一种,这两个的区别是:主键索引不允许为null,唯一索引可以为null。

创建索引:

CREATE UNIQUE INDEX indexName ON tableName(username(length)) 

修改表结构:

ALTER tabletableName ADD UNIQUE [indexName] (username(length))

随表创建索引:

CREATE TABLE mytable(  
ID INT NOT NULL,    
username VARCHAR(16) NOT NULL,   
UNIQUE [indexName] (username(length))  
);  

复合索引

一个索引包含多个列,列值的组合必须唯一。

#随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id),
  KEY (customer_name),
  UNIQUE (customer_name),
  KEY (customer_no,customer_name)
);
#单独建索引:
CREATE INDEX idx_no_name ON customer(customer_no,customer_name); 
#删除索引:
DROP INDEX idx_no_name  on customer ;

优缺点:

 优点缺点
索引

1、通过创建唯一性的索引,可以保证表中数据的唯一性;

2、加速数据的检索速度;

3、加快表与表之间的连接;

4、在使用分组与排序数据检索时,可以显著检索分组与排序的时间;

5、在查询的过程中使用优化隐藏器,提供系统性能

1、创建索引需要时间,且随着数据量的增加而增加;

2、索引需要占用物理空间;

3、当对表中数据进行修改时,索引也要动态维护,降低了数据的维护速度

 

 

 

 

 

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。数据库索引是存储在磁盘上,当表中的数据量比较大时,索引的大小也跟着增长,达到几个G甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能加载一部分其他的都要从磁盘中读取后加载到内存。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值