数据之间存在着像树一样的层级关系
定义:
特点:
数据之间存在着像网一样的关系
定义:
特点:
以上两种模型用指针(pointer)连接数据表示他们之间的关系,指针就是表示数据在硬盘上存储位置的架构,必须要知道数据的物理地址才能处理数据,因此灵活高速地检索数据非常困难
关系型数据库采用关系模型作为数据的组织方式,数据的逻辑结构是一张二维表
完整性约束条件:实体完整性;参照完整性;用户定义的完整性
术语对比:
关系名 | 表名 |
关系(Relation)—— 一个关系对应通常说的一张表 | 一张二维表 |
元组(Tuple)—— 表中的一行即为一个元组 | 记录 或 行 |
属性(Attribute)——表中的一列即为一个属性,给每一个属性起一个名称即属性名 | 字段 或 列 |
主码,主键(Primary Key)——也称码键,表中的某个属性组(一个或多个),它可以唯一确定一个元组 | |
外键(foreign key)——如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 | |
域(Domain)——是一组具有相同数据类型的值的集合,属性的取值范围来自某个域。 | |
分量——元组中的一个属性值 | 一条记录中的一个列值 |
关系模式——对关系的描述 | 表头(表格的描述) |
数值为空 叫做 空值(NULL)
操作:
关系必须是规范化的,满足一定的规范条件。最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表
概念:从现实世界抽取实体,分析实体之间的关系 基数:实体之间的对应个数
E-R模型的分析方法:一对一;一对多;多对多 用E-R模型分析出来的结果不一定只有一个,因为观察世界的方法多种多样,我们只要按照自己的方法就行
规范化:规范化 就是将现实世界 落实在 关系数据库表格 的工作
范式:一张数据表的表结构所符合的某种设计标准的级别
举例:
非范式
未分割的表格中一行有两个以上的数值,我们称之为“非范式”。
最基本的规范条件:关系的每一个分量必须是一个不可分的数据项,不允许表中还有表
第一范式
分割非范式,得到了第一范式
然而,如果一个还没卖出的商品“橙子”到货的话,是不能往第一范式②里面添加的,所以无法正确地管理商品。表②中关于商品的数据和销售的数据混在一起了,还不能独立管理商品!
第二范式
销售表(第一范式①)已经是第二范式
把第一范式②分成两个,通过主键可以确定其他列的值,表①中把“商品编码”看做主键,表②中把“报表编码”+“商品编码”看做主键
表③中,一个水果都没有进口的“萨藏纳王国”是不能加入进去的,也即是说,出口国相关的数据和销售相关的数据混在一起了!而且,出口国名称是通过“报表编码”确定的,但实际上如果报表编码确定得话,出口国编码也就确定了,因此也就间接地确定了出口国的名称。(传递依赖:通过某一列的值间接确定其他列的值 )
第三范式
第二范式③去除上文提到的间接关系(传递依赖),得到第三范式。
概念模式(conceptual schema):将现实世界模型化,是确定数据库理论结构的阶段; 概念模式的设计是通过E-R模型把握现实世界,进而规范化表格来实现的
内部模式(Internal Schema):是从计算机内部看到的数据库,是确定数据库物理构造的阶段; 内部模式的设计是通过设计数据库高速检索方法来实现
外部模式(External Schema):是从用户和应用的角度观察的数据库; 外部模式的设计是通过设计应用程序所必要的数据来实现的
4个基本概念:
数据(Data):存储在数据库中的基本对象
数据库(Database,DB):长期存储在计算机内、有组织、可共享的大量数据集合
数据库管理系统(DBMS):
数据库系统(DBS)
数据库系统的特点:
使用数据库的用户可以利用数据库进行数据的检索、插入、更新、删除,用户的一连贯操作我们称之为数据库事务(Transaction)。
提交(commit)
回滚(rollback)
使数据库不发生矛盾:更新遗失(lost update) 并行处理数据库时,多个事务可能同时访问相同的表格或行。此时,根据事务的处理顺序自然会发生矛盾。在数据库中,事务即时并列访问相同的资源,也不会发生矛盾。
可序列化(serializable):即时多个事务并行处理也和逐个处理得到的结果一样
锁(lock):由于安排可序列化,就有必要进行同时执行控制(concurrency control),通常由 锁 来控制,读取数据时使用共享锁(share lock),写入数据时使用独占锁(exclusive lock)。使用共享锁时,其他事务可以加设共享锁,但不能加设独占锁;使用独占锁时,无论是共享锁还是独占锁,其他事务都不可以加设。
使用 两相锁 确保可序列化
在确保数据库事务可序列化过程中,对于锁的设定和解除需要遵守一定的规则。
两相锁:各事务是由加设锁和解除锁两相构成
锁的粒度:加锁的范围
其他同时执行控制
时间戳控制:数据库事务给每一个被访问的数据打上了一个“时间戳”的时间印记。时间戳控制法是指某个事务要读写这个数据时,比这个事物拥有更早时间戳的事务更新了数据的情况下,不允许读写数据的方法。不许读写的情况下,回滚此事务。
乐观控制:是一种暂时允许各事务读取的处理方法。从写入点开始,确认是否由其他的事务更新了数据,若其他事务更新了数据,则回滚。
隔离级别(isolation level)
概念:在现实的数据库中,同时执行的事务不断增加,因此能够逐渐控制事务之间互相干涉的级别,这叫做隔离级别
设置隔离级别:SET TRANSACTION
例如:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
故障恢复
检查点和恢复
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。
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甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能加载一部分其他的都要从磁盘中读取后加载到内存。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。