跳到主要内容

数据规范化[三范式]

Codd博士定义了6个范式来规范化数据库,范式由小到大来约束,范式越高冗余越小,但表的个数也越多。实验证明,三范式是性价比最高的。

三范式

第一范式:确保每列原子性

第一范式确保每个字段不可再分

1536979522448

思考:如下表设计是否合理?

1536979672041

不合理。不满足第一范式,上课时间可以再分

1536979718323

思考:地址包含省、市、县、地区是否需要拆分?

答:如果仅仅起地址的作用,不需要统计,可以不拆分;如果有按地区统计的功能需要拆分。

在实际项目中,建议拆分。

第二范式:非键字段必须依赖于键字段

一个表只能描述一件事

1536980482113

思考:如下表设计是否合理?

1536980574792

三范式:消除传递依赖

在所有的非键字段中,不能有传递依赖

1536981861980

下列设计是否满足第三范式?

1536982061259

不满足,因为语文和数学确定了,总分就确定了。

反三范式

多学一招:上面的设计不满足第三范式,但是高考分数表就是这样设计的,为什么?

答:高考分数峰值访问量非常大,这时候就是性能更重要。当性能和规范化冲突的时候,我们首选性能。这就是“反三范式”。

数据库设计的例题

1、需求

公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等
公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等
公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)

2、工资表

1536982976983

3、将工资表转成数据库表

1536983011535

4、这个表存在的问题

A:新人入职需要虚拟一个项目

B:职务更改,小时工资率可能会忘记更改,造成数据不完整

C:有人离职,删除记录后,工程也没有了

5、规范化表

第一步:这个表满足第一范式

第二步:这个表不是描述了一件事情

1536983332419

第三步:是否满足第三范式

1536983422611

更改如下:

1536983406042