数据库范式详解
- 格式:doc
- 大小:39.00 KB
- 文档页数:8
第一范式(1NF)第一范式,强调属性的原子性约束,要求属性具有原子性,不可再分解。
举个例子,活动表(活动编码,活动名称,活动地址),假设这个场景中,活动地址可以细分为国家、省份、城市、市区、位置,那么就没有达到第一范式。
第二范式(2NF)第二范式,强调记录的唯一性约束,表必须有一个主键,并且没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
举个例子,版本表(版本编码,版本名称,产品编码,产品名称),其中主键是(版本编码,产品编码),这个场景中,数据库设计并不符合第二范式,因为产品名称只依赖于产品编码。
存在部分依赖。
所以,为了使其满足第二范式,可以改造成两个表:版本表(版本编码,产品编码)和产品表(产品编码,产品名称)。
第三范式(3NF)第三范式,强调属性冗余性的约束,即非主键列必须直接依赖于主键。
举个例子,订单表(订单编码,顾客编码,顾客名称),其中主键是(订单编码),这个场景中,顾客编码、顾客名称都完全依赖于主键,因此符合第二范式,但是顾客名称依赖于顾客编码,从而间接依赖于主键,所以不能满足第三范式。
为了使其满足第三范式,可以拆分两个表:订单表(订单编码,顾客编码)和顾客表(顾客编码,顾客名称),拆分后的数据库设计,就可以完全满足第三范式的要求了。
值得注意的是,第二范式的侧重点是非主键列是否完全依赖于主键,还是依赖于主键的一部分。
第三范式的侧重点是非主键列是直接依赖于主键,还是直接依赖于非主键列。
修正的第三范式(BCNF)修正的第三范式,是防止主键的某一列会依赖于主键的其他列。
举个例子,每个管理员只能管理一个仓库,那么如果设计库存表(仓库名,管理员名,商品名,数量),主键为(仓库名,管理员名,商品名),这是满足前面三个范式的,但是仓库名和管理员名之间存在依赖关系,因此删除某一个仓库,会导致管理员也被删除,因此设计不合理。
第四范式(4NF)当一个表中的非主属性相互独立时(3NF),这些非主属性不应该有多值。
数据库范式通俗讲解
数据库范式是一种设计数据库表结构的方法,旨在消除数据冗余并提高数据存储的效率。
通俗来讲,数据库范式就是一种规范,它告诉我们如何把数据存储在数据库中,以便更好地组织和管理数据。
数据库范式通常分为不同的级别,即第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
每个级别都有其特定的规则和要求,用于确保数据库表的结构合理且数据不会重复存储。
第一范式要求每个数据表中的每一列都是不可再分的原子值,不可再分的意思是不能再分解为更小的数据单元。
这样可以避免数据冗余和复杂的数据结构。
第二范式要求数据表中的非主键列完全依赖于主键,即非主键列必须完全依赖于主键,而不是部分依赖。
这样可以确保数据表中的数据结构更加清晰和简洁。
第三范式要求数据表中的每一列都与主键直接相关,而不是与其他非主键列相关。
这样可以进一步减少数据冗余,提高数据的一
致性和完整性。
总的来说,数据库范式的目标是通过合理的数据表设计,减少数据冗余,提高数据存储和检索的效率,确保数据的一致性和完整性。
然而,有时候过度范式化也可能导致查询性能下降,因此在实际应用中需要根据具体情况进行权衡和调整。
数据库设计是指按照特定的规范和要求,对数据库的数据存储和管理进行规划和设计的过程。
数据库设计的三个范式是指数据库设计中的基本规范,其中第一范式(1NF)、第二范式(2NF)和第三范式(3NF)分别规定了数据库中的数据应该满足的标准和要求。
下面我们将简要介绍数据库设计的三个范式的含义。
一、第一范式(1NF)1. 第一范式是指数据库表中的所有字段都是不可再分的最小单元,即每个数据项都是不可再分的,不能再被分割为更小的数据项。
2. 数据库表中的每一列都是单一的值,不可再分。
3. 所有的字段都应该是原子性的,即不能再分。
4. 如果数据库表中的字段不满足第一范式的要求,就需要进行适当的调整和修改,使之满足第一范式的要求。
二、第二范式(2NF)1. 第二范式是指数据库表中的所有非主属性都完全依赖于全部主键。
2. 所谓主属性是指唯一标识一个记录的属性,而非主属性是指与主键相关的其他属性。
3. 如果一个表中的某些字段与主键没有直接关系,而是依赖于其他字段,则需要将这些字段拆分到另一个表中。
4. 通过将非主属性与主键分离,可以避免数据冗余和更新异常。
5. 第二范式要求数据库表中的数据项应该是唯一的,不可再分,且完全依赖于全部主键。
三、第三范式(3NF)1. 第三范式是指数据库表中的所有字段都不依赖于其他非主字段。
2. 也就是说,一个表中的字段之间应该相互独立,不应该存在字段之间的传递依赖关系。
3. 如果一个字段依赖于其他非主字段,则应该将其拆分到另一张表中,以避免数据冗余和更新异常。
4. 第三范式要求数据库表中的字段之间应该是独立的,不应该存在传递依赖关系。
数据库设计的三个范式分别规范了数据库表中数据的原子性、依赖性和独立性。
遵循这些范式可以有效地减少数据冗余和更新异常,提高数据库的数据完整性和稳定性。
在进行数据库设计时,设计人员应该严格遵循这些范式的要求,以确保数据库的高效性和可靠性。
众所周知,数据库设计的三个范式是设计和维护关系型数据库时非常重要的标准和指导原则。
数据库三⼤范式数据库的三⼤特性可谓是:实体属性和关系。
实体:表;属性:表中的数据(字段);关系:表与表之间的关系;第⼀范式(1NF):数据表中的每⼀列(每个字段)必须是不可拆分的最⼩单元,也就是确保每⼀列的原⼦性;例如:userInfo:⼭东省烟台市 131777368781 userAds:⼭东0省烟台市 userTel:131777368781第⼆范式(2NF):满⾜1NF后,要求表中的所有列,都必须依赖于主键,⽽不能有任何⼀列与主键没有关系,也就是说⼀个表只描述⼀件事情;例如:订单表只描述订单相关的信息,所以所有字段都必须与订单id相关产品表只描述产品相关的信息,所以所有字段都必须与产品id相关;因此不能在⼀张表中同时出现订单信息与产品信息;如下图所⽰:第三范式(3NF):必须先满⾜第⼆范式(2NF),要求:表中的每⼀列只与主键直接相关⽽不是间接相关,(表中的每⼀列只能依赖于主键);例如:订单表中需要有客户相关信息,在分离出客户表之后,订单表中只需要有⼀个⽤户id即可,⽽不能有其他的客户信息。
因为其他的客户信息直接关联于⽤户id,⽽不是直接与订单id直接相关。
【如何更好的区分三⼤范式】第⼀范式和第⼆范式在于有没有分出两张表,第⼆范式是说⼀张表中包含了所种不同的实体属性,那么要必须分成多张表,第三范式是要求已经分成了多张表,那么⼀张表中只能有另⼀张表中的id(主键),⽽不能有其他的任何信息(其他的信息⼀律⽤主键在另⼀表查询)。
【数据库五⼤约束】1.primary KEY:设置主键约束;2.UNIQUE:设置唯⼀性约束,不能有重复值;3.DEFAULT 默认值约束,height DOUBLE(3,2)DEFAULT 1.2 height不输⼊是默认为1,24.NOT NULL:设置⾮空约束,该字段不能为空;5.FOREIGN key :设置外键约束。
【主键】1.主键的注意事项?主键默认⾮空,默认唯⼀性约束,只有主键才能设置⾃动增长,⾃动增长⼀定是主键,主键不⼀定⾃动增长;2.设置主键的⽅式?在定义列时设置:ID INT PRIMARY KEY在列定义完之后设置:primary KEY(id)【外键】1.设置外键的注意事项:只有INNODB的数据库引擎⽀持外键,修改my.ini⽂件设置default-storage-engine=INNODB 外键必须与参照列的数据类型必须相同(数值型要求长度和⽆符号都相同,字符串要求类型相同,长度可以不同)。
数据库范式1NF 2NF 3NF BCNF 范式是符合某一种级别的关系模式的集合。
构造数据库必须遵循一定的规则。
在关系数据库中,这种规则就是范式。
关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。
满足最低要求的范式是第一范式(1NF)。
在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。
一般说来,数据库只需满足第三范式(3NF)就行了。
1 第一范式(1NF)在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
2 第二范式(2NF)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1 NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
简而言之,第二范式就是非主属性非部分依赖于主关键字。
3 第三范式(3NF)满足第三范式(3NF)必须先满足第二范式(2NF)。
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明第一范式(1NF)无重复的列所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
例如,如下的数据库表是符合第一范式的:字段1 字段2 字段3 字段4而这样的数据库表是不符合第一范式的:字段1 字段2 字段3 字段4字段字段数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
第二范式(2NF)属性完全依赖于主键[ 消除部分子函数依赖]如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
数据库的第一范式第二范式第三范式
在数据库设计中,为了保证数据的完整性和一致性,需要遵循数
据范式。
在数据范式中,第一范式、第二范式和第三范式是最常见和
最重要的范式。
第一范式(1NF)
第一范式是指关系模式中的每个属性都是原子的(即不可再分解的)。
换句话说,每个属性都应该是单值属性,比如一个订单只能有
一个订单号,不能有两个或更多个。
如果属性可以分解为多个属性,
则需要重新设计关系模式以满足第一范式的要求。
第二范式(2NF)
第二范式是指关系模式中的每个非主属性都完全依赖于主键。
非
主属性是指不是唯一标识某个关系记录的属性。
如果存在某些非主属
性只依赖于主键的部分属性,则需要将这些属性分离到新的关系模式中。
第三范式(3NF)
第三范式是指关系模式中的每个非主属性都不依赖于其他非主属性。
如果存在某个非主属性依赖于其他非主属性,则需要将其分离到
新的关系模式中。
总结
遵循第一范式、第二范式和第三范式可以保证数据库的一致性和
准确性。
但是,需要注意的是,过度正规化可能会导致查询性能下降,因此需要在正规化和反规范化之间做出权衡。
同时,在设计数据库时,还需要考虑实际业务需求和数据访问模式,以便优化数据结构和查询
性能。
数据库三范式和反三范式
数据库三范式和反三范式是数据库设计中的重要概念,对于数据库的性能和数据的完整性都有着重要的影响。
首先,我们来了解什么是数据库三范式。
数据库三范式是一种设计数据库的规范,也就是说,当我们设计数据库时,需要遵循三个规范,即第一范式、第二范式和第三范式。
第一范式要求数据库中的每个单元格都应该是原子性的,也就是说,每个单元格只能存储一个值,不能是多个值的组合。
第二范式要求每个表必须有一个主键,并且非主键字段必须完全依赖于主键。
也就是说,每个表中的每个字段都必须与主键相关。
第三范式要求每个表中的字段都应该直接依赖于主键,而不是依赖于其他非主键字段。
这样可以避免冗余数据,提高数据的一致性和完整性。
然而,在实际的数据库设计中,有时候会出现一些情况,不得不违反三范式的规则。
这时候就需要使用反三范式。
反三范式是指在设计数据库时,有意违反三范式的规则,以提高查询性能和减少数据冗余。
比如,在一些大型的商业系统中,为了提高查询性能,可能会将一些需要频繁查询的数据冗余存储在多个表中,这样可以避免频繁的联表查询,提高查询效率。
总的来说,数据库三范式和反三范式都是数据库设计中的重要概念,需要根据实际情况进行选择。
在数据库设计时,需要考虑多
个因素,如数据量、查询性能、数据完整性等,以达到最优的设计效果。
数据库第一二三范式在数据库的世界里,有个东西叫做范式,听起来高深莫测,其实就像是家里的规矩,简单得很。
咱们先聊聊第一范式。
这可是一种基础的要求,简单来说,就是每一张表里的每一列都得是原子的,意思就是不能把东西拆开来装。
比如说,想想咱们的购物清单,如果在一个栏里写着“苹果、香蕉、橙子”,那这就是个不合格的范式。
对吧?一列就得放一件事儿。
把苹果单独放,香蕉也得单独列,橙子也不能藏起来。
这样一来,查找和管理就方便多了。
想象一下,你的老妈做饭时,看到一张乱七八糟的食材清单,肯定得抓狂。
这样清晰明了,一目了然,才不容易出错。
再说说第二范式,嘿,这可是更进一步的要求哦。
这一步呢,讲究的是不重复,不冗余。
你想象一下,咱们在记账,收入和支出都得分类清楚。
有些小伙伴可能会觉得,哦,我就把所有收入和支出都放在一张表里得了。
可是这样一来,一查就乱了套。
如果你把每一笔收入的详细信息都分开存好,那将来一查起来,简直像翻家底一样,方便得很。
第二范式就像是一个好管家的要求,帮助你把一切都理顺,简单明了,省得自己后期还得返工。
谁喜欢整天跟琐事打交道呢?可别小看了这个第二范式,合格了的话,数据的完整性和一致性就能大大提高,心里踏实多了。
第三范式就更讲究了,听起来有点儿复杂,其实也就是避免数据的依赖关系。
比方说,咱们有一个员工表和一个部门表。
你说,一个员工的部门信息是不是应该放在部门表里呢?如果在员工表里也重复一遍,那可就成了冗余了,想想看,万一部门改名了,员工表里的信息不就得跟着改一遍,真是麻烦啊。
这样不仅费时,还容易出错。
想象一下,一个公司里,大家的名字都是不同的,可部门改名了,你的表格却还是“老黄历”,那不是笑话嘛!所以,第三范式就像是一个严谨的老师,要求你保持整洁、明确,不让冗余来捣乱。
说到这里,范式就像是数据世界里的规矩,别小看了这些规矩,搞定了它们,你的数据库就能像一个井井有条的图书馆,每本书都有自己的位置。
试想一下,如果每本书都扔在一块,那得找多久才能找到你想要的那本呢?更别提别人来借书,那简直就是“翻天覆地”的场面了。
第一范式实验范式,第四范式数据范式【原创实用版】目录1.介绍数据库范式2.第一范式:属性不可分3.第二范式:部分依赖消除4.第三范式:传递依赖消除5.第四范式:数据范式6.总结正文在数据库设计中,范式是一种用于描述数据表结构的方法,它有助于降低数据冗余和保证数据一致性。
根据范式的不同,数据表结构会有所不同,下面我们将介绍四种常见的数据库范式:第一范式、第二范式、第三范式和第四范式。
第一范式,又称为属性不可分范式,要求数据表中的每一个属性都是不可再分的。
这意味着,如果一个属性包含多个值,那么它应该被分解为多个单独的属性。
例如,假设我们有一个存储顾客订单信息的表,其中包含一个属性“地址”。
按照第一范式的要求,我们应该将“地址”属性分解为“省”、“市”、“区”等单独的属性。
第二范式,又称为部分依赖消除范式,要求数据表中的每个非主键属性都完全依赖于主键,而不是依赖于主键的一部分。
换句话说,第二范式要求消除数据表中的部分依赖关系。
以顾客订单表为例,如果我们将“地址”属性分解为“省”、“市”、“区”,那么“市”和“区”就依赖于“省”,而不是依赖于主键“订单编号”。
这种情况下,我们需要将“市”和“区”属性转换为依赖于主键“订单编号”的属性。
第三范式,又称为传递依赖消除范式,要求数据表中的每个非主键属性都不依赖于其他非主键属性。
这意味着,在第三范式下,数据表中的所有非主键属性都直接依赖于主键。
以顾客订单表为例,如果我们将“地址”属性分解为“省”、“市”、“区”,并且将“市”和“区”属性转换为依赖于主键“订单编号”,那么“省”属性就成为了传递依赖的源头。
为了消除传递依赖,我们需要将“省”属性直接依赖于主键“订单编号”。
第四范式,又称为数据范式,要求在第三范式的基础上,消除数据表中的冗余信息。
在第四范式下,数据表中的所有信息都是必要的,不存在多余的数据。
以顾客订单表为例,如果我们已经将“地址”属性分解为“省”、“市”、“区”,并且将“市”和“区”属性转换为直接依赖于主键“订单编号”,那么这个表结构就是第四范式。
数据库范式1NF 2NF 3NF BCNF(实例)设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。
构造数据库必须遵循一定的规则。
在关系数据库中,这种规则就是范式。
关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。
满足最低要求的范式是第一范式(1NF)。
在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。
一般说来,数据库只需满足第三范式(3NF)就行了。
下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。
这样可能使数据库产生重复数据,从而导致创建多余的表。
范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。
下面是范化的一个例子Customer Item purchased Purchase price Thomas Shirt $40 Maria Tennis shoes $35 Evelyn Shirt $40 Pajaro Trousers $25如果上面这个表用于保存物品的价格,而你想要删除其中的一个顾客,这时你就必须同时删除一个价格。
范化就是要解决这个问题,你可以将这个表化为两个表,一个用于存储每个顾客和他所买物品的信息,另一个用于存储每件产品和其价格的信息,这样对其中一个表做添加或删除操作就不会影响另一个表。
关系数据库的几种设计范式介绍1 第一范式(1NF)在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。
简而言之,第一范式就是无重复的列。
2 第二范式(2NF)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。
这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
简而言之,第二范式就是非主属性非部分依赖于主关键字。
3 第三范式(3NF)满足第三范式(3NF)必须先满足第二范式(2NF)。
简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。
那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
简而言之,第三范式就是属性不依赖于其它非主属性。
数据库设计三大范式应用实例剖析数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
设计范式是不是很难懂呢?非也,大学教材上给我们一堆数学公式我们当然看不懂,也记不住。
所以我们很多人就根本不按照范式来设计数据库。
实质上,设计范式用很形象、很简洁的话语就能说清楚,道明白。
本文将对范式进行通俗地说明,并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。
范式说明第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,如下的数据库表是符合第一范式的:字段1 字段2 字段3 字段4而这样的数据库表是不符合第一范式的:字段1 字段2 字段3 字段4字段3.1 字段3.2很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)这个数据库表不满足第二范式,因为存在如下决定关系:(课程名称) → (学分)(学号) → (姓名, 年龄)即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。
这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。
但是,与此同时,课程名称和学分信息也被删除了。
很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表:学生:Student(学号, 姓名, 年龄);课程:Course(课程名称, 学分);选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。
因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→ 非关键字段x → 非关键字段y假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:(学号) → (所在学院) → (学院地点, 学院电话)即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
把学生关系表分为如下两个表:学生:(学号, 姓名, 年龄, 所在学院);学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。
这个数据库表中存在如下决定关系:(仓库ID, 存储物品ID) →(管理员ID, 数量)(管理员ID, 存储物品ID) → (仓库ID, 数量)所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。
但是,由于存在如下决定关(仓库ID) → (管理员ID)(管理员ID) → (仓库ID)即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
它会出现如下异常情况:(1) 删除异常:当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
(2) 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:仓库管理:StorehouseManage(仓库ID, 管理员ID);仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
范式应用我们来逐步搞定一个论坛的数据库,有如下信息:(1)用户:用户名,email,主页,电话,联系地址(2)帖子:发帖标题,发帖内容,回复标题,回复内容第一次我们将数据库设计为仅仅存在表:用户名email 主页电话联系地址发帖标题发帖内容回复标题回复内容这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。
我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:用户名email 主页电话联系地址发帖ID 发帖标题发帖内容回复ID 回复标题回这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:(用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)但是,这样的设计不符合第二范式,因为存在如下决定关系:(用户名) → (email,主页,电话,联系地址)(发帖ID) → (发帖标题,发帖内容)(回复ID) → (回复标题,回复内容)即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。