数据库的四个范式

本文详细介绍了数据库的四大范式。第一范式要求无重复列,不设主键也能保证行唯一性;第二范式需属性完全依赖主键,有唯一主键保证行唯一;第三范式要求属性不依赖其他非主属性,存在主外键关系;第四范式禁止主键列和非主键列一对多关系不受约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 第一范式(1NF)

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

笔者曰:就是在一个不需要设立主键就能表中保证每一行都具有唯一性。不设立主键就能保证行唯一性的表就是第一范式。

1.2 第二范式(2NF)属性完全依赖于主键

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。

笔者曰:就是在一个有唯一主键在表中保证每一行都具有唯一性。存在一个列被定义为唯一主键的表就是第二范式。

1.3 第三范式(3NF)属性不依赖于其它非主属性

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

笔者曰:就是主副(父子)两张表,在子表中在外键是父表中的主键,子表中的外键值必须是父表中的主键值。存在主外关系的两张表就是第三范式。

1.4 第四范式(4NF)禁止主键列和非主键列一对多关系不受约束

第四范式用于处理由复杂的复合主键所导致的问题。如果将两个相互独立的属性与第三个属性一起组合为一个主键,并且如果没有第三个属性,仅靠这两个属性不能在实体中真正地起到唯一标识的作用,那么它就违反了第四范式;第四范式用来识别那些需要划分为多个不同的实体。通常,只有当很大的复合主键将过多的对象放到单个实体中的时候才会出现这样的问题。

### 数据库设计中的四个范式 #### 第一范式 (1NF) 第一范式的核心在于确保数据库表中的每一个字段都具有原子性,即不可再分割的基本数据项。这意味着表中的每一列必须只包含单一值,而不是一组值或复杂结构的数据[^3]。 #### 第二范式 (2NF) 第二范式建立在第一范式的基础之上,要求消除非主属性对部分键的依赖。换句话说,在满足第一范式的情况下,如果一个表中存在复合主键,则所有非主属性必须完全依赖于整个主键,而不仅仅是其中的一部分[^2]。 #### 第三范式 (3NF) 第三范式进一步扩展了第二范式的规则,它不仅消除了非主属性对部分键的依赖,还要求消除非主属性对其他非主属性的传递函数依赖。具体来说,任何非主属性都不能依赖于另一个非主属性,而是应该直接依赖于主键。 #### 巴斯-科德范式 (BCNF) 巴斯-科德范式是对第三范式的加强版本。在满足第三范式的基础上,BCNF要求所有的决定因素(除候选键外)也必须是超键。也就是说,对于任何一个函数依赖 X → Y,X 必须是一个超键或者至少包含一个超键。 --- ### 各范式之间的区别 - **1NF vs 2NF**: 第一范式关注的是字段的原子性,而第二范式则强调消除非主属性对部分键的部分依赖。 - **2NF vs 3NF**: 虽然两者都致力于减少冗余,但第三范式更严格地排除了非主属性间的传递依赖。 - **3NF vs BCNF**: 主要差异在于 BCNF 不允许任何形式的功能依赖违反其约束条件,即使这些功能依赖并不涉及非主属性。 ```sql -- 示例:创建符合不同范式的表格 CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), DepartmentID INT, -- 符合1NF FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, ProductID INT, Quantity INT, Price DECIMAL(10, 2), -- 符合2NF FOREIGN KEY (ProductID) REFERENCES Products(ProductID) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值