数据库设计三范式

简介: 数据库三范式是设计规范表结构的指导原则:第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,一张表只描述一件事;第三范式要求消除传递依赖。虽有助于减少冗余与维护成本,但实际设计应结合业务需求灵活应用,不必机械遵循。

第一范式 - 1NF
遵循原子性。即,表中字段的数据,不可以再拆分。先看一个不符合第一范式的表结构,如下:
员工编码 姓名 年龄
001 销售部小张 28
002 运营部小黄 25
003 技术部小高 22
在这一个表中的,姓名 字段下的数据是可以再进行拆分的,因此它不符合第一范式,那怎么样才符合第一范式呢?如下:
员工编码 部门 姓名 年龄
001 销售部 小张 28
002 运营部 小黄 25
003 技术部 小高 22
那是否遵循第一范式就一定是好的呢?如下:
员工编码 姓名 地址
001 小张 江西省南昌市东湖区
002 小黄 广东省佛山市禅城区
003 小高 湖北省武汉市新洲区
通过观察上述表结构,我们发现,地址是可以再进一步拆分的,比如:
员工编码 姓名 省 市 区
001 小张 江西省 南昌市 东湖区
002 小黄 广东省 佛山市 禅城区
003 小高 湖北省 武汉市 新洲区
虽然拆分后,看上去更符合第一范式了,但是如果项目就只需要我们输出一个完整地址呢?那明显是表在没拆分的时候会更好用。所以范式只是给了我们一个参考,我们更多的是要根据项目实际情况设计表结构。
第二范式 - 2NF
在满足第一范式的情况下,遵循唯一性,消除部分依赖。即,表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。再通俗点讲就是,一个表只能描述一件事情。我们用一个经典案例进行解析。
学号 姓名 年龄 课程名称 成绩 学分
001 小张 28 语文 90 3
001 小张 28 数学 90 2
002 小黄 25 语文 90 3
002 小黄 25 语文 90 3
003 小高 22 数学 90 2
我们先分析一下表结构。

  1. 假设学号是表中的唯一主键,那由学号就可以确定姓名和年龄了,但是却不能确定课程名称和成绩。
  2. 假设课程名称是表中的唯一主键,那由课程名称就可以确定学分了,但是却不能确定姓名、年龄和成绩。
  3. 虽然通过学号和课程名称的联合主键,可以确定除联合主键外的所有的非主键值,但是基于上述两个假设,也不符合第二范式的要求。

那我们应该如何调整表结构,让它能复合第二范式的要求呢?
我们可以基于上述的三种主键的可能,拆分成 3 张表,保证一张表只描述一件事情。

  1. 学生表 - 学号做主键
    学号 姓名 年龄
    001 小张 28
    002 小黄 25
    003 小高 22
  2. 课程表 - 课程名称做主键
    课程名称 学分
    语文 3
    数学 2
  3. 成绩表 - 学号和课程名称做联合主键
    学号 课程名称 成绩
    001 语文 90
    001 数学 90
    002 语文 90
    002 语文 90
    003 数学 90
    这时候我们可能会想,为什么我们就要遵循第二范式呢?不遵循第二范式会造成什么样的后果呢?
  4. 造成整表的数据冗余。
    如学生表,可能我就只有2个学生,每个学生都有许多的信息,比如,年龄、性别、身高、住址......如果与课程信息放到同一张表中,可能每个学生有3门课程,那数据总条数就会变成6条了。但是通过拆分,学生表我们只需要存储 2 条学生信息,课程表只需要存储 3 条课程信息,成绩表就只需保留学号、课程名称和成绩字段。
  5. 更新数据不方便。
    假设,课程的学分发生了变更,那我们就需要把整表关于该课程的学分都要更新一次,但如果我们拆分出课程表,那我们就只需要把课程表中的课程信息更新就行。
  6. 插入数据不方便或产生异常。
    ① 假设主键是学号或课程名称,我们新增了某个课程,需要把数据插入到表中,这时,可能只有部分人有选修这门课程,那我们插入数据的时候还要规定给哪些人插入对应的课程信息,同时可能由于成绩还没有,我们需要对成绩置空,后续有成绩后还得重新更新一遍。
    ② 假设主键是学号和课程名称的联合主键。同样也是新增了某课程,但是暂时没有人选修这门课,缺少了学号主键字段数据,会导致课程信息无法插入。
    第三范式 - 3NF
    在满足第二范式的情况下,消除传递依赖。即,在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
    仍然用一个经典例子来解析
    学号 姓名 班级 班主任
    001 小黄 一年级(1)班 高老师
    这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合了第二范式,但是在非主键字段中,我们也可以通过班级推导出该班级的班主任,所以它是不符合第三范式的。
    那怎么设计表结构,才是符合第三范式的呢?
  7. 学生表
    学号 姓名 班级
    001 小黄 一年级(1)班
  8. 班级表
    班级 班主任
    一年级(1)班 高老师
    通过把班级与班主任的映射关系另外做成一张映射表,我们就成功地消除了表中的传递依赖了。
    总结
    不知道读者们有没有发现,以上所介绍的范式的最终目的都是为了减少我们的工作量呢?所以说,尽管范式是一种很好的指导规范,但在实际应用中,我们也不需要太局限在范式中,更多的是应该从项目中出发,设计出合理的表结构。
    以下是本篇三范式的简单总结:
    ● 第一范式(1 NF):字段不可再拆分。
    ● 第二范式(2 NF):表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。
    ● 第三范式(3 NF):在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
