1.第一范式:列不可分->表的每一列都是最小的原子,不可以被再分;
例:
该表中,系这个属性就可以被分割,并不符合原子性的特征,因此不符合"第一范式".
注意:标准的数据库建模必须在符合第一范式的前提下,符合第二范式,再符合第三范式.
解决方法:
对"系"列进行改造,将"系名"和"系主任"拆分成两列.
2.第二范式:消除部分依赖->非主键字段完全依赖于主键,而不是主键的一部分.
例:
表中主键为"学号+课程号",但是"姓名","系名","系主任"只依赖于"学号",不依赖于"课程名",因此表中字段存在部分依赖,不符合第二范式.
解决方法:
将原表拆分成"学生表"和"选课表"两张表.学生表记录"系名","系主任"和学生的对照信息,"选课表"记录"课程","分数"和学生的对照信息.
3.第三范式:消除传递依赖->非主键字段完全依赖于主键,而不依赖于非主键.
例:
在上述的"学生表"中,主键为"学号",而表中"系主任"却依赖于"系名"字段,"系名"字段依赖于主键"学号".因此在该表中存在传递依赖,不符合第三范式.
解决方法:
将"学生表"拆分成"学生表"和"系表"两张表,通过外键"系名"关联.
补充:在数仓的构建和建模中,由于指标分析的需要和对查询性能的要求,较多应用场景下会采取星型模型,减少事实表和维表的关联次数以保证查询效率.因此数仓的构建往往遵循"反范式"原则.