数据规范化[三范式]
Codd博士定义了6个范式来规范化数据库,范式由小到大来约束,范式越高冗余越小,但表的个数也越多。实验证明,三范式是性价比最高的。
三范式
第一范式:确保每列原子性
第一范式确保每个字段不可再分
思考:如下表设计是否合理?
不合理。不满足第一范式,上课时间可以再分
思考:地址包含省、市、县、地区是否需要拆分?
答:如果仅仅起地址的作用,不需要统计,可以不拆分;如果有按地区统计的功能需要拆分。
在实际项目中,建议拆分。
第二范式:非键字段必须依赖于键字段
一个表只能描述一件事
思考:如下表设计是否合理?
三范式:消除传递依赖
在所有的非键字段中,不能有传递依赖
下列设计是否满足第三范式?
不满足,因为语文和数学确定了,总分就确定了。
反三范式
多学一招:上面的设计不满足第三范式,但是高考分数表就是这样设计的,为什么?
答:高考分数峰值访问量非常大,这时候就是性能更重要。当性能和规范化冲突的时候,我们首选性能。这就是“反三范式”。
数据库设计的例题
1、需求
公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等
公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等
公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)
2、工资表
3、将工资表转成数据库表
4、这个表存在的问题
A:新人入职需要虚拟一个项目
B:职务更改,小时工资率可能会忘记更改,造成数据不完整
C:有人离职,删除记录后,工程也没有了
5、规范化表
第一步:这个表满足第一范式
第二步:这个表不是描述了一件事情
第三步:是否满足第三范式
更改如下: