理解数据库范式

需要了解的一些前置定义:

:一些相同类型数据的集合
例如:自然数,整数是一个域,{男,女}也是一个域

笛卡尔积:有多个域,从每个域中挑选出一个元素,组合成一个新元素.

D1xD2xD3x...Dn,分别从D1到Dn挑选出一个元素,组合成一个新元素(d1,d2,d3...dn)由于挑选的元素不同,组成多种新元素,它们的另一个名字就叫做元组,因此(d1,d2,d3...dn)也称为元组,像1,d2,这样的值就称为分量

例子:D1=学生姓名(张三,李四,王二麻子),D2=专业(网络工程,软件工程,物联网),D3=性别(男,女)
则:D1xD2xD3={
(张三,网络工程,男),
(张三,网络工程,女),
(张三,软件工程,男),
(张三,软件工程,女),.....(原谅我懒...)
(王二麻子,物联网,男),
(王二麻子,物联网,女)
}就是数学上的排列组合,域中的元素都组合一遍,
能产生多少种这种组合数,就叫做基数(不允许将重复的算进来)
但是笛卡尔积只有部分子集才真正有意义

关系:就是笛卡尔积的子集,如:像(张三,网络工程,男)这样的元组可以表示什么样的信息,我们就根据情况定义为 ''学生信息表''

属性:在学生信息表中,为了区分每一列所表达的信息,为它们取个名字,就称为属性.如:(姓名,专业,性别)

候选码:假如有这样的表
(学号,院系,性别),只要知道学号就知道所在的院系以及性别,则学号可以唯一标识这个元组,那么称学号为候选码,这里只是一个属性当做候选码,若多个属性才能标识元组,那么这个属性组当做候选码

主码:当一个元组有多个候选码时,只能选定一个当主码

例如:设有这样的表(学生,课程,名次),有多门选修课,每个学生选修每门课有一定的名次(没有并列名次),那么有(学生,课程)这信息就可以知道该学生的名次,而知道(课程,名次)也可以知道是哪个学生.故,该表有两个候选码(学生,课程),(课程,名次)

主属性与非主属性:
在候选码的属性称为主属性,不在候选码中的属性就称为非主属性

关系模式:对关系的描述称为关系模式
表现形式为R(U,D,DOM,F)
R:就是关系名,想是给一个表命名,就如上面的"学生信息表"
U:组成该关系的属性组,就是给每一列命个名,然后组合在一起
D:就是上面说的域,也就是属性组选自哪里
DOM:是属性向域的映像集合,D只表明了有哪些域,却没说明哪些属性来自哪些域,而DOM则指明了属性与域的对应关系,但是有可能不同属性来自同一个域,为了区别不同的属性,为它们取名.
根据名字判断来自哪个域
即:所谓的属性向域的映像集合,如:
DOM(整数集)=DOM(自然数集)=实数
F:是属性组U上的一组数据依赖(稍后再描述)

第一范式(1NF)

要求:每一列属性不可再分

如:
clipboard.png
在右边的联系方式进行了再分,是不符合第一范式的

数据依赖

定义:属性与属性之间的约束关系
分类:

  • 函数依赖
  • 多值依赖
函数依赖

定义:描述一个学生的关系(学号,姓名,院系),由于一个学号只对应一个学生,一个学生只在一个院系学习.因此当学号确定后,学生的姓名,所在的院系也确定了,像这种一一对应的关系类似于数学中的y=f(x),因此就称为函数依赖

  • 现在来解决之前的问题F是什么:
    设Sno(学号),Sname(姓名),Sdept(院系),
    Sname=f(Sno),Sdept=f(Sno),即Sno决定Sname,Sno决定Sdept,
    像这种谁决定谁,就用Sno→Sname,Sno→Sdept表示
    之前说F是属性组U上的一组数据依赖
    U={Sno,Sname,Sdept},
    那么F{Sno→Sname,Sno→Sdept}

在函数依赖中又分几种依赖:

  • 非平凡的函数依赖
    定义:若X→Y,但Y⊈X,则称X→Y是非平凡函数

    • 平凡的函数依赖
      定义:若X→Y,但Y⊆X,则称X→Y是平凡函数
      例子:

