秋招 基础知识之——数据库设计篇

内容参考:《数据库系统概论》(第五版),以及github笔记:

https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86.md#%E8%8C%83%E5%BC%8F

一、关系数据理论

1 函数依赖

1、记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。

2、如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为候选码,简称码(也称键码)。

3、对于 W->A,如果能找到 W 的真子集 W',使得 W'-> A,那么 W->A 就是部分函数依赖,否则就是完全函数依赖。

2 异常

以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。

SnoSnameSdeptMnameCnameGrade
1学生-1学院-1院长-1课程-190
2学生-2学院-2院长-2课程-280
2学生-2学院-2院长-2课程-1100

不符合范式的关系,会产生很多异常,主要有以下四种异常:

  1. 冗余数据:例如 学生-2 出现了两次。
  2. 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
  3. 删除异常:删除一个信息,那么也会丢失其它信息。例如如果删除了 课程-1,需要删除第一行和第三行,那么 学生-1 的信息就会丢失。
  4. 插入异常,例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。

3 范式

范式理论是为了解决以上提到的异常,高级别的范式依赖于低级别的范式。


一个低一级范式的关系模式通过模式分解可以转换为若干高一级范式的关系模式的集合,这种过程叫规范化。

1、第1范式(1NF)

每个属性值都是不可再分的最小数据单位;

2、第2范式(2NF)

每一个非主属性都完全函数依赖于候选码;

可以通过分解来满足。

分解前 

SnoSnameSdeptMnameCnameGrade
1学生-1学院-1院长-1课程-190
2学生-2学院-2院长-2课程-280
2学生-2学院-2院长-2课程-1100

以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname
  • Sno, Cname-> Grade

Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。

Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。

分解后 

关系-1

SnoSnameSdeptMname
1学生-1学院-1院长-1
2学生-2学院-2院长-2

有以下函数依赖:

  • Sno -> Sname, Sdept, Mname
  • Sdept -> Mname

关系-2

SnoCnameGrade
1课程-190
2课程-280
2课程-1100

有以下函数依赖:

  • Sno, Cname -> Grade

3、第3范式(3NF)

非主属性不传递依赖于键码;

上面的 关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解:

关系-11

SnoSnameSdept
1学生-1学院-1
2学生-2学院-2

关系-12

SdeptMname
学院-1院长-1
学院-2院长-2

4、BC范式(BCNF)

所有属性不传递依赖于键码。

关系 STC(Sname, Tname, Cname, Grade) 的四个属性分别为学生姓名、教师姓名、课程名和成绩,它的键码为 (Sname, Cname, Tname),有以下函数依赖:

  • Sname, Cname -> Tname
  • Sname, Cname -> Grade
  • Sname, Tname -> Cname
  • Sname, Tname -> Grade
  • Tname -> Cname

存在着以下函数传递依赖:

  • Sname -> Tname -> Cname

可以分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数依赖。

规范化过程小结:


二、关系数据库建模

ER图:

Entity-Relationship,有三个组成部分:实体、属性、联系。

实体型用矩形表示;属性用椭圆形表示,联系用菱形表示(1:1、1:n、m:n)。

1. 实体的三种联系

联系包含一对一,一对多,多对多三种。

如果 A 到 B 是一对多关系,那么画个带箭头的线段指向 B;如果是一对一,画两个带箭头的线段;如果是多对多,画两个不带箭头的线段。下图的 Course 和 Student 是一对多的关系。


2. 表示出现多次的关系

一个实体在联系出现几次,就要用几条线连接。下图表示一个课程的先修关系,先修关系出现两个 Course 实体,第一个是先修课程,后一个是后修课程,因此需要用两条线来表示这种关系。


3. 联系的多向性

虽然老师可以开设多门课,并且可以教授多名学生,但是对于特定的学生和课程,只有一个老师教授,这就构成了一个三元联系。


一般只使用二元联系,可以把多元关系转换为二元关系。


4. 表示子类

用一个三角形和两条线来连接类和子类,与子类有关的属性和联系都连到子类上,而与父类和子类都有关的连到父类上。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值