数据库范式

来源:互联网 发布:华为软件测试招聘 编辑:程序博客网 时间:2024/06/06 11:45

1.基本概念

实体:现实世界中客观存在并可以被区别的事物

属性:实体所具有的某一特性。

元组:表中的一行就是一个元组。

 码:表中可以唯一确定一个元组的某个属性(或者属性组)。如果这样的码有不止一个,那么叫候选码。从候选码中挑一个出来作为标识,它就叫主码。

主码标识一个元组的属性,实体表中通常称为主键。

候选码: 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则称该属性组为(超级码)候选码

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性或属性组,它不是码,是别的表的码,这个属性就是外码。

2.数据库范式

第一范式(1NF

如果一个关系模型R的所有属性都是不可分的基本数据项,则R∈1NF

第一范式是指数据库表的每一列都是不可分割的基本数据项,即实体中的某个属性不能有多个值或者不能有重复的属性即列不能够再分成其他几列。

如联系人表[编号,姓名,电话] 一个联系人有手机和座机,那么这种表结构设计就没有达到1NF。要符合1NF需要把列(电话)拆分,即:联系人[编号,姓名,手机座机]

第二范式(2NF

若关系模式R1NF,并且每一个非主键属性都完全依赖于R的主码,则R∈2NF。就是在满足1NF的基础上,属性完全依赖于主键,而不能只依赖于主键的一部分。如果一个数据表的主键只有一个字段的话,它就一定符合第二范式。

订单明细表[订单号产品号产品价格产品名称,数量] 如果在一个订单中可以订购多种产品,那么主键[订单号产品号]因此[数量]完全依赖于主键[订单号产品号],而产品价格产品名称只依赖于产品号。所以订单明细表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。 

第三范式(3NF

关系模型R<UF>中若不存在这样的码X、属性组Y及非主属性ZZ (强制依赖)Y),使得X→YY→Z,成立,Y→X不成立,则称R<UF> ∈ 3NF。若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。就是在满足2NF的基础上,每个非关键字列都独立于其他非关键字列,并依赖于关键字即不能存在:非主键列 A 依赖于非主键列 B,非主键列B依赖于主键的情况。

如部门信息表[部门编号部门名称部门简介];那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表则根据第三范式构建它,否则就会有大量的数据冗余。

巴斯-科德范式(BCNF

在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合巴斯-科德范式简单的说,就是在满足3NF的基础上,主属性不依赖于主属性。一般关系型数据库设计中,达到BCNF就可以了。

如仓库管理表[仓库编号,物品编号,管理员编号,数量];一个管理员只在一个仓库工作,一个仓库可以存储多种物品。则存在

[仓库编号,物品编号][管理员编号,数量]

[管理员编号,物品编号][仓库编号,数量]

因此,[仓库编号,物品编号][管理员编号,物品编号]都是候选关键字。表中唯一非关键字段为数量,符合第三范式。但是存在

[仓库编号编号][管理员编号]

[管理员编号][仓库编号]

所以不符合巴斯-科德范式

第四范式(4NF

设关系RXYZ),其中XYZ是成对的、不相交属性的集合。若存在非平凡多值依赖,则意味着对R中的每个属性Ai(i=1,2,...,n)存在有函数依赖 XAiX必包含键)。那么R4NF换句话说,当关系R的属性集合X是非平凡多值依赖的域,它就包含关系R的键这个定义和BCNF定义唯一的不同点是后者研究非平凡多值依赖的域。若关系属于4NF,则它必属于BCNF

 第四范式的意思是当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值。如联系人表[联系人编号,手机座机] ;满足BCNF。但在一些情况下,比如一些联系人有两个手机号两个座机,那么存在

[id1139xxxxxxxx000-0000001]

[id1135xxxxxxxx000-0000002]

由于手机和座机是相互独立的,而联系方式存在多值,这时就违反第四范式。因此需要设计一个新表:联系方式[联系人编号,号码类型,电话号码]

第四范式的应用比较少,只有在某些特殊情况下要考虑将表规范到第四范式。所以在实际应用中,一般不要求表满足第四范式。

范式(5NF

第五范式是指关系模式R依赖均由R候选码所隐含。所谓R中的每一个连接依赖均由R的候选码所隐含是指在连接时,所连接的属性均为候选码。第五范式将表分割成尽可能小的块,为了排除在表中所有的冗余。

如联系人表[联系人编号,手机座机] ;并且联系方式存在多值,因此可以将表分解为

手机号码表[联系人编号,手机号码]

座机号码表[联系人编号,座机号码]

第五范式的应用非常少,在某些特殊情况下会有意义

原创粉丝点击