现在的位置: 首页 > 综合 > 正文

数据库三范式

2012年04月24日 ⁄ 综合 ⁄ 共 1124字 ⁄ 字号 评论关闭

        第一范式(1NF):数据列的原子性

        ①:所谓的第一范式的原子性是指数据表的列都是一个不可再分的字段。

比如:“地址”一个字段,我们可以在这个字段中填写信息“河北省保定新市区朝阳区1号”,但是这个字段我们还可抽出省份、城市 这样两个字段。可以改成三个字段比如:省份、城市、详细地址。如图:

        

        表1与表2 比较,表2就遵循第一范式的要求,这样对用户使用城市进行分类就非常方便,同时也提高了数据库的性能。

        ②:数据库的列必须保证该字段是该表中唯一的(数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。)。

       
第二范式(2NF):数据表中属性完全依赖于主键[消除部分子函数依赖]

        第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

        比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。

  订单信息表

        

        这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。

        而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

        
        这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

       
第三范式(3NF):属性不依赖于其它非主属性[消除传递依赖]

        满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

抱歉!评论已关闭.