首页 > 其他分享 >关系范式详解

关系范式详解

时间:2023-03-19 11:12:58浏览次数:50  
标签:关系 依赖 范式 非主 多值 关键字 详解 属性

1 前言

img 关系模式规范化过程

函数依赖:若 Y=f(X) ,则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字将Y置为非主属性

2 范式

2.1 1NF

1NF定义:关系的所有分量都必须是不可分的最小数据项

如日期可以拆分为年、月、日三项。

2.2 2NF

2NF定义:满足1NF,且每个非主属性都完全依赖于关键字,即不存在非主属性部分依赖于关键字

单关键字中非主属性一定是完全依赖于关键字,所以所有单属性关键字关系都是2NF关系。

案例:存在关系(A,B,C,D,E,F)(下划线表示关键字,下同),具体依赖关系如下:(蓝色表示关键字,橙色表示非主属性,下同)

img

A、B为关键字,但是D、F都只依赖于B,所以不是2NF,可以将其拆分为两个关系,使其满足2NF:

(A,B,C,E)、(B,D,F),具体关系如下:

img

2.3 3NF

3NF定义:满足2NF,且每个非主属性都不传递依赖于关键字,即不存在非主属性传递依赖于关键字

案例:存在关系(A,B,C,D,E),具体依赖关系如下:

img

A、B为关键字,但是E传递依赖于A、B,所以不是3NF,可以将其拆分为两个关系,使其满足3NF:

(A,B,C,D)、(D,E),具体关系如下:

img

2.4 BCNF

BCNF定义:满足3NF,且不存在主属性依赖于非主属性(关系图中不存在回路

特别的,满足1NF的全关键字关系一定是BCNF(因为全关键字关系没有非主属性)

案例:存在关系(A,B,C,D),具体依赖关系如下:

img

A、B为关键字,但是主属性A依赖于非主属性D(即存在回路),所以不是BCNF,可以破坏回路,使其满足BCNF:

img

从3NF到BCNF的分解不能保证保持函数依赖,但可以保证无损连接。

3NF和BCNF只是在函数依赖的前提下对模式分解程度的一个测度,一个关系关系模式如果属于BCNF,那么在函数范畴内已实现了彻底的分解;3NF分解不彻底的原因是由于存在主属性对非主属性的函数依赖。

2.5 4NF

多值依赖:设有关系模式 R(U) ,X、Y、Z是U的子集,Z=U-X-Y,如果对于X的一个给定值,存在一组Y值与其对应,而Y又不与Z相关,则称Y多值依赖于X,记为X->->Y

注意:“依赖”前没有“函数”二字,函数依赖是指非主属性与关键字之间的关系。

平凡的多值依赖:若Z为空,则将多值依赖X->->Y称为平凡的多值依赖

非平凡多值依赖:若Z非空,则将多值依赖X->->Y称为非平凡多值依赖

4NF定义:满足BCNF,且不存在非平凡多值依赖

消除BCNF中的非平凡多值依赖,使其变为平凡的多值依赖,即可得到4NF。

案例:存在关系(A,B,C),具体依赖关系如下:

A B C
WH1 E1 E2 P1 P2 P3
WH2 E1 E3 P2 P4

显然有A->->B,A->->C,它们都是非平凡的多值依赖,可以将其拆分为两个表:(A,B)、(A,C),在表(A,B)中,A->->B是平凡的多值依赖,在表(A,C)中,A->->C是平凡的多值依赖,所以分解后的关系满足4NF。分解图如下(虚线表示多值依赖):

img
声明:本文转自关系范式详解

标签:关系,依赖,范式,非主,多值,关键字,详解,属性
From: https://www.cnblogs.com/zhyan8/p/17232609.html

相关文章

  • Linux 远程数据同步工具详解(rsync)
    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文......
  • 树剖详解+习题
    主要思想树链剖分(简称树剖)的思想在于将一棵树剖分为若干条链,从而转化为一个线性序列并使用数据结构维护来解决问题。以下主要讲两种:一种是重链剖分,一种是长链剖分。重链......
  • JavaScript 数据类型详解
    原文链接:​   ​​https://note.noxussj.top/?source=51cto​​常见的ES5数据类型分为基本数据类型、引用数据类型两种。包含字符串、数字、对象、数组、函数、布尔值......
  • webpack性能优化(2):splitChunks用法详解
    之前写的《​​webpack性能优化(0):webpack性能优化概况-优化构建速度​​​》、《​​webpack性能优化(1):分隔/分包/异步加载+组件与路由懒加载​​》如果使用vue-cli,默认......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上写......
  • YOLO详解------YOLOV1
    CV小白说YOLOV1题外话:目标检测是什么?它是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置。由于各类物体有不同的外观、形状和姿态,加上成像时各......
  • YOLO详解------YOLOV1
    CV小白说YOLOV1题外话:目标检测是什么?它是在图像中对一类或多类感兴趣的目标进行查找和分类,确定它们的类别和位置。由于各类物体有不同的外观、形状和姿态,加上成像时各......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上......
  • JS数组reduce()方法详解及高级技巧
        参考:https://www.cnblogs.com/webSnow/p/15262337.html......
  • Git详解
    Git的详解一.git的全局设置gitconfig--globaluser.name"username"gitconfig--globaluser.email"email"二.Git的基础命令(在需要目录下打开Gitbash窗口)1......