【软考】数据库

1. 数据模型

1.1 概念数据模型

概念数据模型一般用 E-R 图表示,常用术语如下:

  • 实体:客观存在的事物,如:一个单位、一个职工、一个部门、一个项目。
  • 属性:学生实体有学号、姓名、出生日期等属性。
  • 码:可以唯一标识实体的属性,如学生的学号。
  • 域:属性的取值范围,如:性别的域为(男,女)。
  • 实体型:实体名和属性名集合,如:学生(学号,姓名,性别,班号)。
  • 实体集:同一类实体的集合,如:全体学生。
  • 联系:实体(型)之间的对应关系。联系分为两种:实体内各属性之间的联系、实体之间的联系。
    两个实体之间的联系有 3 种类型:一对一(1:1)、一对多(1:n)、多对多(m:n)

E-R 图提供了表示实体、属性、联系的方法。实体用矩形表示,属性用椭圆表示,联系用菱形表示,联系也可能有属性。
在这里插入图片描述

1.2 结构数据模型

结构数据模型是面向数据库的逻辑结构,任何一个 DBMS(数据库管理系统)都是以某个结构数据模型为基础。

结构数据模型主要包括:

  • 层次模型(树结构)
  • 网状模型(图结构)
  • 关系模型:用二维表格结构来表示实体之间的联系
  • 面向对象模型

下面描述的就是关系模型
教师(教师编号,姓名,性别,所在系名)
课程(课程号,课程名,任课教师编号,上课教室)

在这里插入图片描述

2. 三级模式和两级映像

数据库产品有很多,但体系结构大都具有相同的特征,采用 “三级模式和两级映像”。

三级模式包括:

  • 外模式(用户模式、子模式):对应视图,用户操作的就是外模式
  • 概念模式(模式):对应基本表
  • 内模式(存储模式):对应存储文件

在这里插入图片描述

在这里插入图片描述
两级映像
数据库在三级模式之间提供了两级映像:外模式/模式映像、模式/内模式映像。两级映像保证了数据库中的数据具有较高的逻辑独立性和物理独立性。

外模式/模式映像:存在于外部级和概念级之间,实现了外模式和概念模式的相互转换。
模式/内模式映像:存在于概念级和内部级之间,实现了概念模式和内模式的相互转换。

逻辑独立性:数据的逻辑结构改变后,用户程序不用修改。但是为了保证应用程序能正确执行,需要修改外模式和概念模式之间的映像。
物理独立性:数据的内模式发生改变后,数据的逻辑结构不用变。为了保证应用程序能正确执行,需要修改概念模式和内模式之间的映像。

在这里插入图片描述

在这里插入图片描述

3. 关系模型

3.1 基本术语

  • 关系:一个关系就是一个二维表,表明就是关系名
  • 元组:二维表中的一行记录
  • 属性:二维表的列
  • 域:属性的取值范围,如性别的取值是男或女
  • 关系模式:由关系名及其属性名集合构成,如:S(Sno, Sname, SD, Sage, Sex) 表示学生关系模式
  • 候选码/候选键:能够唯一标识一个元组的属性或属性组合
  • 主码/主键:从多个候选码中选择一个作为主码。
  • 主属性:包含在候选码中的属性为主属性,不包含在任何候选码中的属性为非主属性。
  • 外码/外键:一个属性并非当前关系中的主键,而是其他关系中的主键
  • 全码:所有属性的组合才能唯一标识当前的元组
  • 超码/超键:学号是码,则(学号, 姓名)是超码

3.2 关系模型的定义

关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

关系数据结构:二维表格。

关系操作集合:选择、投影、连接、除、并、交、差等查询操作和增加、删除操作等。

关系完整性约束:

  • 实体完整性:关系中主码不能为空或部分为空。
  • 参照完整性:外码必须在以它为主键的表中能找到,或者为空(员工刚入职,部门可以为null)。
  • 用户定义完整性

4. 关系代数

4.1 关系代数表达式

在这里插入图片描述

笛卡尔积
在这里插入图片描述
:两个关系取并集
:从关系 R 中删除与关系 S 中相同的元组,记为 R-S
:两个关系取交集

在这里插入图片描述

投影:
在这里插入图片描述

选择:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
连接

(1)θ 连接:在笛卡尔积的基础上进行条件运算,可以是 >、<、≥、≤

在这里插入图片描述

(2)等值连接:在笛卡尔积的基础上进行条件运算,只能是 =
在这里插入图片描述

(3)自然连接(最重要):所有公共列的属性都相同,则合并为一条记录
(第一行开始,分别与第二个表的每一行比较)
在这里插入图片描述
原本的原理:在这里插入图片描述
没有公共属性列时,自然连接退化为笛卡尔积。

左外连接:保留自然连接中左侧表丢失的元组
在这里插入图片描述

右外连接:保留自然连接中右侧表丢失的元组
在这里插入图片描述
全外连接:自然连接后,既保留左侧表丢失的元组,又保留右侧表丢失的元组
在这里插入图片描述

题目:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2 投影、选择转 SQL

在这里插入图片描述
在这里插入图片描述
注意:select 后面不能像关系代数表达式中一样将列写成 1、2、3
在这里插入图片描述

4.3 笛卡尔积转 SQL

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.4 自然连接转 SQL

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. SQL:数据定义语言、数据操纵语言

SQL 语言按照用途可以分为:

  • DDL:数据定义语言,创建或删除数据库对象(表、索引、视图),包括 create、alter、drop
  • DML:数据操纵语言,包括 insert、delete、update
  • DQL:数据查询语言,包括 select
  • DCL:数据控制语言,包括数据库对象的事务管理和权限管理

5.1 数据定义语言 create、alter、drop

(1)创建数据库

create database 数据库名

(2)创建表

create table 表名(列名 数据类型[列级完整性约束条件][,列名 数据类型[列级完整性约束条件]]...[,表级完整性约束条件]
);

定义列时使用的基本数据类型如下:

  • integer:整数,也可写成 int
  • float(n):浮点数,精度至少为 n 位数字
  • numeric(p,d):定点数,由 p 位数字(不包括符号、小数点)组威,小数点后面有 d 位数字。也可写成 decimal(p,d) 或 dec(p,d))
  • char(n):长度为 n 的定长字符串
  • datetime:日期时间型
create table Student (Sno char(9) primary key,Sname char(20),Ssex char(2),Sage int
);

完整性约束主要有 3 种子句:

  • 主键子句(PRIMARY KEY),对应实体完整性
  • 外键子句(FOREIGN KEY),对应参照完整性
  • 检查子句(CHECK),对应用户定义完整性
create table student(-- 设置主键sno char(9) primary key,name char(20) not null,sex char(2) default '男',age int check(age>18 and age<30),email vachar(20) unique,-- 设置外键cno varchar(20) foreign key references class(cno)
)
create table student(sno char(9) not null,name char(20) not null,scno char(9),--设置主键constraint pk primary key(sno,sname),--设置外键constraint fk foreign key(scno) references class(cno)
)

(3)修改基本表结构

增加一个新列

alter table student add Sdept char(10)

修改一个新列

alter table student alter column Sdept int

删除一个列

alter table student drop column Sdept

(4)删除基本表

drop table student

5.2 数据操纵语言 insert、delete、update

插入语句

insert into student (sno, name, sex, age, email, cno) 
values('108', 'amy', '女', 18, '111@qq.com', '0901')
--如果values全部给出并且按顺序给出,可以省略列名
insert into student 
values('108', 'amy', '女', 18, '111@qq.com', '0901')

删除语句

--如果不带where条件,将删除表中的所有记录
delete from student 
where name='amy'

修改语句

--如果不带where条件,会修改所有记录的age为19
update student 
set age=19,cno='0911' 
where name='amy'

6. SQL:数据查询语言 select

在这里插入图片描述

6.1 select-from

select 语句的输出项可以是列名,或者由列名、常数和 + - * / 运算符构成的算数表达式,使用 distinct 可以使查询结果中不存在重复元组。

在这里插入图片描述

在这里插入图片描述

可以在 select 的列名后使用 as 新列名,来用新列名展示查询到的数据

select 学号 as 'sno', 姓名 as 'name', 性别 as 'sex', 班号 as 'class'
from student

from 子句中出现多个基本表或视图时,执行笛卡尔积操作。

select * from R, S

6.2 where

where 条件中可以使用的运算符:

在这里插入图片描述

(1)范围查询

select *
from tb_score
where score between 60 and 80 
--60 ≤ x ≤ 80
--等价于
select *
from tb_score
where score≥60 and score≤80

(2)字符串的匹配运算

  • % 代表任意长度的字符串(长度可以为 0),如 a%b 可以匹配 acb、acdeb 等。
  • _ 代表任意单个字符,如 a_b 可以匹配 acb、adb 等。
