其他分享
首页 > 其他分享> > 尴尬的第四范式 第五范式

尴尬的第四范式 第五范式

作者:互联网

先准备几个概念防止后面对范式的理解不清晰。
候选码和主码:表中可以唯一确定一个元组的某个属性(或者属性组)叫候选码。
主码:我们从许多个候选码中挑一个就叫主码。(主键)
属性:教科书上解释为:“实体所具有的某一特性”,在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

范式的概念

第一范式:即表中的每一个属性都是不可再分的。
第二范式:符合1NF,且所有的非主属性都完全依赖于主属性。
第三范式:符合2NF,并要求任何非主属性不依赖于其他非主属性。
BC范式(BCNF):符合3NF,并且主属性内部不能有部分或传递依赖。
第四范式:消除多值依赖
第五范式:消除传递依赖

第一范式解
即表中的每一个属性都是不可再分的。
注意:这句话定义的太他妈的糟糕了,从学数据库我就没弄明白,设计了好些年数据库了,还是不太明白。
这里我这样理解,这里的不可分割是对应的从数据库的角度讲,这个数据不用在分了,想对于数据库而言的原子行。
说得具体点,这就是我定义的数据库的最小单位,无论他里面装的多丰富的内容,但是做为数据的控制而言,我就定义这么个单位。
就拿电话这个概念吧,我就定义“电话”这个属性 那么有两个电话这么办呢。
如下这样的录入数据是没有问题的
姓名 电话
张三 131457811,0431-2574214
李四 0431-1234567
但如下这样录入,就有问题
姓名 电话
张三 131457811
张三 0431-2574214
李四 0431-1234567

那么如果解决这个问题呢,很明显,用录入的方式就可以解决问题。
所以啊,这第一范式的要求,定义的不好,还不如说属性要有相对的原子行呢?

当然这里通常的解决方案应该是这样的

姓名   固定电话           移动电话
张三  0431-2574214   131457811 
李四   0431-1234567

那么这个方案有什么问题呢,明显数据有空位(李四  移动电话)

相对合理的解决方案应这样(明显没有数冗余,有id的容易,但是id的容易就行指摘一样,对空间和性能的消耗都不大)

用户表

id 姓名          
1   张三  
2   李四  

电话表

id   电话         
1   0431-2574214 
1   131457811 
2   0431-1234567
 

吐槽一

其实范式这个东西,说白了,理解好他和设计好数据库没有多大关系,理解起来太费劲了。
要我说,设计数据库就一个原则:源数据不能重复(冗余),但关系可以重复,就行对c++的设计对待数据和指针一样,个人觉得如果遵守了这个原则去设计数据库,觉得不会有任何一个范式不符合的问题。
对范式我分如下两种情况解释

对于主码不是复合属性且没有外码的情况

第一范式:即表中的每一个属性都是不可再分的。
第三范式:符合2NF,并要求任何非主属性不依赖于其他非主属性。
满足上面两个范式,数据库的设计就完美呢(不需要第二范式)

如果有了组合属性的主码呢
那问题就多喽

我这里定义一个词:
非主候选码属性:不属于主码,但属于候选码的属性
假设主码内部没有非完全依赖和部分依赖的情况,且没有非主码属性。那么到第3NF,数据库完美
符合1NF,且所有的非主属性都完全依赖于主属性。
符合2NF,并要求任何非主属性不依赖于其他非主属性。
符合3NF,并且主属性内部不能有部分或传递依赖。

假设主码内部没有非完全依赖和部分依赖的情况,且没有非主码属性。
符合1NF,且所有的非主属性都完全依赖于码。
符合2NF,并要求任何非主属性不依赖于其他非主属性。
在第3NF的基础上在加一条:
1.非主码属性完全依赖于主码,
2.非主码属性不依赖于其他非主属性

假设主码内部有非完全依赖和部分依赖的情况,且没有非主码属性。那么到BC范式(BCNF),数据库完美
第一范式:即表中的每一个属性都是不可再分的。
第二范式:符合1NF,且所有的非主属性都完全依赖于主属性。
第三范式:符合2NF,并要求任何非主属性不依赖于其他非主属性。
BC范式(BCNF):符合3NF,并且主属性内部不能有部分或传递依赖。

吐槽二

这里我又要吐槽了。
这样我定义一个概念
非主吗属性:没有在主码中出现过,这个属性就是非主属性。
第一范式:即表中的每一个属性都是不可再分的。
第二范式:符合1NF,且所有的非主吗属性都完全依赖于码。
第三范式:符合2NF,并要求任何非主吗属性不依赖于其他非主吗属性。
那么BC范式还有存在的必要吗?
难道非主吗属性可以依赖于其他非主吗属性?这个我要考虑。

那么说说非常高深的第四第五范式吧。
一个表中存在三个数据:“课程、学生、先修课”。
假设2017级的计算机专业学生想要学习JAVA课程,那么他们需要先学习VB、C#、BS三门课,才可以选择进行JAVA课程。
存在关系:
课程  学生 先修课
java 张三 VB
java 张三 C#
java 张三 BS
java 李四 VB
java 李四 C#
java 李四 BS
这我的问题就来了,这是别人举的例子,我解决过来的。
多值依赖吗,确实纯在。
确是可以用下面的设计,解决这个问题,消除多值依赖
课程  学生
java 张三
java 李四

课程 先修课
java VB
java C#
java BS

吐槽三

但我的问题是,这里的多值依赖能过第一范式吗?

第一范式:即表中的每一个属性都是不可再分的。

如果我这样录数据

课程  学生  先修课
java   张三  VB,C#,BS
java   李四  VB,C#,BS

那么可以是用不符合第一范式的理由来解决问题。

在说说第无范式
设关系模式SPJ(SNO,PNO,JNO),其中SNO表示供应者号,PNO表示零件号,JNO表示项目号。

供应者 零件号 项目号
S1 P1 J2
S1 P2 J1
S2 P1 J1
S1 P1 J1

 

 

 

 

 

 

这就像排列组合的关系(SNO,PNO,JNO)间存在传递依赖的关系。如下消除这种传递关系。

即:只存在两个属性将的关系。

项目和零件的关系

项目号 零件号
J1 P1
J1 P2
J2 P1

 

 

 

 

 

零件和供应商的关系

零件号 供应者
P1 S1
P1 S2
P2 S1

 

 

 

 

 

吐槽四:

这确实存在传递依赖的关系。但是能符合BC范式范式吗?

BC范式(BCNF):符合3NF,并且主属性内部不能有部分或传递依赖。

这第五范式的存在我觉得有点尴尬。

 

如下引用:

https://baike.baidu.com/item/%E7%AC%AC%E4%BA%94%E8%8C%83%E5%BC%8F/5025271?fr=aladdin

https://blog.csdn.net/zgcr654321/article/details/82350236

 

 

标签:非主,java,主码,第五,尴尬,依赖,范式,属性
来源: https://blog.csdn.net/xie__jin__cheng/article/details/88552967