MySql个人总结(1)——三范式
本篇三范式的总结一个人理解为主,不像网上的那么详细,是个人的看法。
我把三个范式都浓缩为4个字(还有3个字)
第一范式:不可再分(原子性)
第二范式:完全依赖(一对一)
第三范式:直接相关(父与子)
第一范式在这里我就不过多解释了,最好理解的一个。
从第二范式开始说——完全依赖。
其实直接说完全依赖这个名字是比较专业一些的,也不太好懂,可以理解为一对一。举个例子:有一个电影表,里面包含了3个字段:影片id(主键),片名,类型id。其中影片id和片名之间是一对一的,就是这个影片id可以唯一确定一个片名,而这个片名也是唯一确定一个影片id,这时候就说该片名是完全依赖于影片id的,所以片名字段的值就是该片名。

好了,有人会问 “所以片名字段的值就是该片名” ,这句话是什么意思,咱们再来看看电影表的第三个字段 “类型id”; 😕 ,这里是存的id ,对吧,为啥是存id嘞,为啥不是直接把类型直接写进去嘞,为什么要在新建一张表来存类型嘞;

好,这时候就要讨论电影id和类型之间的关系了。
先讨论,一部电影只对应一种类型,那么一种类型对应了多种电影,那么,电影id和类型id之间就是多对一的关系,即

一个电影可以唯一的确定一种类型,但是一种类型不能唯一确定一部电影,电影id和类型之间是部份依赖的关系,如果电影表的第三个字段是类型,你直接把电影的类型直接填了进去,那么,到以后就会出现更新,删除等异常(网上有详细说明)。So,这就是为什么要将类型单独分出去一张表。
以上是一个电影只对应一个类型。
那么最后一种情况,就是一部电影有多种类型,比如一部电影即是科幻,又是恐怖,那么,如果在电影表里还按类型id字段来存值的话,要怎么存呢?我要存两个数字进去吗?中间要加个逗号吗?No,No,No。
这个时候影片id和类型之间就是多对多的关系了。

这个时候电影表里就不应该有类型id这个字段了,那有人会问,那电影的类型要存哪去?这个时候就要再新建一个类型id和电影id之间的关系表了。


So,这样就可以将一部电影存多种类型了,当我们查询电影为科幻的时候有电影1,查恐怖的时候也有电影1,查询电影1的时候有类型1,2,查询电影2的时候有类型1,2,3,这样就实现了电影和类型多对多的关系。
往往对于一部电影要有很多的关系表,比如还有国家,导演,主演等等,这些属性按正规来说是都不存在于电影表里的,是存在于关系表里的。
所以为什么画ER图的时候要分清1对1,1对多,多对一,多对多,这都是对建表有着重要作用。
那么第三范式——父与子。
其实第三范式挺好理解的,直接相关,就是没有部分相关(函数传递);或者说主键元组和其他字段之间都是爸爸和儿子的关系,没有爸爸和孙子之间的关系,网上解释也很多。
这次的总结主要说明一下第二范式的个人理解。