相关文章
|
6月前
|
Java 关系型数据库 MySQL
OAuth2.0实战案例
本项目基于Spring Boot与Spring Cloud构建,实现OAuth2四种授权模式。通过父工程统一管理依赖,分别搭建资源服务器与认证服务器,集成MyBatis与MySQL实现用户及客户端信息持久化,完成授权码、简化、密码及客户端模式的认证流程,保障资源访问安全。
|
7月前
|
安全 Linux 网络安全
Linux下搭建L2TP/IPsec VPN服务(手把手教你配置安全远程连接)
本教程详细介绍如何在Ubuntu 22.04上搭建L2TP/IPsec VPN服务器,涵盖软件安装、IPsec与xl2tpd配置、用户添加、防火墙设置及连接测试,适合初学者快速掌握Linux下安全的VPN搭建方法。
|
6月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
数据架构核心输出为ER图,包含实体、关系与属性。通过四色原型法进行领域建模:红色MI表时序事件,绿色PPT为业务对象,黄色Role是参与角色,蓝色DESC提供描述信息。以风控系统为例,从业务流程提炼MI,构建PPT实体,补充Role与DESC,最终提取含一对一、一对多等关系的ER图,形成清晰的数据模型。(239字)
|
6月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中用于描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过生命线、控制焦点和消息展现动态协作。强调交互时序,可直观表达并发过程。包含角色、对象、消息类型(同步、异步、返回)及自关联等元素,广泛用于系统设计与分析。
|
6月前
|
缓存 Java Nacos
@RefreshScope热更新原理
@RefreshScope注解通过组合@Scope("refresh")实现配置热更新,利用代理模式与缓存机制。加注解的Bean被放入自定义作用域缓存,配置变更时清空缓存,触发Spring重新创建Bean,从而注入最新配置值,实现动态刷新。
|
6月前
|
Java Shell 测试技术
Jmeter快速入门
JMeter是基于JDK的性能测试工具,需先安装并配置JDK。下载解压后,通过双击或命令行启动,注意启动较慢且不可关闭黑窗口。可设置中文语言(临时或修改jmeter.properties永久生效)。基本使用包括创建线程组、添加HTTP取样器、配置请求参数及添加监听器(如结果树、汇总报告)查看测试结果。
|
6月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是利用Web应用输入验证缺陷,将恶意SQL代码植入数据库查询的攻击方式,可导致身份绕过、数据泄露、篡改甚至系统沦陷。常见于登录框、搜索栏等用户输入场景。防御需结合输入验证、参数化查询及IPS等多层机制,杜绝动态拼接SQL语句,防止攻击者操控执行逻辑,保障数据安全。
|
6月前
|
运维 Devops 开发工具
生产环境缺陷管理
git-poison基于go-git实现,通过“投毒-解毒”机制在分布式环境中精准追踪和管理bug,避免多分支开发中bug修复遗漏问题。它自动化同步各角色间的bug信息,降低沟通成本,支持发布卡点与影响范围查询,有效防止“重复翻车”,提升发布安全性与效率,适用于所有git仓库,已成功应用于大型团队实践。
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
1288 4
|
云安全 存储 人工智能
中国企业出海首选!阿里云荣获BSI数字信任钛金奖
日前,英国标准协会(BSI)向多家国内企业颁发了首届数字信任奖项,阿里云获得该奖项中的最高级别——钛金奖。BSI亚太区总裁林劲表示:“阿里云目前通过多项标准的严格审核,在多方面管控满足国际水平要求……期望阿里云可以借助标准的力量,为全球客户提供更稳定,更安全的服务。” 未来,阿里云预计三年投入70亿建设国际生态,强化海外本地服务能力,同时联合1万家全球合作伙伴持续深耕500多个联合生态方案,长期可持续地服务22万家中国企业出海,为全球超400万客户提供可信赖的云服务。
515 0
中国企业出海首选!阿里云荣获BSI数字信任钛金奖