开发工具与关键技术:Visual Studio 2015 , MVC
作者:任浩基
撰写时间:2019/06/25
【数据库三大范式】我们都知道在作项目时,是要用到数据库的。在这个过程中数据库的建立是至关重要的。因为一旦数据库出错了,您所做的项目信息很有可能前功尽废。所以说数据库建立是至关重要的。
数据库的设计范式是数据库设计所需要满足的规范。满足这些规范的数据库是简洁的、结构清晰的,同时不会发生插入(insert)、删除(delete)和更新(update)操作的异常。反之数据则是凌乱不堪的,这样不仅给数据库的编程人员造成不必要的麻烦,而且还可能存储了大量不需要的冗余信息。因此建立数据库时一定要简洁、规范以及清晰。
我们都知道数据库有范式,到真正做到懂的又有几个呢?数据库里有六大范式,下面我来为大家讲解下三大范式,分别是:第一范式,第二范式以及第三范式。其中的第四范式(4NF)、第五范式(5NF)、第六范式(6NF)在数据库里我们不经常用到,因而我们只讲第一至第三范式。还有一点第六范式(6NF)是在理论上存在的,但实际上并没有做到。
那下面我就来聊聊三大范式说明吧!
第一范式(1NF)(必须要有主键,列不可分):数据库表中的字段都是单一属性的,不可再分的。这个单一属性有基本类型构成,包括整形、实数、字符型、逻辑性、日期型等。所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性就可能需要定义一个新的实体,新的实体有重复的属性构成。新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简单点说第一范式就是没有
重复的列。 在这还有重要的一点说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库了。
下面是关系图请看图片:
文章图片
第二范式(2NF)(却报表中的每列都和逐渐相关):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定了非关键字段的情况),也就是说所有非关键字段都完全依赖于任意一组候选关键字。即完全依赖于主键[消除非主属性对主码的部分函数依赖] 然而第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式。第二范式要求数据库表中的每个实例或行可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编码是唯一的,因此每个员工可以被唯一区分。这个唯一属性列就会被称为主关键字或主键、主码。 当然第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体。
新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,已存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键。
下面就是本文的重点了,请认真细读:
第三范式(3NF)(确保每列都和主键列直接相关):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖。指的就是如果存在“A→B→C”的决定关系,则C传递函数依赖于A。因此满足第三范式的数据库中表应该不存在如下依赖关系:关键字段 → 非关键字段x → 非关键字段y。属性之间含有这样的关系,是不符合第三范式的。第三范式需要确保数据库中的每一列数据都和主键直接相关,而不能间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必再订单信息表中多次输入客户信息的内容,减少了数据冗余。
下面是对这三大范式的总结:
由此可以看出,并不一定要强行满足范式的要求,对于1:N的关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!
对于M:N的关系。不能将M一边或N一边合并到另一边去,这样会导致不符合范式的要求,同时导致操作异常和数据冗余。对于1; 1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。
下面是结论:
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中村在1:1或1:N关系这种特殊的情况下,合并导致的不符合要求反而是合理的。因而我们在设计数据库的时候,一定要时刻考虑范式的要求。
下面我们来看第一范式的一个例子:
1、类型选择:
Nchar或char:字符串类型,长度=实际+1或根据常规预估+增加20%;
Lnt:bigint int smallint,一定确定范围,你能只取最大;
Lmage:图片类型,可以用binary代替,为二进制;
Ntext:文本型,有格式的大字符集合;
Nchar(char)和int的使用区分。
2、信息中包含了数字和数字之外的其他字符,用Nchar(char)。比如:身份证号、其他任
何字符串。
4、 如果全部是数字,但有固定长度(规则),或第一个数字是0,必须用Nchar(char)。
比如:1701209,代表规则,年级(2)+班级(2)+性别(1)+学号序 号(2)
5、第“(2)”之外的数字信息都要用数字型
3、Bit:是或否,逻辑性。
6、小数型:numeric(x,y)、dicimal(x,y)。
7、日期型:datime , date
下面是数据库运行关系图:
文章图片
系图:物理关系图、逻辑关系图
(1) 物理关系图:保证数据的绝对完整性、级联性、绝对消除“数据冗余”。
(2) 建立关系图之后,录入数据的先后:先父表在子表。
(3) 关系的种类
数据库三大范式就讲到这里了,相信不少网友们都理解了吧!如有错误,请指出。