--查询姓王的学生的信息
select * from student where name like '王%'
-- 也可以使用 not like 来查询不姓王的记录

(3)查询在集合中的记录

--查询成绩为 85, 86, 88 的记录
select * from tb_score 
where score in (85, 86, 88)
--也可以使用 not in 查询其他记录

(4)逻辑组合运算

--查询班级为09031或性别为女的学生
select sno, name, cno from student
where cno='09031' or sex='女'

(5)空值比较运算

select * from tb_score where score is null
--也可以使用is not null来查询score不为null的记录

6.3 order by

order by 必须是 select 命今中的最后一个子句。

以学号降序查询学生信息:

select sno, name, cno from student
where sex='男'
order by sno desc
--asc是升序,desc是降序,不指定就是默认升序

以课程号升序、分数降序查询所有记录:

select * from tb_score
order by courseid, score desc

在这里插入图片描述

6.4 聚合函数

聚合函数针对一组值进行计算并返回单一的值,常与 group by 一起使用,常用的聚合函数如下表:

在这里插入图片描述

在这里插入图片描述

统计 900331 班有多少人:

select count(*) as '人数' 
from student
where cno='09031'
--如果某条记录的cno为空,
-- select count(cno)不会统计cno列为空的记录
-- select count(*)会统计

在这里插入图片描述
统计所有学生来自几个班级:

select count(distinct cno) as classnum 
from student

统计 6-116 课程的平均分:

select avg(score) as '6-116课程平均分' 
from tb_score
where courseid='6-116'

在这里插入图片描述

6.5 group by

投影中除了聚合函数列,其他列都要加在 group by 后面用于分组

查询每个课程的总分、平均分:

select 课程号, sum(分数), avg(分数) from score
group by 课程号

查询最低分大于70,最高分小于90的学生的学号:

select sno from tb_score 
group by sno
having min(score)>70 and max(score)<90

在这里插入图片描述

条件中包含聚合函数,必须使用 having 子句,不能使用 where 子句

查询最高分与最低分相差大于 12 分的课程号:

select courseid as '课程号', max(score) as '最高分', min(score) as '最低分'
from tb_score
group by courseid
having max(score)-min(score)>12

6.6 子查询

一个子查询的返回值为多行时,雷要使用 ANY、ALL、IN 和 NOT IN 等。

(1)查询与学号为105的同学同年出生的所有学生的学号、姓名和出生日期列

select 学号, 姓名, year(出生日期) as '出生年份'
from student
where year(出生日期)=(select year(出生日期) from student where 学号='105')

在这里插入图片描述

(2)查询学生人数多于5人的某课程的任课教师姓名
在这里插入图片描述

select 姓名
from teacher
where 教师编号 in(select x.任课教师编号from course x, score ywhere x.课程号=y.课程号group by x.任课教师编号having count(x.任课教师编号)>5)

(3)查询选修 3-105 课程且成绩高于任意选修 3-245 课程的学生的课程号、学号和分数,并按分数从高到低次序排列。

在这里插入图片描述

select 课程号, 学号, 分数
from score
where 课程号='3-105' and 分数 > Any(select 分数 from score where 课程号='3-245'
)
order by 分数 desc

(4)查询选修 3-105 课程,且成绩高于 3-245 课程的学生的课程号、学号和分数。

select 课程号, 学号, 分数
from score
where 课程号='3-105' and 分数 > All(select 分数 from score where 课程号='3-245'
)

在这里插入图片描述
(5)查询成绩比课程平均成绩低的学生的学号、课程号、分数

select 学号, 课程号, 分数
from score a
where 分数 < (select avg(分数) from score b where b.课程号=a.课程号
)

在这里插入图片描述

(6)查询所有任课教师的姓名和系别

exist:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则 exist 子句返回 true,这一行可作为外查询的结果行,否则不能。

select 姓名, 系别
from teacher
where exists(select * from course where course.任课教师编号=teacher.教师编号
)

在这里插入图片描述

(6)查询所有未任课教师的姓名和系别(还是上面的表)

select 姓名, 系别
from teacher
where not exists(select * from course where course.任课教师编号=teacher.教师编号
)

在这里插入图片描述

6.7 查询结果的并、交、差

union:查询所有教师和学生的姓名、性别、出生年份

select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
union
select 姓名, 性别, year(出生年份) as '出生年份'
from student