假设有这样的关系S(学号,性别,课程号),一组属性(学号,性别)→性别,就是平凡函数,因为性别是(学号,性别)的子集;
而学号→性别,就是不平凡函数

  • 完全函数依赖
    定义:就是若X→Y,而X的子集X'↛Y
    例子:

R(学号,课程号,分数),只有该学生的学号与所选的课程号确定,才确定该生该课程的分数.(学号,课程号)→分数,而单独的学号或者课程号都无法决定分数,称这样的依赖关系为完全函数依赖

  • 部分函数依赖
    定义:X→Y,但是X的子集X'也可以确定Y(这样的X也称为超码)
    例子:

R(学号,课程号,院系),(学号,课程号)→院系,但是只需知道学号就可以知道所在的院系,即学号→院系,称这样的关系为部分函数依赖

  • 传递函数依赖:
    定义:若X→Y,Y→Z(Y↛X,都是非平凡依赖),则称Z对X传递函数依赖,X→传递Z
    例子:

设有这样的关系SL(学号,院系,学生居住地),假设同一个院系的学生住在同一个地方,那么有以下关系,
学号→院系,院系→学生居住地,可以得到学号→学生居住地(在箭头上有'传递'这字,我不知道怎么弄)

一些表达式记法:
若X→Y,同时Y→X就记作X←→Y
若Y不依赖X,记作X↛Y

外码:
定义:R中的属性或属性组X不是R的码,而是其他模式的码,则称X为R的外码
例:

Sno(学号),Cno(课程号),Grade(分数)
SC(Sno,Cno,Grade)中,(Sno,Cno)是码,而Sno是外码


第二范式2NF

定义:非主属性完全依赖候选码,则称为第二范式

理解:

(记得上面所说的部分依赖,其子集也可以确定其他属性)


第三范式(3NF)

定义:在满足第二范式的前提下,消除传递依赖
例:

R(Sno,Sdept,Sloc),Sloc是学生居住地方(一个系的住在同一个地方),Sno→Sdept,Sdept→Sloc,所以Sno→Sloc,所以这个关系不满足第三范式,需要消除它(至于怎么做,不在这次讨论范围)
而像S(Sno,Cno,grade)就属于第三范式,应为没有传递依赖


BCNF范式

定义:在满足第三范式的前提下,所有的依赖关系都是对码的依赖
例:

STJ(S,T,J)模式,S代表学生,T代表教师,J课程,
教师只教一门课
(S,T)→J,(S,J)→T,T→J.
在这个例子中(S,T),(S,J)都是候选码,但T不是,故不是BCNF范式,若不存在T→J就是BCNF范式


第四范式

先了解一下基础知识

多值依赖
img_20190512_204951.jpg

定义:定义别看了,估计也看不懂
设关系R(U),X,Y,Z是U的子集,且X+Y+Z=U,在R(U)中的任意关系r,给出一对值(x,z),就有一组相应Y的值,这组值仅仅决定于x的值,与z无关.表示方法:X→→Y(Y多值依赖于X,X多值决定Y)
例:

(物理,普通物理学)与(物理,光学原理)对应的一组值都是{李勇,王军},起决定作用的是课程C

  • 平凡的多值依赖:
    若X→→Y,而Z=∅,则称X→→Y为平凡的多值依赖
第四范式

定义:在R(U)中,非平凡多值依赖X→→Y(Y⊈X),且X含有码,称这样子的式子为第四范式
本质:不允许有非平凡且非函数依赖的多值依赖
可能难以理解,翻译一下:

例:

在WSC(W,S,C)中,W代表仓库,S代保管员,C代表商品
有多个仓库,每个仓库配备了多个保管员,每个保管员管理多种商品
在WSC模式中W→→S,W→→C都是非平凡的多值依赖,但是W不是码,而(W,S,C)才是码,故WSC∉4FN
但是若将WSC模式分解为WS(W,S),WC(W,C)
WS虽然有W→→S,确实平凡的多值依赖,但满足不允许有非平凡且非函数依赖的多值依赖,故WS∈4NF,同理WC∈4NF.


第四范式书上讲的也很模糊,网上的也没看太懂,以后知识到达到后再仔细了解,以后有空写范式之间的联系,以及每个范式优缺点,和如何消除缺陷

草图24 (2).png

草图25 (2).png

你可能感兴趣的:(理解数据库范式)