数据库复习02:设计与应用篇

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 数据库复习02:设计与应用篇,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

作者:非妃是公主
专栏:《数据库》
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

专栏系列文章

数据库复习01:基础篇

数据库复习02:设计与应用篇

数据库复习03:系统篇

数据库复习04:课后习题

SQL Server Studio查看“估计的执行计划”和“实际的执行计划方法”

SQL Server中C/C++数据类型与ODBC c类型对照(将C/C++数据对象存到SQL Server数据库中)

复习大纲

在这里插入图片描述

关系数据理论

基本概念

一、函数依赖

在一个关系模式中,属性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

R1NF

在这里插入图片描述
2NF的定义:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。

不能存在部分依赖关系

3NF的定义:关系模式R<U,F>中若不存在这样的码X、属性组Y及非主属性Z(Z

⊈

\not\subseteq

Y),使得X→Y,Y→Z成立,(Y

↛

\not\rightarrow

X,即Y不能包含候选码),则称R<U,F>∈3NF。
在这里插入图片描述

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!