在这里插入图片描述

intersect:求交集。假如王萍既是老师,又是学生,则下面语句的运行结果就只有王萍一条记录。

select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
intersect
select 姓名, 性别, year(出生年份) as '出生年份'
from student

except:从前一个集合中去掉存在于后一个集合的记录。假如王萍既是老师,又是学生,则下面语句的运行结果就是除了王萍之外,其他老师的记录。

select 姓名, 性别, year(出生年份) as '出生年份'
from teacher
except
select 姓名, 性别, year(出生年份) as '出生年份'
from student

题目:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7. SQL 访问控制

授权:
在这里插入图片描述

收回权限:
在这里插入图片描述

(1)按要求给数据库 SPJ 中的供应商 S、零件 P、项目 J 表赋予各种权限。

  • 将对供应商 S、零件 P、项目 J 的所有操作权限赋给用户 User1 及 User2。
grant all privileges 
on table S, P, J 
to User1, User2
  • 将对供应商 S 的插入权限赋给用户 User1,并允许将此权限赋给其他用户。
grant insert 
on table S 
to User1 
with grant option
  • 将数据库 SPJ 的建表权限赋给用户 User1
grant createtab on database SPJ to User1

(2)按要求回收用户对数据库 SPJ 中供应商 S、零件 P、项目 J 表的操作权限。

  • 将用户 User1 和 User2 对供应商 S、零件 P、项目 J 的所有操作权限收回
revoke all privileges 
on table S, P, J 
from User1, User2
  • 将所有用户对供应商 S 的所有查询权限收回
revoke select
on table S 
from public
  • 将 User1 用户对供应商 S 的供应商编号 Sno 的修改权限收回
revoke update(Sno) on table S from User1

题目:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8. 视图

视图:从一个或多个基本表(或视图)导出的虚拟表。它基于查询定义来动态地获取数据,本身不包含数据。

创建视图

在这里插入图片描述
with check option:对通过视图进行的数据修改操作(update、insert、delete)进行约束。如果修改操作不满足视图创建时的 where 条件,则拒绝执行并报错。

【例】 若学生关系模式为 Student (Sno, Sname, Sage, Sex, SD, Email, Tel),建立 “计算机系” (CS表示计算机系) 学生的视图,并要求修改、插入的只有计算机系的学生。

create view cs-student
as select Sno,Sname,Sage,Sex
from student
where SD='CS'
with check option;

视图本质上是一个虚拟表,操作视图实际就是在操作基本表。

在这里插入图片描述

在这里插入图片描述
运行结果:如上面的 student 视图。

在这里插入图片描述
运行结果:student 视图中不会有这条数据,因为与创建视图时的where条件不符;但基本表(学生表)中会有。

在这里插入图片描述
运行结果:student 视图中会有这条数据,因为与创建视图时的 where 条件相符;基本表(学生表)中也会有。

在这里插入图片描述
在这里插入图片描述
运行结果:如上面的 student 视图。

在这里插入图片描述
运行结果:这条数据不会出现在 student 视图中,也不会出现在基本表(学生表)中,并且报错。

在这里插入图片描述
运行结果:这条数据会出现在 student 视图中,也会出现在基本表(学生表)中。

在这里插入图片描述
运行结果:修改失败并报错,因为不符合视图建立时的 where 条件。

在这里插入图片描述
运行结果:修改成功,因为符合视图建立时的 where 条件。

视图的删除:drop view 视图名

题目:
在这里插入图片描述

在这里插入图片描述

9. 索引

建立索引

create [unique][cluster] index <索引名>
on <表名>(<列名>[次序]...)

【例】假设供应销售数据库中有供应商 S、零件 P、工程项目 J、供销情况 SPJ 关系,希望建立 4 个索引。其中,供应商 S 中 Sno 按升序建立索引,零件 P 中 Pno 按升序建立索引,工程项目 J 中 Jno 按升序建立索引,供销情况 SPJ 中 Sno 按升序、Pno 按降序、Jno 按升序建立索引。

create unique index S-Sno on S(Sno);
create unique index P-Pno on P(Pno):
create unique index J-Jno on J(Jno);
create unique index SPJno on SPJ(Sno asc,Pno desc,Jno asc);

删除索引:drop index 索引名

内模式(存储模式):是数据物理结构和存储方式的描述,定义了内部记录的类型、索引、文件的组织方式。如:记录的存储方式是按照顺序存储,按照B树存储,还是Hash方法存储;索引按照什么方式组织;数据是否压缩存储,是否加密等。

在这里插入图片描述
在这里插入图片描述

10. 函数依赖

在关系 R<U, F> 中,R 是关系名,U 是一组属性, F 是函数依赖。

在这里插入图片描述

  • 函数依赖:学号➡姓名,就是学号决定姓名、姓名依赖于学号、学号能唯一确定姓名

  • 非平凡的函数依赖:学号➡姓名,因为姓名 ⊈ 学号,所以是非平凡的函数依赖

  • 平凡的函数依赖:(学号, 姓名)➡姓名,因为姓名 ⊆ (学号, 姓名),所以是平凡的函数依赖

  • 完全函数依赖:(学号, 课程号)➡成绩,学号或课程号都不能单独决定成绩,所以成绩完全函数依赖于 (学号, 课程号)。记作: ( 学号 , 课程号 ) → f 成绩 (学号, 课程号)\xrightarrow{f}成绩 (学号,课程号)f 成绩

  • 部分/局部函数依赖:(学号, 课程号)➡姓名,但姓名可以仅由学号决定,所以部分函数依赖于(学号, 课程号),记作: ( 学号 , 课程号 ) → p 姓名 (学号, 课程号)\xrightarrow{p}姓名 (学号,课程号)p 姓名

  • 传递函数依赖:学号➡姓名(姓名 ⊈ 学号),姓名➡性别,所以性别传递函数依赖于学号

  • 函数依赖的推理规则
    自反律:若 X 1 ⊆ X ⊆ U X_1⊆X⊆U X1XU,则 X ➡ X 1 X➡X_1 XX1
    增广律:若 X ➡ Y X➡Y XY Z Z Z⊆U,则 X Z ➡ Y Z XZ➡YZ XZYZ
    传递律:若 X ➡ Y X➡Y XY Y ➡ Z Y➡Z YZ,则 X ➡ Z X➡Z XZ
    合并规则:若 X ➡ Y X➡Y XY X ➡ Z X➡Z XZ,则 X ➡ Y Z X➡YZ XYZ
    分解规则:若 X ➡ Y X➡Y XY Y 1 Y_1 Y1⊆Y,则 X ➡ Y 1 X➡Y_1 XY1
    伪传递率:若 X ➡ Y X➡Y XY W Y ➡ Z WY➡Z WYZ,则 X W ➡ Z XW➡Z XWZ

  • 候选码:候选码能唯一确定一条记录,候选码的任意真子集不可以,即候选码要最简。候选码也称候选关键字。

  • 主码:从候选码中选出一个作为主码。

  • 主属性和非主属性:候选码中的属性称为主属性,不属于任何候选码的属性是非主属性。

  • 外码:即外键,其他关系的码。

  • 全码:所有属性的组合才能唯一确定一条记录

  • 超码/超键:学号是码,则(学号, 姓名)是超码

11. 属性闭包运算

闭包运算用于求候选码。
没有在右边出现过的属性一定包含在候选码中。

在这里插入图片描述
AC 属性没有在右边出现过,所以包含在候选码中。求闭包运算:(AC) + ^+ +➡(ABHCE) + ^+ +➡(ABDHCE) + ^+ += U,能推出所有属性,所以 AC 是候选码。

在这里插入图片描述
A 属性没有在右边出现过,所以包含在候选码中。求闭包运算:(A) + ^+ +➡(ABC) + ^+ +➡(ABCD) + ^+ += U,能推出所有属性,所以 A 是候选码。

在这里插入图片描述
A1 属性没有在右边出现过,所以包含在候选码中。但是仅有A1无法推断。但是 ( A 1 , A 3 ) + → ( A 1 , A 3 , A 2 ) {(A_1,A_3)^+\rightarrow(A_1,A_3,A_2)} (A1,A3)+(A1,A3,A2) ( A 1 , A 2 ) + → ( A 1 , A 2 , A 3 ) {(A_1,A_2)^+\rightarrow(A_1,A_2,A_3)} (A1,A2)+(A1,A2,A3),所以 ( A 1 , A 3 ) {(A_1,A_3)} (A1,A3) ( A 1 , A 2 ) {(A_1,A_2)} (A1,A2) 都是候选码。

题目:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12. 关系模式的范式

范式是衡量关系模式规范化程度的标准,目前主要有 6 种范式:1NF、2NF、3NF、BCNF、4NF 和 5NF。其中 3NF 和 BCNF 是规范化的目标。
在这里插入图片描述

