00:00
好,那前面的话呢,咱们讲了这个范式包括反范式以及呢叫ER模型,然后接下来的话呢,我们看一看叫数据表的一个设计原则啊,这个设计原则呢,就提到了非常的提的非常的简单了啊,就是最核心的啊,我们提到了叫三少一多好,那么三少的第一少呢,叫数据表的个数啊,越少越好。那数据表的个数越少的话呢,那我们刻画表跟表之间关系的话呢,这个relationship是不是也就会更简洁一些,那这样的话呢,我们整个这个数据库的这个设计的话呢,就方便我们去理解了,诶同时的话呢,你表要少的话呢,我们进行关联查询的时候呢,照你的表少了是不是性能也会更高一些,对吧。哎,这是我们的第一个点,然后第二点的话呢,就是数据表中那个字段的个数呢,越少越好,哎,字段个数越多啊,字段越多,那我们这时候啊,可能发生冗余的可能性呢,就会越大一些,你像我们讲这个实战的时候呢,我们就一个表字段呢,有很多冗余呢,度是不是就很高,所以我们才把它改造成是不是满足一范式二范式三范式对吧?这样一个过程。
01:00
好,那么当然这时候呢,我们还要注意这个字段个数少啊,它是一个相对的概念,那因为我们前面呢,是不是还讲了叫反范式化对吧,我们为了呢,呃,这个查询的性能更高一些呢,我们还适当的增加了这个冗余,所以呢,我们需要呢,在这个数据的冗余和检索的效率方面呢,达到一个平衡啊就可以了。啊,同时的话呢,你看我们这个啊,说数据表的个数越越少越好,它跟我们这个字段个数越少越好呢,实际上呢,也会存在一定的矛盾,像我们这个,呃,讲这个案例的时候呢,这个案例呢,就只有一个表,按说挺好,但是你这个表中的字段是不是就很多啊,你要拆成好几个表的话呢,表多了,但是我们这个字段呢就少了,所以这呢,其实也得存在一个平衡。OK,就是本质上来讲,这两呢其实也有点矛盾是吧?OK,然后第三的话呢,就是数据表中的联合主键的字段呢,越少越好啊,这提到一个叫联合主键,那如果说我们这个主键里边呢,只有一个字段当然好了,但是你要是没有办法确定唯一的一条记录的话呢,就需要用联合主键,那这时候呢,这个字段呢,越少越好啊,为什么呢?诶大家想想我们这个主键的话呢,对应的是就主件约束,那对应底层呢,就是这个B加束了,对吧?那么这个B加数呢,不管是我们的。
02:06
这个聚素索引也好,还是我们的非聚素索引,或者叫二级索引也好,呃,在我们的这个,呃,非叶子节点和我们的叶子节点上,是不是都会去存储我们这个主键的这个值啊。对吧,诶都会存我们这个主键值,那你想想你要这个主件呢,联合的诶字段还很多,那是不是占用我们这个啊,具体你这个数据项或者叫目录项呢,是不是占用的空间就会更大一些,那使得我们整个这个数据页里边可存放的这个呃数据项呢,是不是就会更少一些,对吧?而且呢,我们在加载的时候呢,是不是也会更浪费这个时间呀?诶这个呢,我们要注意一下。好,这是我们说的这个叫三少啊,那么一多是什么呢?说使用主键和外键啊,越多越好啊,当然这个主键的话呢,我们一个表中呢,诶就是一定会有一个,而且呢,只会有一个对吧?诶这里边主要想强调就是这个外界啊,诶同学说老师不是刚才提到说不要去使用这个外界嘛,诶注意这里边的外界呢,我们把它呢,诶这个再扩展一点哈,不是真正说的这个外界约束了,而是说呢,就描述这种外界关系的这样一种关系。
03:04
啊,我们说一对一的关系,一对多的关系,我们可以在业务逻辑上呢去实现,当然呢,就是你只要呢,实现这种外界的,呃,这个这个关系了,我们就算是啊这样的一个行为啊哎,让这种关系呢越多越好,哎这种关系越多呢,就意味着我们这些实体之间的冗余度呢,就会越低,那他们之间的利用度呢就会越高啊这个大家注意一下。啊,这呢就是我们整个的总结为呢,叫三少一多啊,在彼此之间呢,有的时候呢,会存在一些呃矛盾点,或者说呢,我们也要达到一个平衡是吧?哎,这样大家去注意一下啊就可以了,行,所以说呢,整个这个规则呢,他也不是绝对的啊OK。好,这个说完之后的话呢,我们再来谈一谈比较务实的一些,在我们具体编写这些circle口的时候呢,一些注意点啊,就是数据库对象的一个编写建议,这里边呢,我罗列一些具体的一些规则啊,这块呢,我们有一些呢,前面都讲过了啊,快速的咱们过一下,快速的过一下,那么关于库啊这块呢,就不用多说了,对吧?然后库这块呢,诶大家注意我们呢,要一定要小写,然后呢,不同的单词之间呢,用这个下划线呢去分割啊,能够看到呢,很多的编写的时候还是不规范的,就你要是不用小写,他倒也不报错,但是建议大家还都要小写。
04:14
那这个定义方式的话呢,就是不同的单词之间呢,用这种下划线了,对吧?然后呢,整个这个啊项目系统的一个名字,然后下边呢,是一个子系统的一个名称,OK,然后呢,禁止使用关键字啊,不用多说了,创建库的时候呢,尽量呢大家去指定它的这个字符集啊,Default character set这样啊,你要不指定的话呢,相当于就按照我们默认的这个数据库服务器中的这个字符集呢去设置了。啊,那所有服务器的里边呢,建议呢,也都是U发的OK啊,这都不用多说了,下边呢,对于我们这个程序连接的话呢,账号呢,我们就要遵循这个权限最小的原则啊,就是我们这个用户的话呢,这个能给他的权限小就要小一点啊,你要给大的话呢,他有可能做一些这个超出他范围的事儿,是吧,原则上来讲的话呢,不允许他有这个照的权限啊,你就别让他呢有这个。从山到跑路的这样的一个行为对吧?好,然后呢,下边呢,就是临时的库呢,呃,建议呢是tmp开头,备份库呢,以bak开头啊,OK,然后以这个日期的作为后缀啊,这是一些规范啊,然后关于这个表和列啊,第一个这就不用多说了啊,第二呢也是一样啊,一律呢都是小写,用下划线呢去区分简明之意啊,然后呢,跟这个模块相关的话呢,统一使用一个统一的前缀,比如CM相关的啊,这样的一个统一的前缀,OK。
05:26
然后呢,在创建表的时候呢,建议呢,也是显示的要指定这个字符集。啊,如果呢,我们这个数据库呢,指明了啊,你这块要没指明,这不就按数据库来嘛,对吧,这个前面也都提到过啊。嗯,那要是我们呢,使用这个工具呢,去创建的时候呢,你要导出的时候,你会发现呢,它都会给我们加上诶在每一个表上那个字符集的啊,所以我们自己呢,要是手动的去创建表的时候呢,建议呢,就是你也加上OK,然后呢,表名和列名上的禁止使用关键字啊,这个咱们前面都已经说过了,对吧?哎,其实要倒不是说呢不能用啊,就用上以后呢很麻烦。啊很麻烦啊,就有时候呢,就识别错了,说下边的话呢,就是指定我们这个存储引擎的啊,这个咱们5.5以后呢,是不是都默认是印度DB了,对吧?但是这个默认的存储引擎咱们也能改啊,但是你要自己造表的时候呢,建议呢,你还是指明一下啊,叫印度DB,然后呢,这个建表的时候呢,必须要有这个comment,哎,Comment的话呢,就是我们具体这个字段呢,它表达的是什么意思,像那个备注信息一样啊,前面咱们造表的时候呢,都没加啊,大家后续的话,你也可以考虑都诶加上它。
06:24
OK,这是我们说的这个叫comment,然后下边的话呢,说我们在给这个字段命名的时候呢,这个有的时候呢,会需要必要的用一些这个缩写啊,比如公司的ID啊,你要写ID啊,有点太长了,你就来个靠ID啊就行。对于这个布尔类型的话呢,建议呢,你前面呢,是以意思开头的啊,一看呢就知道它是一个布尔类型的,然后呢,禁止呢,在我们这个数据库当中去存储这个图片啊文件啊,这种大的二进制的这种数据啊,像这种图片啊,文件这种啊,像淘宝的当中呢,是不是有大量的这种图片,甚至一些这个视频,对吧?诶那这时候他会用到这个叫fast DFS啊这样的分布式的一个文件系统啊,我们这呢也是啊,尽量呢你就不要呢,存放在我们现有的这种表结构里边。
07:05
啊,这个呢,要加载的时候呢,速度会非常的慢的啊好,下一个呢,就是见表的时候呢,关于主键的啊,就是一定要有主键,这个都不用多说了啊,那么这个主键的话呢,一般呢,就是in的和begin的这样两种类型,然后呢,对于我们啊,咱们上一章呢,是不是提到过说淘宝的这个组件怎么设计的,对吧?呃,要对于这种核心的这些表呢,我们就自己呢去给他,呃,手动的去创建这个主件,你要这种非核心的表的话呢,那我们就用这个auto呢是可以的。对吧,而且呢,因为它都是正数嘛,加一个叫安三的这样无符号的一个标识啊在好。这个下边里边呢,提到说每一行这个主体这个字段呢,不要设为这个主键啊,它是说什么意思啊,比如说我们这个叫呃,员工表里边叫ID啊,U表里边叫UID啊,这个订单表里边叫ID,像这些的话呢,我们建议呢,就别用他们做这个具体的ID了啊,其实这也相当于是一个业务的字段了,我们呢,就自己再给大家指定一个叫ID,你比如我们下边这个表叫user infer了啊,这个user ID呢,就是用户ID,咱们呢,诶专门呢再提供一个组件。
08:05
啊,因为这样的话呢,它是自增的,它就不会呢,我们在添加数据的时候呢,出现这种页分裂的效果了,对吧。OK。嗯,这呢是我们说这个主见的事儿,然后这个核心的表呢,建议呢,呃,要增加这种创建时间的字段,还有这个最后更新时间的字段,在这个表里边呢,我们去加这样的两个字段,OK,然后这个表中的字段呢,尽量都是用这个nono啊,尽量都用这个nono啊,必要的时候呢,你可以去加上叫default一个值。呃,因为呢,我们要是这个呃允许它为空的话呢,诶大家记不记得我们讲这个行格式行格式的时候呢,是不是提到过这个not值的列表,对吧,是不是还得需要额外的空间呢去存储。对吧,存储我们的闹值,而且呢,我们发现呢,在使用这种聚额函数,聚合函数呢,在计算的时候呢,闹值呢,诶还不确在在内还会有一定的偏差的情况,对吧?诶所以建议呢,我们就都加上这个闹闹的这些约束啊。好,下面呢,就提到我们这个存储的时候,不同表中的啊,你要有这种关联关系的啊,外间关联的这种呢,就是这个列的类型啊和列名啊,尽量的啊,就是列类型是一定要一致的啊,列名了倒没说啊,但是建议呢,你列名呢也可以写成一样的,这样呢你就知道诶天然的就知道他俩呢,就像有一个外界的这种关系一样,对吧。
09:15
啊,这呢,我们前面也讲过,类型要不一样的话呢,是不是就索引失效了啊,然后下面呢,就关于中间表备份表啊,这个跟那个库是一样的道理,下面是一个比较规范的一个造表的语句啊,这个大家关注一下就OK了。这个引擎啊,字符集啊,这个关于表的啊,它的一个描述信息啊,OK。好,这天呢就说到这儿,然后下边的话呢,说在造表的时候呢,我们还可以推荐大家呢,使用这种可视化的工具啊,可视化的工具的话呢,其实呃,我这儿呢,咱们授课的时候用的都是这个circle了,诶circle呢本身是不是也可以啊,我们造个表的话呢,在这你可以创建个表,对吧?诶在这去写啊,OK啊,这是一个维度,然后还可以呢,是不是使用这个na k也是一样的啊,我就不在这块过多的去做这个演示了啊,像现在呢,这个叫DB呢,这个工具呢,用的也挺多。
10:01
啊也挺多啊,就是其实呢,效果呀,各方面展示我觉得还挺不错的啊,这个D行我就不一个去说了啊,那我们用这个可视化工具好处是什么呢?就首先呢,不用我们自己去写了,其次的话呢,我们这个呃在设置的时候呢,关于它的一些约束啊呃等等啊这样的一些结构呢,我们直接呢可以呃通过这个点击页面中这个相应的呃按钮的这个方式呢,我们就可以给他去加上对吧?诶非常那个方便啊像这些。啊,而且的话呢,你创建好的这个表呢,我们还可以呢,是不是把它导出来啊,导成具体我们这个SQL语句啊,而且还是比较规范的一种方式啊比较好,我就不演示了啊好,下面呢,关于这个索引。所以的话呢,这块提到了说诶主渐的话呢,诶这个必须是这个了啊禁止呢,逐渐被更新是吧?啊这个就都对理解成我们这个非核心的这些表啊,我们让他自增了就呃然后呢,关于我们这个呃in DB和MY这个存储引擎啊,他使用的诶注意很同学说诶老师这是不是用的B数啊,不对啊,就是官方里边凡是提到这个写法的,其实就是叫必加数了。
11:02
啊是我们自己呢,给大家叫B加了啊,因为还有一个叫专门叫B数是吧,诶官方呢写这个呢,就是B加数,然后呢,主见啊以什么开头啊,普通索引唯一索引这个咱们前面自己写的时候呢,也都注意到了。这个多单词要构成的时候呢,哎,我们这时候呢,哎,是不是就这样去处理就行啊,中间呢,你可以再加上一个表明是吧,OK。行,然后呢,这个midd的话呢,直接就m midd啊就可以了,就是别整太长啊,就是还要兼顾到这种可读性啊,还有呢,叫兼明之意对吧。然后单个表上这个索引个数呢,不要超过六个啊,前面也说到过,说呢建立索引的时候呢,多考虑建立个联合索引啊,因为联合索引比如说你写个叫ABC,虽然说呢,我们就只有这一个索引,但是呢,你要专门的去使用A呢,去过滤,是不是也能用上这个索引啊,使用AB过滤是不是也能用上对吧?哎,就是这一个索引呢,其实我们哎在可能ABC都用上啊,也可以用,所以三种不同的情况都可以用这一个索引比较好一些啊,维护的索引少的话呢,我们这个你在增删改的时候呢,性能也会稍微的高一点,对吧?把区度比较高的字呢放前面啊,前面都讲过了。
12:05
这个多表照样的,这个搜索语句中啊,被驱动这个表上呢啊要有索引,那咱们前面呢讲这个,呃,索引优化的时候呢,是不是提到过啊这样的方式是吧?被驱动表上有索引呢,它这个tap呢,这个查询方法呢,会更好一些啊就不是all了,就。嗯,然后在建表的时候呢,说保证表之间不存在这种容易索引啊,这个咱们前面也都提到过了,好,下边呢,关于这个circle这个编写上啊起select不要写清,前面也讲了,然后隐算的时候呢,不要这样写,建议呢,你在这个T后边呢,一定要指明你要添加的这个字段,很容易的话呢,这要对不上的话呢,这个就报错了对吧?或者说呢,呃,类型恰好能对得上啊,个数也能对得上,但是呢,有可能你这个字段呢,添加这个值不是你真正要添加的这个字段啊,所以就很麻烦啊,可读性也比较差一些。然后呢,除了这个静代表或者小表以外呢,呃,DL这个语句的话呢,一定要有这个where语句啊,而且呢,这个尽量呢用上这个索引,OK,然后select insert into啊,Values,这不我们也说过这个批量的添加嘛,建议呢不要超过5000个。
13:03
啊,这个当然说我们这个添加比较多的时候呢,上线的是呃,方式呢,上线的速度呢倒是很快,当然呢,会引起我们后边要讲的这个主从复制的这个主从同步的一个延迟问题啊。好,然后呢,这个提到了UN和UN啊,推荐呢,使用UN就不用去重了,对吧?诶你要用UN的话呢,是不是还会产生个离职表,对吧,咱们讲这个plan的时候呢,都提到过,而且呢,这个union的个数呢,尽量控制在五个以内啊五个以内。然后线上这环境呢,多表的照呢,哎,不要超过五个啊,超过五个的话呢,性能还会降低对吧,还是会降低的。啊下边呢,说减少使用这个啊,就是和业务沟通一下,能不排序啊就不要排序了,或者说呢,放到这个程序端那去做,主要原因呢,就是诶这仨是吧,也好也好也好,他们呢,在操作过程当中是比较耗费C资源的,当然了,这里边如果你要是有几个,所以能够使用上的话呢,还能好一些是吧,啊还能好一些,因为相同的这些值呢,它都挨着呢,啊都挨着呢。呃,下边呢,就提到了包含了这三个关键字的这个语句,呃,然后呢,威尔啊,条件过滤出来结果呢,请保持在1000行以内啊,否则呢,色扣呢会比较慢。
14:09
看这也是一个点。然后对单表的多次alter操作呢,必须合并为一次,诶,我们要对这个表al一下,又al一下,这个呢,你一定要给它合并成一次,而且呢,对于超过100万行这个代表呢,进行al时候要经过DBA的一个审核啊,同时呢,你得在业务第一峰期的时候去执行啊,为什么呢?啊,因为我们al表呢,会产生表所啊,这时候会阻塞其他的操作写入啊,这要注意一下。好,下边的话呢,就提到了我们这里边儿关于这个事物的问题啊,是我们下一个小篇章呢,我们会去讲这个事物啊,那事物之间啊,处理的间隔时间呢,中间可以有个sleep,然后呢,事物里边呢,最好呢,这个S不要超过五个啊,因为较长的这个事物呢,会导致我们这个所数据的时间比较久啊,内部缓存啊,连接消耗啊这样的一些问题啊。然后另外的话呢,关于事物里边更新这个语句呢,尽量呢是基于主键或者unique key啊,这个呢,是为了避免我们这个产生这个间信锁的话呢,呃,而且导致我们这个锁的这个范围会扩大啊,性能呢就会下降啊,产生思索这样问题OK,这呢就是我们整个的在编写这个S的这个过程当中啊,一些规范啊,这些规范呢,都是经验之谈,然后大家呢,把这里边这些点的话呢,自己,呃这个不用死记硬背啊,自己听完一遍以后呢,基本上能记这个差不多写的时候呢,要去遵循这样的一些要求啊。
15:28
好,这呢,我们就说到这儿。
我来说两句