数据库设计的三大范式
2014-07-03 10:08
253 查看
数据库的三大范式是为了减少数据库数据的冗余,让数据库设计更合理话,而且三大范式是递增式的,只有满足第一范式的情况下,才能考虑第二范式,在满足第三范式的前提下,才能考虑第三范式。但是有时候为了提高数据的查询效率,很多数据库设计只满足了第二范式。
实际上还有第四,第五范式等。
现在就让我们来看看三大范式。
第一范式:
每列数据都是不可分割的最小数据(原子性)
像上面这表就没有满足第一范式 应该做如下修改
第二范式:
必须满足第一范式,每张表只描述一件事情(每个表只能依赖一个主键)
是不是感觉看了有点迷糊,没关系,我们看看例子
这张表是错误的,产品单价是依赖于产品编号的,订购日期的话是依赖于订单编号的,这就不满足了依赖一个主键的含义。
所以应该改成
and
两张分出来的表
第三范式:
第三范式又是满足第二范式的基础上,要求是一个表中不能包含其他列中定义的非主键列
比如说
这表就错了,顾客姓名肯定是顾客表里面的非主键列
当然也为了提高查询效率也可以忽略第三范式,经常查询这张表,又要做到顾客姓名的情况下,
就可以忽略第三范式。毕竟如果满足第三范式,你每次查询顾客姓名还得关联顾客表。
实际上还有第四,第五范式等。
现在就让我们来看看三大范式。
第一范式:
每列数据都是不可分割的最小数据(原子性)
id | address |
1 | 中国上海 |
2 | 中国深圳 |
id | country | city |
1 | 中国 | 上海 |
2 | 中国 | 深圳 |
必须满足第一范式,每张表只描述一件事情(每个表只能依赖一个主键)
是不是感觉看了有点迷糊,没关系,我们看看例子
订单编号 | 1 |
产品编号 | A1 |
订购日期 | 2004/4/1 |
产品单价 | 29¥ |
所以应该改成
订单编号 | 1 |
订购日期 | 2004/4/1 |
产品编号 | A1 |
产品单价 | 29¥ |
第三范式:
第三范式又是满足第二范式的基础上,要求是一个表中不能包含其他列中定义的非主键列
比如说
订单编号 | 1 |
订购日期 | 2004/4/1 |
顾客id | 3 |
顾客姓名 | 张三 |
当然也为了提高查询效率也可以忽略第三范式,经常查询这张表,又要做到顾客姓名的情况下,
就可以忽略第三范式。毕竟如果满足第三范式,你每次查询顾客姓名还得关联顾客表。