12.1 第一范式

第一范式:所有属性都不可再分。不满足 1NF 的数据库不能称为关系数据库。

在这里插入图片描述

缺点:存在数据冗余和更新异常问题

【例】
在这里插入图片描述

  • 数据冗余度大:姓名、学院、院长重复存储,数据冗余;
  • 插入异常:插入一个学生的信息时,如果该学生还没有选课,就会导致插入异常(主码不完整);
  • 删除异常:如果某同学退选所有课程,就要把相关记录都删除,表中也就不存在该同学的信息了;
  • 修改异常:修改也有可能涉及多条记录的修改,比较影响效率。

12.2 第二范式

第二范式:在 1NF 的基础上,消除非主属性对候选码的部分函数依赖

上一节的例子,将关系由第一范式➡第二范式:

候选码是 (学号, 课程号),非主属性是姓名、学院、院长、课程名、成绩。其中,姓名、学院、院长部分函数依赖于候选码(学号);课程名部分函数依赖于候选码(课程号)。

  • 姓名、学院、院长分解出来,与学号构成关系:
    在这里插入图片描述
  • 课程名分解出来,与课程号构成关系:
    在这里插入图片描述
  • 剩余的成绩完全函数依赖于候选码 (学号, 课程号),所以构成关系:
    在这里插入图片描述

最终得到:

在这里插入图片描述

将一个 1NF 的关系分解为多个 2NF 的关系,可以减轻数据冗余度大、更新异常等问题,但并不能完全消除。比如第一个关系中:

  • 数冗余度大:如果多个学生来自同一个学院,则学院和院长这两个属性都要重复存储;
  • 修改异常:修改时也要大面积修改,影响效率;
  • 插入异常:如果要插入一个新的学院,没有学生学号也无法插入(缺少主码);
  • 删除异常:如果某学院第一届学生全部毕业,就要删除所有学生,但是会发现学院也随之删除了。

这是因为第二范式中可能存在传递函数依赖。在第一个关系中体现为:学号➡学院➡院长。

12.3 第三范式

第三范式:在 2NF 的基础上,消除非主属性对候选码的传递函数依赖

上一节中存在传递函数依赖的关系如下:
在这里插入图片描述
对于 学号➡学院,学院➡院长 这样的传递依赖,通常是将后者分离出来。

在这里插入图片描述

如果存在 X➡Y,Y➡Z1,Y➡Z2, Y➡Z3,也是将 Y➡Z1,Y➡Z2, Y➡Z3 分解出来组成单独的一个关系(Y, Z1, Z2, Z3)。

最终得到:

在这里插入图片描述
第三范式中,可能存在主属性对候选码的部分函数依赖和传递函数依赖。如下面的例子:

在这里插入图片描述

该例子中不存在非主属性对候选码的部分函数依赖和传递函数依赖,满足第三范式。

但是存在主属性对候选码的部分函数依赖(传递函数依赖比较少见),如:

  • (店长, 图书)➡书店,因为店长就能决定书店
  • (书店, 图书)➡店长,因为书店就能决定店长

随之而来的问题是:

  • 数据冗余:对某个书店来说,每增加一种图书就要存储一次店长的名字
  • 插入异常:新开一个书店时,还没有图书,所以数据不能插入到表中(主码不完整)
  • 删除异常:删除某种图书时,会连同书店和店长信息也删除,如果本来就只有一种图书,那么书店和店长的信息就消失了
  • 更新异常:某个书店换店长时,可能要大量修改记录,影响性能

12.4 BC 范式

BC 范式:在第三范式的基础上,如果关系 R 的每一个决定属性都包含候选码,则 R∈BCNF。

BCNF 的特点:

  • 所有非主属性对每一个码都是完全函数依赖。
  • 所有的主属性对每一个不包含它的码,也是完全函数依赖。
  • 没有任何属性完全函数依赖于非码的任何一组属性(完全函数依赖于候选码)。

前一节的例子中,主属性对候选码存在部分函数依赖,如下:
在这里插入图片描述

因为 书店➡店长、店长➡书店,意味着店长和书店对候选码存在部分函数依赖,所以先把这两个属性分离出来:
在这里插入图片描述
根据 (书店, 图书)➡库存量,分离出以下关系:
在这里插入图片描述
剩余一个函数依赖 (店长, 图书)➡库存量,可以舍弃,因为前两个关系中已经将所有属性都包括在内了,库存量这个属性也不再需要主码。

