1.4 数据规范化
1.4.1 第一范式:确保每列原则性
第一范式:的目标是确保每列的原子性,一个字段表示一个含义
思考如下表是否满足第一范式
思考:地址包含省、市、县、地区是否需要拆分?
答:如果仅仅起地址的作用,不需要统计,可以不拆分;如果有按地区统计的功能需要拆分。
在实际项目中,建议拆分。
1.4.2 第二范式:非键字段必须依赖于键字段
第二范式:在满足第一范式的前提下,要求每个表只描述一件事情
思考:如下表设计是否合理
1.4.3 第三范式:消除传递依赖
第三范式:在满足第二范式的前提下,除了主键以外的其他列消除传递依赖。
思考:如下表设计是否合理?
结论:不满足第三范式,因为语文和数学确定了,总分就确定了
1.4.4 反3NF
范式越高,数据冗余越少,但是效率有时就越地下,为了提高运行效率,可以适当让数据冗余。
学号 | 姓名 | 语文 | 数学 | 总分 |
---|---|---|---|---|
1 | 李白 | 77 | 88 | 165 |
上面的设计不满足第三范式,但是高考分数表就是这样设计的,为什么?
答:高考分数峰值访问量非常大,这时候就是性能更重要。当性能和规范化冲突的时候,我们首选性能。这就是“反三范式”。
小结
1、第一范式约束的所有字段
2、第二范式约束的主键和非主键的关系
3、第三范式约束的非主键之间的关系
4、范式越高,冗余越少,但表业越多。
5、规范化和性能的关系 :性能比规范化更重要
1.4.5 例题
需求
假设某建筑公司要设计一个数据库。公司的业务规 则概括说明如下: 公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等 公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等 公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)
标识实体
1、工程 2、职工 3、工时 4、小时工资率