1
00:00:01,030 --> 00:00:05,820
接下来,我们就开始讲解的知识点
2
00:00:05,830 --> 00:00:11,810
就是范式知识点
3
00:00:12,130 --> 00:00:17,490
关系这个理论里面,随着历史的发展
4
00:00:17,700 --> 00:00:21,280
它发展出很多的范式
5
00:00:23,110 --> 00:00:24,590
那么这些范式的作用
6
00:00:27,020 --> 00:00:31,260
按照科德的说法就是说
7
00:00:33,100 --> 00:00:37,280
只要数据是按照范式组织起来的
8
00:00:39,330 --> 00:00:42,130
那么所有的数据
9
00:00:42,140 --> 00:00:46,030
都可以通过基本运算来获取
10
00:00:48,560 --> 00:00:52,880
就是说合法的数据的组织
11
00:00:54,860 --> 00:00:58,890
就是平时我们看到的那些什么报表之类的
12
00:00:58,900 --> 00:01:02,300
只要你报表上这个信息是合法的
13
00:01:02,430 --> 00:01:04,100
当然报表信息可能很多个
14
00:01:04,110 --> 00:01:05,380
它可能来自很多表
15
00:01:05,590 --> 00:01:09,250
但是它们放在一起是合法的
16
00:01:10,190 --> 00:01:12,350
这种组合,都可以通过基本
17
00:01:12,360 --> 00:01:14,610
的运算来获取
18
00:01:17,810 --> 00:01:18,920
实际上这些范式
19
00:01:18,930 --> 00:01:22,340
也是我们后面的
20
00:01:22,350 --> 00:01:28,560
面向对象建模的一些什么基本原则等等
21
00:01:30,030 --> 00:01:31,550
它的理论基础了
22
00:01:32,230 --> 00:01:36,190
我们软件方法里面也列了一些
23
00:01:36,560 --> 00:01:39,670
什么的什么,不能什么的什么的什么
24
00:01:40,300 --> 00:01:43,090
实际上就是一个什么传递的依赖
25
00:01:43,570 --> 00:01:46,650
什么的什么
26
00:01:46,660 --> 00:01:48,540
还有一对多、多对多
27
00:01:48,550 --> 00:01:50,970
不能有多个,什么之类的
28
00:01:52,930 --> 00:01:53,710
类似这样的
29
00:01:57,480 --> 00:02:03,700
所以了解了这些范式
30
00:02:04,380 --> 00:02:07,780
我们才可以知道为什么后面要这样来做
31
00:02:10,270 --> 00:02:11,790
因为你不这样做
32
00:02:12,350 --> 00:02:14,700
那么很可能你的数据本身
33
00:02:14,710 --> 00:02:18,010
它就是违反范式的,违反范式
34
00:02:18,020 --> 00:02:21,290
就会带来一些不好的后果
35
00:02:21,500 --> 00:02:23,010
比如说,数据冗余
36
00:02:23,970 --> 00:02:26,170
比如说,修改的异常
37
00:02:26,680 --> 00:02:30,090
删除的异常,等等
38
00:02:30,180 --> 00:02:31,810
插入的异常等等
39
00:02:33,750 --> 00:02:36,410
所以了解这些范式
40
00:02:37,380 --> 00:02:39,450
的基本要点是有必要的
41
00:02:40,680 --> 00:02:42,550
但现在有一些人说
42
00:02:42,840 --> 00:02:44,390
我们现在要注重性能
43
00:02:44,600 --> 00:02:46,110
说现在流行什么
44
00:02:46,910 --> 00:02:47,990
非关系数据库
45
00:02:48,160 --> 00:02:49,590
所谓NoSQL
46
00:02:51,130 --> 00:02:53,040
NoSQL,非关系数据库,干嘛的
47
00:02:53,970 --> 00:02:55,930
通过添加冗余
48
00:02:57,030 --> 00:02:58,080
来改善性能
49
00:03:00,630 --> 00:03:02,280
像我们刚才说符合范式
50
00:03:02,290 --> 00:03:05,990
你所有的各种各样的报表的组合
51
00:03:06,000 --> 00:03:07,340
都可以通过运算获取
52
00:03:07,350 --> 00:03:09,810
那你还得算
53
00:03:10,730 --> 00:03:13,000
假设他
54
00:03:14,250 --> 00:03:15,610
到处都放很多冗余
55
00:03:15,950 --> 00:03:17,300
那就不用算了
56
00:03:19,620 --> 00:03:20,730
所以性能就快
57
00:03:21,680 --> 00:03:23,870
但显然这种会带来什么
58
00:03:24,040 --> 00:03:26,910
逻辑上就会出现什么
59
00:03:27,820 --> 00:03:30,400
带来逻辑上的各种压力
60
00:03:32,200 --> 00:03:33,600
所以
61
00:03:33,930 --> 00:03:37,310
即使有性能上的这种问题
62
00:03:37,320 --> 00:03:39,340
需要被迫
63
00:03:39,350 --> 00:03:41,460
要违反范式添加冗余
64
00:03:41,470 --> 00:03:44,790
你也先得懂得有哪些范式
65
00:03:45,430 --> 00:03:46,540
先懂得规范
66
00:03:46,850 --> 00:03:50,150
然后才有资格谈不规范应该怎么做
67
00:03:50,610 --> 00:03:52,250
什么情况下可以不规范
68
00:03:52,260 --> 00:03:53,770
连规范是什么都不知道
69
00:03:54,680 --> 00:03:58,340
然后就说,反正规范是可以违反的
70
00:03:58,350 --> 00:04:01,020
所以我就不用学了
71
00:04:01,240 --> 00:04:02,280
很多人就是这样的
72
00:04:03,210 --> 00:04:06,150
因为规范不是不可以违反
73
00:04:06,510 --> 00:04:07,950
所以规范就没用
74
00:04:09,430 --> 00:04:10,070
不是这样的
75
00:04:10,640 --> 00:04:13,450
他就把一个特例当成了什么
76
00:04:14,790 --> 00:04:17,380
当成了一个常例了
1
00:00:00,780 --> 00:00:03,140
那么这种也是经常我们很多人
2
00:00:03,550 --> 00:00:05,050
偷懒的一个遮羞布
3
00:00:05,060 --> 00:00:09,440
他就把概率很小的
4
00:00:10,180 --> 00:00:11,940
但是也不是不可能发生的
5
00:00:12,980 --> 00:00:13,810
就当成
6
00:00:15,020 --> 00:00:16,020
概率很大的了
7
00:00:18,610 --> 00:00:21,490
比如说,就拿我们经常举例的买彩票来说
8
00:00:21,850 --> 00:00:24,560
买彩票大概率不中的
9
00:00:25,360 --> 00:00:26,680
但也有一点点概率中
10
00:00:29,610 --> 00:00:35,040
他就不管99.99999%不中
11
00:00:35,270 --> 00:00:39,490
你看,也有中的
12
00:00:39,500 --> 00:00:43,760
所以这个中才是真理
13
00:00:44,370 --> 00:00:45,690
另外他就不管了
14
00:00:47,000 --> 00:00:50,520
但是那个很小,基本不可能的
15
00:00:53,810 --> 00:00:55,690
所以大谈什么不规范的人
16
00:00:56,180 --> 00:01:00,760
想一想你有没有资格谈
17
00:01:02,370 --> 00:01:04,320
你要先懂得规范,才知道
18
00:01:04,330 --> 00:01:08,020
什么尺度下谈不规范
19
00:01:11,290 --> 00:01:13,660
因为你这个是在很多限制条件下
20
00:01:13,670 --> 00:01:15,010
才有资格谈这个
21
00:01:15,290 --> 00:01:16,900
你连限制条件都不懂
22
00:01:17,610 --> 00:01:23,090
就直接谈这个,往往是遮羞布了
23
00:01:26,650 --> 00:01:27,920
范式有这么几个
24
00:01:27,930 --> 00:01:30,840
我们一会还会再一个个详细讨论
25
00:01:31,900 --> 00:01:34,330
书上,书非常多
26
00:01:34,340 --> 00:01:36,450
教材是大把的标准教材
27
00:01:36,660 --> 00:01:38,940
包括学校的教材
28
00:01:39,270 --> 00:01:40,780
包括软考的
29
00:01:41,570 --> 00:01:43,200
也出了很多题
30
00:01:43,210 --> 00:01:44,120
各种各样的题
31
00:01:46,460 --> 00:01:49,600
第一范式,1NF,原子属性
32
00:01:50,530 --> 00:01:51,690
不能够有多个
33
00:01:52,500 --> 00:01:54,170
还有内部复杂结构
34
00:01:54,540 --> 00:02:01,230
2NF,非主属性对候选键的部分依赖
35
00:02:01,480 --> 00:02:03,120
第三个,传递依赖
36
00:02:03,130 --> 00:02:06,100
就是A函数决定B
37
00:02:06,110 --> 00:02:08,760
B又决定C,这个不行
38
00:02:10,870 --> 00:02:13,740
下一个就是BC范式
39
00:02:13,750 --> 00:02:15,420
就是巴斯-科德范式
40
00:02:16,210 --> 00:02:17,770
消除主属性的
41
00:02:19,080 --> 00:02:20,360
部分依赖
42
00:02:20,370 --> 00:02:28,190
主属性对候选键的部分依赖
43
00:02:30,690 --> 00:02:31,530
到这里就可以了
44
00:02:31,660 --> 00:02:37,950
下面第四范式第五范式都可以不用管了
45
00:02:40,010 --> 00:02:42,900
我们一般来说,到BC范式这个
46
00:02:42,910 --> 00:02:45,660
就觉得可以了
47
00:02:49,070 --> 00:02:53,800
那么讨论范式,讲授知识的时候
48
00:02:54,370 --> 00:02:59,580
现在很多教科书这些例子都显得比较幼稚
49
00:03:00,070 --> 00:03:03,060
举的例子好像那个人(学生)特别傻一样
50
00:03:03,070 --> 00:03:06,850
怎么会,往往我们就算再傻的人
51
00:03:06,860 --> 00:03:10,260
他一开始建模,不会幼稚到那个地步了
52
00:03:10,270 --> 00:03:12,250
所以我们后面举的例子
53
00:03:12,260 --> 00:03:13,930
不要举太幼稚的
54
00:03:15,630 --> 00:03:16,950
因为我们很多教科书
55
00:03:16,960 --> 00:03:20,540
都是拿以前的
56
00:03:20,550 --> 00:03:21,700
历史这样传承下来的
57
00:03:21,910 --> 00:03:23,500
以前可能那个人(学生)很幼稚
58
00:03:23,630 --> 00:03:27,060
连基本的范式都没有
59
00:03:27,070 --> 00:03:28,560
但现在来说的话
60
00:03:28,570 --> 00:03:30,310
就算一个再差的人
61
00:03:30,320 --> 00:03:33,040
他也得有这样一个概念
62
00:03:33,330 --> 00:03:36,090
也会把一些基本概念会分开
63
00:03:36,100 --> 00:03:39,480
但是问题在什么地方
64
00:03:39,490 --> 00:03:41,920
它在某些比较含糊的地方
65
00:03:41,930 --> 00:03:45,250
但我们没有意识到,会犯范式的错误
66
00:03:47,030 --> 00:03:49,830
这种很明显看出来的
67
00:03:49,840 --> 00:03:51,750
还明目张胆的犯
68
00:03:52,420 --> 00:03:55,940
在现实中并不是很常见的
1
00:00:02,090 --> 00:00:05,200
第一范式,就是属性不能再分解
2
00:00:05,210 --> 00:00:06,920
表中不能再有表
3
00:00:08,160 --> 00:00:10,950
包括多值的属性
4
00:00:12,940 --> 00:00:18,550
把多个,然后逗号连在一起
5
00:00:20,130 --> 00:00:22,280
第二个就是复杂的属性
6
00:00:24,290 --> 00:00:26,760
属性里面
7
00:00:26,770 --> 00:00:29,820
还可以再分解成
8
00:00:29,830 --> 00:00:32,500
另外的更细的一些概念
9
00:00:32,710 --> 00:00:35,130
比如说,像右边这个图
1
00:00:00,410 --> 00:00:02,300
右边那个图
2
00:00:02,700 --> 00:00:03,900
员工ID
3
00:00:05,570 --> 00:00:08,460
你看我们这里都主动加上ID了
4
00:00:08,790 --> 00:00:10,840
就刚才讲的,不那么幼稚
5
00:00:11,460 --> 00:00:14,800
很多教科书,姓名
6
00:00:15,910 --> 00:00:18,490
姓名做主键,肯定不对(正常)的
7
00:00:18,750 --> 00:00:25,180
我们想想,现在来说,再怎么幼稚
8
00:00:25,190 --> 00:00:27,220
他也不会拿一个姓名做主键了
9
00:00:28,380 --> 00:00:30,610
员工ID或工号什么之类的
10
00:00:30,780 --> 00:00:33,870
联系方式
11
00:00:37,180 --> 00:00:39,170
你看,多值违反了
12
00:00:39,180 --> 00:00:42,450
第二个,在结构上也违反了,这里面有电话
13
00:00:42,740 --> 00:00:44,010
显然是一个联系方式类型
14
00:00:44,580 --> 00:00:47,240
这个才是具体的内容吧
15
00:00:47,970 --> 00:00:56,040
微信 QQ,怎样让它不违反,就把它拆开了
16
00:00:56,050 --> 00:00:56,440
17
00:00:56,450 --> 00:01:01,560
拆开,比如说,一种是分成三条记录
18
00:01:02,820 --> 00:01:07,750
分成三行,联系方式类型、联系方式,这样分开
19
00:01:08,870 --> 00:01:13,870
这个就满足第一范式了
20
00:01:14,080 --> 00:01:19,970
1NF,显然这里面一看就有很多冗余
21
00:01:20,060 --> 00:01:20,250
22
00:01:20,260 --> 00:01:24,320
1 潘加宇 1 潘加宇 1 潘加宇
23
00:01:24,530 --> 00:01:26,320
第二个,员工ID
24
00:01:28,820 --> 00:01:31,370
1 潘加宇,重复的
25
00:01:32,030 --> 00:01:35,180
重复了很多遍
26
00:01:35,190 --> 00:01:39,830
当然这里面你要选主键的话
27
00:01:39,840 --> 00:01:44,120
也可以选这个和这个作为复合主键
28
00:01:44,290 --> 00:01:45,920
才能够决定联系方式
29
00:01:48,840 --> 00:01:52,050
这是第一范式
30
00:01:54,090 --> 00:01:56,480
这个还好理解
31
00:01:57,890 --> 00:01:59,720
一看这个就不太对
32
00:02:00,730 --> 00:02:02,080
我们平时也不会这样干
33
00:02:03,140 --> 00:02:05,690
我们看,下面这个可能更微妙一点
34
00:02:07,910 --> 00:02:09,190
假设我们不这样干
35
00:02:09,200 --> 00:02:15,210
比如说,员工ID,1,潘加宇,这个一样的
36
00:02:15,220 --> 00:02:16,970
我们来个电话1电话2
37
00:02:17,720 --> 00:02:20,080
电话3,我多留几个字段
38
00:02:20,090 --> 00:02:21,760
电话3电话4,1个人
39
00:02:21,770 --> 00:02:23,080
5个电话,应该够了
40
00:02:23,640 --> 00:02:24,590
电话5
41
00:02:25,080 --> 00:02:25,840
这可以吗
42
00:02:27,820 --> 00:02:30,930
表面上没有违反第一范式
43
00:02:32,090 --> 00:02:32,930
但是
44
00:02:34,770 --> 00:02:39,250
实际上它也是把相同的概念
45
00:02:41,010 --> 00:02:42,540
相同的概念
46
00:02:43,460 --> 00:02:45,500
做成了什么
47
00:02:45,750 --> 00:02:46,670
不同的属性
48
00:02:47,320 --> 00:02:49,170
还是把同样的概念
49
00:02:49,180 --> 00:02:50,370
在属性那里
50
00:02:50,380 --> 00:02:51,960
重复了很多遍
51
00:02:54,150 --> 00:02:58,190
本质上还是,如果
52
00:02:58,200 --> 00:03:00,310
你有领域概念的加成的话
53
00:03:01,610 --> 00:03:02,840
本质上可以看到
54
00:03:02,850 --> 00:03:06,090
它背后本质
55
00:03:06,100 --> 00:03:07,610
还是违反第一范式的
56
00:03:08,660 --> 00:03:10,240
但如果说你没有领域概念加成
57
00:03:10,250 --> 00:03:12,120
你根本不知道这个字段是什么
58
00:03:14,730 --> 00:03:15,850
根本不知道是什么
59
00:03:17,180 --> 00:03:18,650
比如说,这个不是电话
60
00:03:19,800 --> 00:03:20,210
61
00:03:20,770 --> 00:03:22,830
假设这里不是写的电话
62
00:03:25,670 --> 00:03:31,990
而且写x,这个写y,这个没法判断了
63
00:03:32,000 --> 00:03:33,790
你不知道xy是啥
64
00:03:34,450 --> 00:03:35,890
你怎么知道违反第一范式
65
00:03:35,900 --> 00:03:37,570
没准x是身份证号呢
66
00:03:38,210 --> 00:03:41,340
万一是别的什么东西
67
00:03:43,460 --> 00:03:48,640
所以必须得有后面领域知识的加成才可以
68
00:03:48,650 --> 00:03:49,880
否则你很难判断的
69
00:03:55,590 --> 00:04:00,260
这个的话,明显看出来是重复的
70
00:04:00,470 --> 00:04:01,500
像这种可以吗
71
00:04:02,130 --> 00:04:03,330
我不电话1电话2
72
00:04:03,340 --> 00:04:06,410
因为电话1电话2都是电话的概念
73
00:04:06,660 --> 00:04:09,810
我们来私人电话、办公电话
74
00:04:10,160 --> 00:04:11,950
这个写得更清楚了
75
00:04:11,960 --> 00:04:12,550
这可以吗
76
00:04:14,550 --> 00:04:16,980
这个的话相当于标出了什么
77
00:04:18,500 --> 00:04:20,200
背后实际上都是电话
78
00:04:21,140 --> 00:04:24,290
但是标出不同角色的名称
79
00:04:24,300 --> 00:04:25,170
相当于