最终分解结果如下:
在这里插入图片描述

BC 范式已经消除了插入和删除异常。

12.5 第四范式(基本不考)

在这里插入图片描述
在这里插入图片描述

12.6 范式总结

在这里插入图片描述

题目:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

13. 无损连接和保持函数依赖

无损连接:分解后的关系模式通过自然连接能得到原关系中的所有属性。
保持函数依赖:分解后的关系模式能体现原关系中的所有函数依赖。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

14. 数据库设计

数据库设计策略:自顶向下、自底向上

数据库设计步骤 / 阶段

  • 需求分析
  • 概念设计:对信息进行分析和定义,常用 E-R 图来描述
  • 逻辑设计:将 E-R 图转换成关系模式,并进行规范化(消除数据冗余、数据更新异常)
  • 物理设计:逻辑模型在计算机中的具体实现,如建立数据库

当各阶段发现不能满足用户需求时,均需返回到前面适当的阶段,进行必要的修正。如此经过不断地迭代和求精,直到各种性能均能满足用户的需求为止。

14.1 需求分析

需求分析阶段:收集用户需求,确定系统边界,文档有:需求说明文档(功能模块图)、数据流程图、数据字典。

14.2 E-R 图

实体用矩形表示,关系用菱形表示,属性用椭圆表示。实体与关系通过无向边连接,并在上面标注联系的类型(1:1,1:n,m:n,m 或 n 也可以写成 *)

在这里插入图片描述

(1)两个不同实体集之间的关系

在这里插入图片描述

(2)三个不同实体集之间的关系

在这里插入图片描述
在这里插入图片描述

(3)同一实体集内的关系

在这里插入图片描述

属性分为:

  • 简单属性和复合属性:简单书信是原子的、不可再分的;复合属性可以分为更小的属性。
  • 单值属性和多值属性:一个职工的工号只有一个,则工号是单值属性;一个职工的亲属可能由多个,则亲属是多值属性。
  • NULL属性:当实体在某个属性上没有值或属性值未知时,使用 NULL 值。
  • 派生属性:可以从其他属性得来的属性。例如,职工有“参加工作时间”和“工作年限”属性,那么“工作年限”可以由当前时间和参加工作时间得到,是一个派生属性。

弱实体:一个实体的存在必须以另一个实体为前提,这类实体称为弱实体。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

14.3 概念结构设计

在这里插入图片描述

合并局部 E-R 图时,可能会出现冲突:

  • 属性冲突:不同 E-R 图中,相同属性的类型、取值范围、数据单位等可能不一致。
  • 命名冲突:同一属性在不同 E-R 图中命名不同,或名称相同的属性含义不同。
  • 结构冲突:同一实体在不同 E-R 图中属性不同,同一对象在某一分 E-R 图中可能是实体,在另一分 E-R 图中可能是属性,需要统一。

在这里插入图片描述

在这里插入图片描述

题目:

在这里插入图片描述
在这里插入图片描述

14.4 逻辑结构设计

逻辑结构的分类:层次模型、网状模型、关系模型(常用)

逻辑结构设计的工作步骤:将 E-R 图转换成关系模式,再进行关系规范化,以求达到更高的范式。

在这里插入图片描述

E-R 图不适合计算机处理,需要转换为关系模式 关系名(属性1, 属性2, …),通常采用以下方法转换:

(1)一对一联系的转换

在这里插入图片描述
(2)一对多联系的转换
在这里插入图片描述

(3)多对多联系的转换

在这里插入图片描述

题目:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

14.5 物理结构设计

在数据库的物理结构中,数据的基本单位是记录,记录是以文件的形式存储的,一条存储记录就对应着关系模式中的一条逻辑记录。在文件中还要存储记录的结构,如各字段长度、记录长度等,增加必要的指针及存储特征的描述。
在这里插入图片描述

14.6 数据库的实施和维护

在这里插入图片描述

题目:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

15. 事务管理

事务的特性:

  • 原子性:事务是一系列操作的集合,它们要么都执行,要么都不执行。
  • 一致性:事务的执行不能导致数据丢失或不一致。例如,转账操作不能改变系统中总金额。
  • 隔离性:事务的执行过程不受其他事务的影响。
  • 持久性:事务执行的结果持久化到磁盘。

题目:

在这里插入图片描述

