SQL范式

来源:互联网 发布:婚礼布置设计软件 编辑:程序博客网 时间:2024/05/21 12:43
本文转载自 http://blog.163.com/clevertanglei900@126/blog/static/111352259201131133326275/
  • 范式(Normal Form)

范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同的范式。

定义:如果一个关系模式R的所有属性都是不可分的基本数据项,则称关系R为第一范式的关系模式(First Normal Form),简称关系R属于一范式,记为:R1NF

  • 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。(由关系属性的原子性得出)
  • 但是满足第一范式的关系模式并不一定是一个好的关系模式。

      

定义:若关系模式R1NF,并且每一个非主属性都完全函数依赖于R的码,则R2NF。即不存在部分依赖

SLC(Sno, Sdept, Sloc, Cno, Grade)

  每个属性都是由不可再分的值构成,故SLC1NF

  候选码:(Sno, Cno)

    非主属性: Sdept, Sloc, Grade

          SnoSdept,故(Sno, Cno)  P  SdeptSLC2NF

不属于2NF的关系模式存在的问题:

(1) 插入异常

假设Sno'95102'Sdept'IS'Sloc'N'的学生还未选课(Cno为空值),因课程号是主属性,故不满足实体完整性约束,因此该学生的信息无法插入SLC

(2) 删除异常

假定某个学生本来只选修了c3号这一门课程。现在因身体不适,他连c3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除。

不属于2NF的关系模式存在的问题:

(3) 数据冗余度大

如果一个学生选修了10门课程,那么他的SdeptSloc值就要重复存储了10次。

(4) 修改复杂

例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部SdeptSloc信息。

  • 原因SdeptSloc部分函数依赖于码。
  • 解决方法SLC分解为两个关系模式,以消除这些部分函数依赖

SC(Sno, Cno, Grade)2NF

SL(Sno, Sdept, Sloc)2NF

定义: 关系模式R<U,F> 中若不存在这样的X、属性组Y非主属性 (? Y )使得  XY  Y  YZ,成立,则称R3NF

说明:①对Y未作任何限制。

            ②若 ? Y,则必有 YZ。由于 是码,那么 XY必然成立。这无意义(任何关系都存在这样的XYZ)

 YX,则由 是码知 XYXZ,那么 X Y也必然成立,这也无意义。

 

结论:3NF不存在非主属性对码的部分依赖(2NF),也不存在非主属性对码的传递依赖。

即:若R3NF,则R中的每一个非主属性既不部分依赖于码,也不传递依赖于码。

例:SC(Sno, Cno, Grade)2NF

码:(Sno, Cno),非主属性: Grade

非主属性Grade直接依赖于码(Sno, Cno) Grade而非传递依赖于码,故SC 3NF

    SL(Sno, Sdept, Sloc)2NF

  码:Sno,非主属性: Sdept, Sloc

FDSno SdeptSdept  Sloc。则有Sno Sloc,即存在非主属性对码的传递依赖,故SL不属于3NF

 

定义:设关系模式R<U, F>1NF,如果对于R每个函数依赖XY (Y?X) X必包含码,则RBCNF(Boyce Codd Normal Form),又称修正(或扩充)的第三范式。

结论:每个非平凡函数依赖的决定因素都包含码

定理:

③若RBCNF,则R中所有主属性对每个不包含它的码都完全函数依赖。

证明:A是主属性,K是码,A?K。根据码的定义可得KA;假设此依赖为部分依赖,那么存在K’?K,使得K’→AA?K’。但K’不包含码,这与BCNF定义矛盾。

④若RBCNF,则R中没有任何属性完全函数依赖于非码的任何一组属性。(去除了对码的传递依赖的可能)

证明:X为非码属性组,A?XXA为完全依赖。由BCNF定义知,X含有码。于是存在码K?XKA。这与XA为完全依赖矛盾。

例:关系模式SJP(S, J, P) 中,S是学生,J表示课程,P表示名次。每一学生选修每门课程的成绩都有一定名次,且名次不重复。

    FD: (S, J)P(J, P)S

    码: (S, J) (J, P)

    非主属性:无

    ①不存在非主属性对码的部分依赖 SJP2NF

    不存在非主属性对码的传递依赖 SJP3NF

    每一个函数依赖的决定因素都包含码SBCNF

 

例:在关系模式STJ(S, T, J)中,S表示学生,T表示教师,J表示课程。每一教师只教一门课。每门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称。

由语义得如下FD

(S, J)T(S, T)JTJ

函数依赖图:                                                          

SQL范式 - Leo - 好记性不如烂笔头---Leo

码: (S, J) (S, T)

非主属性:无

不存在非主属性对码的部分依赖 STJ 2NF

不存在非主属性对码的传递依赖 STJ 3NF

存在函数依赖TJ,其中的决定因素T不包含码 STJ ? BCNF

 

结论BCNF消除了主属性对码的部分依赖和传递依赖,在函数依赖的范畴内解决了数据插入异常和删除异常,但可能存在着数据冗余和修改复杂。

                         1NF

                           消除非主属性对码的部分函数依赖

                2NF

                                  消除非主属性对码的传递函数依赖

                       3NF

                           消除主属性对码的部分和传递函数依赖

                         BCNF

                           消除非平凡且非函数依赖的多值依赖

                         4NF

0 0
原创粉丝点击