三范式(详解+例子)

博客主要介绍数据库的第一、二、三范式。第一范式要求每列是不可分割的原子数据项;第二范式在1NF基础上,消除非主属性对主码的部分函数依赖;第三范式在2NF基础上,消除传递依赖。还解释了函数依赖等相关概念,并通过实例说明如何满足各范式。

第一范式(1NF):每一列都是不可分割的原子数据项(什么意思,每一项都不可分割,像下面的表格就能分割,所以它连第一范式都算不上)

在这里插入图片描述

分割后的样子
在这里插入图片描述

(它就是第一范式了)

第二范式:在1NF基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

几个重要的概念:

1.函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一的B属性的值,则称B依赖于A

例如:学号---->姓名 (学号、课程名称 的属性组)–> 分数

2.完全函数依赖:A–>B 如果A是一个属性组,则B属性值的确定需要依赖A属性组的中所有的属性值

例如:(学号、课程名称)–> 分数

3. 部分函数依赖: A–>B 如果A是一个属性组,则B属性值的确定只需要依赖A属性组的中某一些的属性值(第二范式就是消除这个)

例如:(学号 、课程名称)–> 姓名

4.传递函数依赖:A – >B , B – >C 如果通过A属性(属性组)的值,可以确定唯一的B属性的值,再通过B属性(属性组)的值,可以唯一确定C属性的值,那么称C传递依赖于A

例如: 学号 --> 系名 ,系名 --> 系主任

5.码 :如果在一张表中,一个属性或属性组,被其他所有的属性(非主属性)所完全函数依赖,则称这个属性(属性组)为该表的码。(上面的表,学号和课程名称所构成的属性组就是码)

例如: 该表中码为 (学号、课程名称)

主属性: 码中所有属性

非主属性: 除码之外的所有属性

在上面那张表中我们可知码为(学号、课程名称),但是姓名、系名、系主任都部分依赖于码(主属性),这不符合第二范式,所以进行拆分如下

第一张表码为(学号、课程名称),第二张表为(学号),它们都是完全依赖的,因此符合第二范式。

在这里插入图片描述

第三范式(3NF):在2NF的基础上,任何的非主属性不依赖于其他非主属性 (在第二范式基础上消除传递依赖)

注意看第二范式的学生表:存在系主任依赖于系名 (系名—> 系主任),所以不符合第三范式

继续进行拆分

在这里插入图片描述

这样就符合第三范式…

### 数据库三范式详解 #### 第一范式 (1NF) 第一范式要求数据库表中的每一列都必须是不可分割的原子值,即不允许存在嵌套的数据结构。这意味着每列只包含单一类型的值,而不是数组或其他复杂对象。 例如,在一个学生信息表中,“姓名”字段应该是一个简单的字符串,而不能是一组名字列表[^1]。 ```sql CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(100), Address TEXT ); ``` #### 第二范式 (2NF) 第二范式建立在第一范式的基础上,进一步要求消除部分依赖关系。具体来说,如果一张表已经符合第一范式,则需要确保所有的非主属性完全函数依赖于候选键。换句话说,任何非主属性都不能仅依赖于某个主键的一部分。 举个例子,假设有一个订单详情表 `OrderDetails`,其中包含了订单号 (`OrderID`) 和产品编号 (`ProductID`) 的组合作为联合主键。为了遵循第二范式,其他所有字段(如价格、数量等)都应该同时取决于这两个主键成分,而非单独的一个[^2]。 ```sql CREATE TABLE OrderDetails ( OrderID INT NOT NULL, ProductID INT NOT NULL, Quantity INT, Price DECIMAL(8, 2), PRIMARY KEY (OrderID, ProductID) ); ``` #### 第三范式 (3NF)三范式是在满足前两者的前提下提出的更高层次的要求——它规定除了主属性外,其余各列不得相互之间形成传递依赖关系。也就是说,当某张表格达到此标准之后,就不会再有因间接关联而导致的信息重复现象发生。 继续沿用上面提到过的案例,假如我们发现产品的单价实际上是由其类别决定的话,那么就应该把这部分逻辑拆分出去创建一个新的实体来表示这种映射关系,从而避免潜在的风险[^3]。 ```sql -- 原始表结构调整如下: ALTER TABLE Products DROP COLUMN CategoryPrice; -- 新增CategoryPrices表用于保存分类定价规则 CREATE TABLE CategoryPrices ( CategoryName VARCHAR(50) PRIMARY KEY, BasePrice DECIMAL(8, 2) ); INSERT INTO CategoryPrices VALUES ('Electronics', 99),('Books', 19); ``` 以上就是关于数据库三范式的简单介绍以及相应的实现方法论探讨[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值