在这里插入图片描述

16. 数据库的备份与恢复

数据库备份方法:

  • 静态转储和动态转储:静态转储是指在转储期间不允许对数据库进行任何存取、修改;动态转储在转储期间允许对数据库进行存取、修改操作。因此,转储和用户事务可并发执行。
  • 海量转储和增量转储:海量转储是指每次转储全部数据;增量转储是指每次只转储上次转储后更新过的数据。
  • 日志文件:日志中记录了对数据库执行过的操作,一旦发生故障,可以根据日志文件撤销事务对数据库的改变,回退到故障发生前的状态

事务恢复有以下3个步骤:

  • 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
  • 对事务的更新操作执行逆操作。
  • 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志。

题目:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

17. 并发控制

并发控制的主要技术是封锁。基本封锁的类型有排他锁(写锁)和共享锁(读锁):

  • 排他锁:若事务 A 对某数据对象加了排他锁,则 A 能够读取和修改该数据对象,其他事务不能再加任何类型的锁。
  • 共享锁:若事务 A 对某数据对象加了共享锁,则 A 能够读取但不能修改该数据对象,其他事务也只能加共享锁。

题目:

在这里插入图片描述

在这里插入图片描述

18. 分布式数据库

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478041.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【强化学习的数学原理】第04课-值迭代与策略迭代-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、值迭代算法二、策略迭代算法三、截断策略迭代算法四、本节课内容summary 一、值迭代算法 值迭代算法主要包括两部分。 第一…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

Spring Boot3远程调用工具RestClient

Spring Boot3.2之后web模块提供了一个新的远程调用工具RestClient&#xff0c;它的使用比RestTemplate方便&#xff0c;开箱即用&#xff0c;不需要单独注入到容器之中&#xff0c;友好的rest风格调用。下面简单的介绍一下该工具的使用。 一、写几个rest风格测试接口 RestCont…

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…

java: itext8.05 create pdf

只能调用windows 已安装的字体&#xff0c;这样可以在系统中先预装字体&#xff0c;5.0 可以调用自配文件夹的字体文件。CSharp donetItext8.0 可以调用。 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司 言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班…

基于Java Springboot公园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

Java中的File和IO流

File对象 File对象本质是一个文件或文件夹&#xff0c;用于写入和读取文件内容 注意&#xff1a;对于相对路径而言&#xff0c;在单元测试方法中的File是相对于Module&#xff0c;在main中的File是相对于Project 构造器 File(String pathname)File file1 new File("D:…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

ssm实战项目──哈米音乐(二)

目录 1、流派搜索与分页 2、流派的添加 3、流派的修改 4、流派的删除 接上篇&#xff1a;ssm实战项目──哈米音乐&#xff08;一&#xff09;&#xff0c;我们完成了项目的整体搭建&#xff0c;接下来进行后台模块的开发。 首先是流派模块&#xff1a; 在该模块中采用分…

STM32的中断(什么是外部中断和其他中断以及中断号是什么)

一、什么是EXTI 和NVIC EXTI&#xff08;External Interrupt/Event Controller&#xff09;EXTI 是外部中断/事件控制器&#xff0c;它负责处理外部信号变化&#xff0c;并将信号传递给中断控制器&#xff08;如 NVIC&#xff09;。主要负责以下功能&#xff1a; 外部事件检测…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea&#xff0c;找到连接中 文件&#xff0c;卸载即可。

js+jquery实现经典推箱子游戏

纯前端项目&#xff0c;只使用html,css,js,jquery实现经典推箱子游戏&#xff0c;直接下载本地双击index.html即可运行体验。 游戏展示 开始界面 完成游戏 代码展示

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储&#xff0c;如果不加转换的输出到外存的文件中&#xff0c;就是二进制文件。 如果要求在外存上以ASCII 码的形式存储&#xff0c;则需要再存…

监控报警系统的指标、规则与执行闭环

随笔 从千万粉丝“何同学”抄袭开源项目说起&#xff0c;为何纯技术死路一条&#xff1f; 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣&#xff0c;尚能饭否&#xff1f; 一骑红尘妃子笑&#xff0c;无人知是荔枝来! 有所依 我们如何知道系统交易…

LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读

目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES&#xff08;ECMAScript&#xff09; vs JS常量进一步探讨 obj对象的扩展面试&#xff1a;使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值&#xff1a;数组解构赋值&#xff1a;对象解构赋值&#xff1a;…