一、规范性
1、第一范式1NF(属性的原子性)
如:
学生表:学号、姓名、性别、出生年月日
用户表:id、姓名、性别、地址
如果认为最后一列出生年月日还可以再分成(年,月,日),它就不是一范式了;
如果认为最后一列地址还可以再分成(省,市,县),它就不是一范式了。
2、第二范式2NF(字段依赖主键的关系)
表:学号、课程号、姓名、学分
这个表明显写了两个事务:学生信息和课程信息
正确做法:
学生:Student(学号, 姓名);
课程:Course(课程号, 学分);
选课关系:StudentCourse(学号, 课程号, 成绩)
成绩依赖于学号和课程号,满足第二范式。如果再加入姓名字段就不对了,因为姓名只依赖学号
3、第三范式3NF(字段的冗余性)
要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖
表: 学号, 姓名, 年龄, 学院名称, 学院电话
因为存在依赖传递: (学号) → (学生)→(所在学院) → (学院电话) 。
正确做法:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 电话)。
二、性能问题
有规范,但是也会存在一些性能的问题。熊掌与鱼,不可兼得。考虑到成本、用户体验,性能比规范更重要。
阿里数据库有个规范:
关联查询表不得超过三张
1、故意增加一些冗余数据(从多表查询变为单表查询)
2、故意增加计算列(从大数据量降低为小数据量的查询)
3、增加索引,需要创建索引树,这里就比较耗内存,用空间换时间