mysql神功 1.2 表的构成
从上一篇文章中,我们了解到什么是关系数据库,我们要讲的MySQL就是关系数据库。
https://www.bilibili.com/read/cv17294961
关系数据库定义:是由多张能互相联接的二维行列表格组成的数据库。
如果这些表都是独立存在,没有相互联接的意义,那就谈不上数据库了,最多就是个工作簿,关于能互相联接这个问题,我们今后就默认,不再重复去提了。
# 为什么不先讲软件的安装?
答:会讲的!不要着急,现在还没到那一步。
# 为什么我不先讲数据库的组成?
答:会讲的!组成与原理都需要你先理解表的结构,好比一个国家可以什么都没有,但是至少要有一个人,一个人都没有的就不能称为国家。讲了一堆齐家治国平天下的大道理,结果一个人都没有,那还有什么意义吗?有人会问:国家不需要土地吗?比如《海贼王》中的空岛就建立在空中,鱼人岛就建立在海底。这些知识可以通过百度百科查询到。如图1-13


如图1-14,上一篇文章中我们提到了每个绿圈都是一张表,他们之间可以根据自己的目的去建立联系。例如,我们想得到「说别人发音不正确」同时「说不讲原理坑人误导人」的名单。如图1-15

曾经很多人在VBA课程中问我,两张表取共同部分,用循环慢,用数组和字典怎么实现?万一两表的位置变了怎么办?如果你会写SQL语句,一句话搞定,而且SQL语句可以在大多数软件中使用,包括ExcelVBA。
一、什么是二维表
很多人喜欢用高大尚的名词,那我们先解释一下名词,防止你将来在书籍或网上看到名词时"懵圈"。
1、名词解释
<1> 数组:前面我们了解到关系数据库是由多张二维表组成的,你可能还会听到关系数据库是由多个二维数组组成的。
在这里二维数组就是我们说的二维表,在VBA的课程中,我们提到过维度,如图1-16所示:
# 你不用去看VBA课程,我在这里提到VBA,只是告诉你我曾经讲过

<2> 集合:关系数据库是由多张二维表组成的,你也会听到关系数据库是多张二维表的集合。
上学时,老师说同学们自由活动…… 一段时间后,老师吹哨:“集合”! 所有同学聚集到一起。
所以这里的组成与集合是一个意思。
2、二维表的构成
二维表由横向的行与纵向的列组成。每一行被称为一条记录,每一列被称为一个字段,列名又叫字段名。如图1-17

大家知道为什么这里没有提到单元格吗? 关系数据库与Excel不同,它有一特点:以行为单位读写数据。所以,在关系数据库的二维表中,不能使用合并单元格、也不能在一个单元格写多个数据。以下两种情况(图1-18)都是错误的,如果你想这样做怎么办?回到Excel中,你可以随心所欲。
# 如果你强行在一个格子里写双行,看看可以,但是将来操作的时候会遇到各种麻烦

二、什么是数据类型
我们都知道,教师和商人是不一样,教师队伍中是不能让商人混入的,因为教师是先育人再育才,正牌教师看到网络上优秀且免费的学习资源,会推荐给同学们。但是,商人只会在免费资源下冒充学生留言,贬低免费优质的学习资源,潜移默化的推荐根本不知道质量的收费课程。图1-19

我们看病要去正规医院,千万拿自己和家人的生命安全开玩笑,杜绝那些没有从医资格但是擅自从医的黑诊所。图1-20

很明显,不是一回事,就不能放在一起。那我问你,姓名和性别是一回事吗?图1-21

你肯定会说,谁会写成这个样子,这明显是写错了,那下面的就是你“故意”了。图1-22

你知道很多单词的发音,你知道程序员规则用英文变量,难道你不知道阿拉伯数字和汉字是不一样的吗?阿拉伯数字可以进行四则运算,汉字不可以。规范二维表的数据类型是最重要的工作。在后面的课程中,我们会重点讲解这方面的知识。你如果做不到数据类型的规范 等同于 醉酒驾车,最终害人害己。
# 在数据库中,数据类型会约束你的行为,当一列(字段)被定义成数值类型后,你就不能再写入文本型数据了。
三、主键与外键
手拉手,是一方是主动,另一方是被动。双方都主动那叫握手。图1-23

在数据库中,一对多关系叫拉手,一对一关系叫握手。
多对多关系常用方法是一个小朋友主动拉手两个小朋友变成两个一对多关系(或者反过来,两个小朋友主动拉一个小朋友),当然方法有很多种。图1-24

什么是一?什么是多?一会儿我们就知道了。
主动去拉对方手的叫主键,被动被对方拉手的叫外键。
好比,我们有花名册和成绩表这两张表,想得到一张目标表。图1-25

花名册和成绩表是没有关系的,要拉手才可以建立关系。

从图1-26,我们看到了什么?对!DAX中的扩展表,DAX是基于SQL思维研发的,如果SQL是马里奥赛车,那么DAX可以称为跑跑卡丁车。
1、主键:是表中的唯一标识 , 特点:不为空、不重复、不易发生改变。图1-27
学号不易发生改变,且不为空不重复,所以学号可以做主键。但是姓名、科目、成绩不行。很多人在VBA课程中问我问题,如果同名怎么办?学号、商品编码、身份证号、护照号..... 了解一下呗。如果你是学校、单位,肯定不牵扯这个问题,但是有一种特殊情况,就是"随份子",你去参加婚礼,张三1000元,李四500元,王五2000元,没有登记身份证号的。我的建议是,男方女方分两个账簿登记,遇到同名,能知道是谁的亲戚朋友。再复杂点,你就留手机号码吧。

有些小伙伴会问,如果学号有重复,那怎么设置主键?图1-28

# 主键并不是非要不可,可以从业务需求和查询效率上来权衡。后面我们会详细讲解。
2、外键:
确定好主键后,我们来找外键。外键的字段名可以与主键不一致,但是内容不行。如图1-29,护照号和学号没关系,除非你有一张表,可以展示每个学号对应的护照号,否则我怎么知道哪个学号对应哪个护照号呢?学号和学生编号就可以。

# 有一种特殊情况,外键连接外键,这种多对多关系是本人强烈反对使用的,这件事以后再说。几乎全部有教师资格证的老师在讲数据库时,都会跟学生说,不要直接将两个多端表连在一起。例如:安为霞老师
外键还有一个问题,一般情况下外键中的项目是不能超过主键的品种数(名词:参照完整性)。如图1-30,学生编号A04在学号中没有,将来在你的操作过程中肯定会出现问题,没这个学生哪来的成绩?虽然我们可以处理它,但是,你应该根据自己的业务逻辑创建你的表格,把一切可能发生的错误,扼杀在摇篮中。你就这样想,华为专卖店买不到小米手机,左图就好比华为专卖店的商品,右图就好比销售记录,如果销售记录中出现了自己没有经营的商品,那就是系统乱套了。当然,这需要与你的业务逻辑相关联,我再举个例子,假设左表为刑满释放人员名单,右表是刚刚抓获的嫌疑人,不可能这次抓的所有嫌疑人都是刑满释放人员。

# 关于主键与外键的创建和使用,今后课程中会详细讲解
四、一端(维度表)与多端(事实表)区别
并不是说一端表永远是一端,多端表永远是多端。只是将关系连在一起,才能确定谁是一端谁是多端。图1-31,表1的组织连接表2的组织,表1是一端,表2是多端(表1主键不为空不重复);表2用学号连接表3学号时,表2就变成了一端,表3是多端(表2主键不为空不重复);我们试想一下,表1的性别,如果有另一张性别不重复的表与它相连接,它是不是变成了多端?同理,表3的ID字段也是一个道理。

一端和多端表有如下区别:
1、多端表包含一端表的属性的值。(例如成绩表包含花名册中参加考试人员的成绩,图1-32)
2、多端表包含更少的属性和更多的记录,而一端表包含更少的记录和更多的属性。(仍然可以理解为花名册和学生成绩的关系,图1-32)

你设想一下,学生信息可以包含:学号、姓名、性别、身份证号、籍贯、电话、身高、体重、地址、紧急联系人....................你就想吧,我至少能写出50种以上。如果将这些数据反复的出现在成绩表中,那你的数据库容量会越来越大。图1-33

造成的结果:a. 无限买服务器上的硬盘,同时还要不停的升级服务器其它硬件。 b.因为数据太大,你从自己电脑上访问数据时,会增加大量的时间,甚至你的电脑跑不动。
3、多端表垂直增长,而一端表水平增长。(招生完毕后,学生花名册不会再大量增加人员,增加学生是个例,例如转学,但是学生资料可以随需求增加,比如以前没有统计学生地址。成绩表每次考试都会增加记录,也就是增加行数)
4、多端表包含一个外键,而一端表包含一个主键。(复合主键也就是多主键以后再讲)
5、建议在创建多端表之前先创建一端表。(没有学生哪里来的成绩呢?)
6、如果想化繁为简,尽量遵循更多的一端表和更少的多端表。(这是过来人的忠告,不仅是容量低,多端表越多,你将来拆表的机会就越大,你对业务充分理解还行,可是现在,大多数新人都对自己的业务不理解,你根本就不会拆表,你把多对多关系直接建立以后,就只会飙名词了:内层、外层、隐形、显形、筛选覆盖、数据沿袭、循环依赖.......)
图1-34 一对多关系,扩展表简单明了,多对多现在你能看懂,因为数据简单,当表与表之间关系复杂且数据较多时,出错概率就是大幅提升。

前五点,你现在必需谨记!第六点,我们今后会用事实证明。