sql 表设计三范式 & 反范式 【vaynexiao】

1,每个字段不可再分,比如:学生表,班级字段,班级还有所属年纪,班主任,班号等多个属性,时刻分割的,赢新交一个班级表,给学生信息增加一个字段:班级code,用来关联班级;
2,满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
3,数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:员工编号-员工部门-部门名称 属性之间含有这样的关系,是不符合第三范式的;
举例:比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号–> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,院校id)–(院校id,院校名称,院校地址,院校电话)
其实核心就是为了让表所存储的数据不要出现冗余,2NF为了不出现冗余行,3NF为了不出现冗余列
1,横向切割:比如sunline的日报表数据很多,可以将2018年之前的存一张表中,之后日期的存另一张表中,保证单表数据量不会过大。
2,纵向切割:sunline人员基本信息表pcmc_user如果存用户的毕业院校、身高等等很多不是特别重要的字段,表会特别沉重,所以相对而言不太重要的字段放在另一张表hr_user_base_info中。
3,增加冗余列:sunline日报表存project_id,每次查询要关联项目表,来获取project_name会速度很慢,因为日报表本身数据量巨大,所以日报表将project_id和project_name同时存起来,就不用每次查询时候去left join了,增加速度,而且project_name可能会变化,这样直接存在日报表中还能准确记录当天项目的名称。
4,增加附加列:sunline考勤打卡表,记录员工每日签到和签退时间,使用的时候需要sql查初迟到和早退时间,每次去计算效率不高,因此可以增加late_time和early_time,查询时候就不需要计算,可提高速度。

发布了75 篇原创文章 · 获赞 106 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/vayne_xiao/article/details/105321032