数据库规范化
关系数据库包括第一范式(1NF )、第二范式(2NF )、第三范式(3NF )、总线代码范式(BCNF )、第四范式(4NF )、第五范式(5NF )
第一范式(1NF ) )。
是对属性的原子性要求,要求属性具有原子性,不可再分解
像这个user表不符合第一范式。 因为region列没有原子性,可以分割为省、市、具体地址
正确的做法
第二范式(2NF ) )。
2NF是记录的唯一性,要求记录不存在唯一标识,即实体的唯一性,即部分依赖;
该表明显显示了学生信息、课程信息这两件事;
因为非主键字段必须依赖主键,这里单位依赖于上课号码,名字依赖于学校号码,所以不符合二归一化。
这样做可能会有问题。 数据冗馀为:每个记录包含相同的信息。
异常删除:删除所有学生成绩后,删除了所有课程信息;
插入异常:学生没有选课,无法记录在数据库中
更新异常:调整课程学分,调整所有行。
正确做法:学生: Student (学号,姓名);
课程: Course (课程编号、单位);
选择关系: StudentCourse (学校号码、课程号码、成绩)。
第三范式(3NF ) )。
3NF是对于字段的冗馀度,要求任何字段不能从其他字段派生,要求字段没有冗馀度,即不存在传输依赖
因为: (学号()姓名) ) (所在学校) )学校电话)。
可能有问题:数据冗余:有重复值;
更新异常:存在重复的冗馀信息,修改时需要同时修改多条记录。 否则,会发生数据不一致。
正确做法:学生:(学号、姓名、年龄、所属学院);
学院:(学院,电话)。 面试官:回答得真好。 那么,平时设计的时候遵守三种范式吗? 如果不遵守的话什么时候突破范式?
没有规则就不会成为周围的人。 一般来说,我会遵守三大范式。
如果没有冗长的数据库设计,就可以遵守所有三种模式。 但是,没有冗余的数据库并不一定是最好的数据库,为了提高运用效率,有时必须降低规范化标准,妥善保存冗余数据。
具体来说,在概念数据模型设计中,遵守第三范式,降低范式标准的工作在物理数据模型设计中进行考虑。 降低范式是增加字段,允许冗余,达到在空间上改变时间的目的。 面试官:好的,那我最后说一句,遵守和不遵守范式转换设计,也就是说反范式转换设计的优缺点是什么?
为什么数据库有范式
规范化设计的优点是可以尽量减少数据冗余,数据表更新快体积小
规范化更新操作比反向规范化更快
规范化表通常小于逆规范化
缺点是必须将多个表与查询相关联,从而导致性能降低
索引优化更难
Mysql语法
金基底层的实现原理
mysql使用Nested-Loop Join实现join算法。 有三种类型:
简单嵌套链接
上面的left join依次从驱动表table A中检索每个值,从上到下依次到非驱动表table B,返回匹配的值,最后合并所有返回值,以找到table A left join table B的结果和你的认知一样吗? 使用这种方法,如果table A为10行,table B为10行,则总共需要执行10 x 10=100次查询。
Index Nested-Loop Join
上面的left join依次从驱动表table A中检索各个值,然后前往非驱动表table B的索引进行索引查询。 对于次索引,它还与表查询有关。
Block Nested-Loop Join
如果选项卡列中没有索引,则在搜索时会首先将表的选项卡a中的数据读取到join buffer中,以便可以从join buffer中批量遍历选项卡b进行搜索。
(这样做的好处是减少tableB表的读取。 join buffer在内存中,所以读取很快,但表在磁盘上。 这就是缓存buffer的意思)
Block Nested-Loops Join算法首先将每次读取到Outer Loop表(外部表)中的10条记录(确切地说是需要联接10行的列)放入Join Buffer中,然后返回Inner Loop表结果,Inner Loop表的扫描减少到了1/10。 对于没有索引的表,Block Nested-Loops Join算法可以大大提高联接的速度。
inner join取交叉outer join是取全集
内部连接select * from A INNER JOIN B ON条件
返回两个集合相交的部分
左连接select * from A left outer join B on条件
左表显示所有元素,右表显示与条件匹配和不匹配的部分[空]
右连接select * from A right outer join B on条件
右表显示全部,左表显示与提交的部分一致且不符合其他条件的部分[显示为空]
数据库delete与TRUNCATE的区别delete :删除表的内容,表的结构存在,索引定义仍然存在,可以通过回滚进行恢复
drop :删除表的内容和结构,释放空间,在没有备份表之前小心使用;
truncate :删除表的内容,表的结构存在,索引的定义仍然存在。 相当于在drop表之后建立了相同定义的表(包括相关约束和索引),在不备份表之前必须谨慎使用。 速度快
梳理来源面试频次——五问三大范式——掘金juejin.im