作者:非妃是公主
专栏:《数据库》
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
专栏系列文章
复习大纲
关系数据理论
基本概念
一、函数依赖
在一个关系模式中,属性X可以确定唯一的Y,则说:“X确定Y”或者“Y函数依赖于X”。
Y
=
f
(
x
)
Y=f(x)
Y=f(x)
二、平凡函数依赖与非平凡函数依赖
在关系模式R(U)中,对于U的子集X和Y,
如果X
→
\rightarrow
→Y,但Y
⊈
\not\subseteq
⊆X,则称X→Y是非平凡的函数依赖
若X
→
\rightarrow
→Y,但Y
⊆
\subseteq
⊆X, 则称X
→
\rightarrow
→Y是平凡的函数依赖
例:在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno)
→
\rightarrow
→Grade
平凡函数依赖: (Sno, Cno)
→
\rightarrow
→Sno
(Sno, Cno)
→
\rightarrow
→Cno
三、完全函数依赖与部分函数依赖
四、传递函数依赖
五、多值依赖
数学定义:设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。
通俗来讲:就是允许X的一个值决定Y的一组值,这种决定关系与Z取值无关。这就是多值依赖。
1NF-4NF
规范化理论:正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
1NF的定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则
R
∈
1
N
F
R\in1NF
R∈1NF。
2NF的定义:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
不能存在部分依赖关系
3NF的定义:关系模式R<U,F>中若不存在这样的码X、属性组Y及非主属性Z(Z
⊈
\not\subseteq
⊆Y),使得X→Y,Y→Z成立,(Y
↛
\not\rightarrow
BC范式:设关系模式R<U,F>∈1NF,对于R的每个函数依赖X→Y(Y
∉
\not\in
∈X),X含有候选码,那么R∈BCNF。(简言之,在BCNF中所有的依赖都是包含关键字的依赖)
4NF:关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y
⊆
\subseteq
⊆X)(即:X必须是超键),X都含有候选码,则R∈4NF。
无损连接判断方法
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join)
注意找函数依赖。
求解候选码
将依赖的属性分为4类:
1.仅仅出现在F的函数依赖左部的属性L类;
2.仅仅出现在F的函数依赖的右部的属性R类;
3.在F的函数依赖左右两边均未出现的属性N类;
4.在F的函数左右两边均出现的属性LR类。
做法:
① 找L类属性和N类属性,一定是候选码成员。
② 然后判断,L类属性和N类属性的闭包是否包含R的全部属性,
如果是,即找到一个候选码。(此种情况发生只存在一个候选码)
如果不是则重新检查判断,加剩下的属性。(此种情况发生的话,可能存在多个候选码)
模式分解
关于模式分解的几个重要事实
- 若要求分解保持函数依赖,那么模式分离总可以达到3NF,但不一定能达到BCNF
- 若要求分解既保持函数依赖,又具有无损连接性,可以达到3NF,但不一定能达到BCNF
- 若要求分解具有无损连接性,那么一定可以达到4NF。
教材198页对应内容如下:
BCNF模式分解算法
数据库设计
什么是数据库设计?
数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)
数据库设计是信息系统开发和建设的重要组成部分。
新奥尔良方法(四阶段) | |
---|---|
需求分析 | 分析用户要求 |
概念设计 | 信息分析和定义 |
逻辑设计 | 设计实现 |
物理设计 | 物理数据库设计 |
S.B.Yao(六步骤) |
---|
需求分析 |
模式构成 |
模式汇总 |
模式重构 |
模式分析 |
物理数据库设计 |
I.R.Palmer | 一步接一步的过程 | 辅助手段实现每一过程 |
---|---|---|
技术与方法 | 基于E-R模型的数据库设计 | |
基于3NF的设计 | ||
基于抽象语法规范的设计 |
例题
存储过程、函数、触发器
触发器
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活,可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
-- account(account_number, brach_name, balance)
-- depositer(customer_name, account_number)【请建立参照完整性约束】
-- 写一个SQL触发器来执行下列动作:在对账户执行delete操作时,
-- 对帐户的每一个储户,把他从depositer中也删除。
drop table depositer;
create table depositer
(
customer_name varchar(5),
account_number char(5),
primary key (account_number)
);
insert into depositer values('myf', '12345');
drop table account;
create table account
(
account_number char(5),
branch_name varchar(10),
balance int,
primary key (account_number)
);
drop trigger delete_tr;
create trigger delete_tr
on account
after
delete
as
begin
delete
from depositer
where depositer.account_number = (select account_number from deleted)
end;
-- delete from depositer as de, deleted d
-- where de.account_number=d.account_number
-- 2)创建触发器
-- branch_cust(brachname,customername)
-- account(account_number, brach_name, balance)
-- depositer(customer_name, account_number)
-- 写一个SQL触发器来执行下列动作:在对存款账户执行insert操作时,
-- 在branch_cust表中添加一条记录。
drop table branch_cust;
create table branch_cust
(
branch_name varchar(5),
customer_name varchar(5)
);
drop trigger insert_tr;
create trigger insert_tr
on account
after
insert as
insert into branch_cust
VALUES ((select branch_name from inserted), (select customer_name
from depositer, inserted
where inserted.account_number=depositer.account_number));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130545.html