数据库设计的基础与进阶:1NF、2NF、3NF及BCNF解析
目录
什么是数据库范式?
1. 第一范式(1NF)
2. 第二范式(2NF)
3. 第三范式(3NF)
4. 博茨-科德范式(BCNF)
总结
在数据库设计中,范式是为了确保数据存储结构的规范化、减少数据冗余、提高数据一致性和完整性而提出的标准。常见的范式有 第一范式 (1NF)、第二范式 (2NF)、第三范式 (3NF) 和 博茨-科德范式 (BCNF)。理解这些范式不仅能帮助我们设计高效的数据库结构,还能避免很多潜在的数据问题。
什么是数据库范式?
数据库范式是指数据库表中数据的组织方式和规则。它的目标是减少数据冗余、避免数据不一致、确保数据完整性。通过将数据分解成不同的表,并确保表与表之间的关系清晰,范式能够显著提高数据库的效率和可靠性。
1. 第一范式(1NF)
第一范式要求数据库表中的每个字段都必须包含原子值。也就是说,表中的每一列都应该是不可分割的单一值。简单来说,1NF要求:
1.每列的数据类型必须是原子的。
2.每个字段只能存储一个值,不能是集合、列表或数组。
示例:
假设我们有一个学生信息表,其中包含一列“电话”,其数据可能是多个电话号码的集合,如:
学生ID | 姓名 | 电话 |
1 | 张三 | 13800000001, 13800000002 |
2 | 李四 | 13900000001 |
这种设计违反了1NF,因为“电话”列存储了多个值。为了满足1NF,我们应该将每个电话号码拆分到单独的行:
学生ID | 姓名 | 电话 |
1 | 张三 | 13800000001 |
1 | 张三 | 13800000002 |
2 | 李四 | 13900000001 |
这样,表中的每个列都是原子的,符合1NF的要求。
2. 第二范式(2NF)
第二范式是在1NF的基础上提出的,要求数据库表不仅满足1NF,还必须消除部分依赖。也就是说,如果一个表的主键由多个字段组成(复合主键),那么表中的所有非主属性(即非主键字段)必须完全依赖于整个主键,而不能仅依赖于主键的一部分。
部分依赖指的是在复合主键的情况下,某些非主属性只依赖于主键的一部分,而不是整个主键。这会导致冗余和数据一致性问题。
示例:
假设我们有一个成绩表,其中包括学生的学号、课程名和成绩,主键是(学号, 课程名)。表的结构如下:
学号 | 课程名 | 成绩 | 学生姓名 |
1 | 数学 | 90 | 张三 |
1 | 英语 | 85 | 张三 |
2 | 数学 | 88 | 李四 |
在这个表中,“学生姓名”只依赖于“学号”,而不依赖于整个复合主键(学号、课程名)。这就是部分依赖,我们应该将“学生姓名”字段移到一个单独的表中,只保留与课程相关的字段。
拆分后的表结构为:
学生表:
学号 | 学生姓名 |
1 | 张三 |
2 | 李四 |
成绩表:
学号 | 课程名 | 成绩 |
1 | 数学 | 90 |
1 | 英语 | 85 |
2 | 数学 | 88 |
这种设计满足了2NF,避免了冗余和部分依赖。
3. 第三范式(3NF)
第三范式在2NF的基础上进一步要求,表中的所有非主属性不仅要完全依赖于主键,还必须直接依赖于主键,而不能通过其他非主属性进行间接依赖。换句话说,消除传递依赖。
传递依赖是指某个非主属性依赖于另一个非主属性,再通过它间接依赖于主键。
示例:
假设我们有一个员工表,其中包括员工ID、部门ID、部门名称和员工姓名,主键是员工ID。表的结构如下:
员工ID | 员工姓名 | 部门ID | 部门名称 |
1 | 张三 | D1 | 销售 |
2 | 李四 | D2 | 技术 |
在这个表中,部门名称依赖于部门ID,而部门ID又依赖于主键员工ID。这就构成了传递依赖(部门名称 → 部门ID → 员工ID)。
为了满足3NF,我们应该将“部门名称”移到一个单独的表中,并通过“部门ID”进行关联。
拆分后的表结构为:
员工表:
员工ID | 员工姓名 | 部门ID |
1 | 张三 | D1 |
2 | 李四 | D2 |
部门表:
部门ID | 部门名称 |
D1 | 销售 |
D2 | 技术 |
这种设计消除了传递依赖,满足了3NF。
4. 博茨-科德范式(BCNF)
博茨-科德范式(BCNF)是3NF的一种更加严格的形式。BCNF要求每个决定因素(即能唯一确定其他属性的字段)都必须是候选键。简单来说,BCNF消除了在3NF下可能存在的更复杂的依赖关系。
在BCNF中,任何非主属性都不能依赖于其他非主属性,必须直接依赖于主键。
示例:
假设有一个表记录了课程和教师的教学信息,其中,主键是(课程ID, 教师ID)。然而,有一个规则是,每个课程只能由一个教师教授,因此“课程ID”决定了“教师ID”,而“教师ID”决定了“课程ID”,这违反了BCNF。
课程ID | 教师ID | 教师姓名 |
C1 | T1 | 张老师 |
C2 | T2 | 李老师 |
为了满足BCNF,我们需要将表拆分,确保每个决定因素都是候选键。拆分后的表如下:
课程表:
课程ID | 教师ID |
C1 | T1 |
C2 | T2 |
教师表:
教师ID | 教师姓名 |
T1 | 张老师 |
T2 | 李老师 |
现在,每个决定因素都是候选键,满足BCNF。
总结
数据库范式的目标是通过合理分解数据表,避免冗余和依赖问题,从而提高数据的完整性和一致性。常见的范式包括:
3.1NF:要求每列的数据必须是原子的。
4.2NF:要求消除部分依赖,所有非主属性完全依赖于主键。
5.3NF:要求消除传递依赖,所有非主属性直接依赖于主键。
6.BCNF:要求消除所有的非主属性对候选键的依赖。
虽然遵循范式可以有效地减少数据冗余和不一致,但在实际应用中,我们也要根据需求考虑性能,适当进行反规范化,以平衡数据一致性和查询效率。
相关文章:
数据库设计的基础与进阶:1NF、2NF、3NF及BCNF解析
目录 什么是数据库范式? 1. 第一范式(1NF) 2. 第二范式(2NF) 3. 第三范式(3NF) 4. 博茨-科德范式(BCNF) 总结 在数据库设计中,范式是为了确保数据存储结…...
ARM Cortex-A7 MPCore 架构
1、Cortex-A7 MPCore 简介 Cortex-A7 MPcore 处理器支持 1~4 核,通常是和 Cortex-A15 组成 big.LITTLE 架构的, Cortex-A15 作为大核负责高性能运算,比如玩游戏啥的, Cortex-A7 负责普通应用,因为 CortexA7 省电。 Cortex-A7 本身性能也不弱,不要看它叫做 Cortex-A7 但是…...
【操作系统】数据集合集!
本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 HarmonyOS 更新时间:2024-07-20 访问地址: GitHub 描述: 是首个基于微内核的全场景分布式操作系统,是华为自主研发的操作系统,华为将率…...
原生js图片预览
下面的图片预览是从一个JSON文件中加载图片列表,并且支持点击缩略图预览大图,还可以使用鼠标滚轮进行图片缩放。接下来了给大家把html、css、js一个一个的讲解一下 首先是html <div class"container"></div><div id"imag…...
【系统】Mac crontab 无法退出编辑模式问题
【系统】Mac crontab 无法退出编辑模式问题 背景一、问题回答1.定位原因:2.确认编辑器类型3.确保编辑器进入正确3.1 确认是否有crontab调度任务3.2 进入编辑器并确保编辑器正常3.3 保存操作 4.确认crontab任务存在5.确保脚本的可执行性和正确性 二、后续 背景 之前…...
【进程篇】04.进程的状态与优先级
一、进程的状态 1.1 进程的状态 1.1.1 并行与并发 • 并行: 多个进程在多个CPU下分别,同时进行运行 • 并发: 多个进程在一个CPU下采用进程切换的方式,在一个时间片内,让多个进程都得以推进 1.1.2 时间片的概念 LInux/windows这些民用级别…...
linux下蓝牙调试工具hcitool的使用
hcitool 是一个用于蓝牙设备管理的命令行工具,主要用于查看和管理蓝牙设备。以下是一些常见的用法和示例: 1. 查看本地蓝牙适配器信息 使用 hcitool dev 命令可以查看本地蓝牙适配器的信息。 hcitool dev示例输出: Devices:hci0 00:11:22…...
【RAG实战】Prompting vs. RAG vs. Finetuning: 如何选择LLM应用选择最佳方案
在构建基于大型语言模型(LLM)的应用时,通常不可能立即使用模型而无需任何调整。为了保持高实用性,我们可以选择以下几种方法之一: Prompt Engineering(提示工程)Fine-tuning(微调&a…...
EasyExcel 动态设置表格的背景颜色和排列
项目中使用EasyExcel把数据以excel格式导出,其中设置某一行、某一列单元格的背景颜色、排列方式十分常用,记录下来方便以后查阅。 1. 导入maven依赖: <dependency><groupId>com.alibaba</groupId><artifactId>easy…...
python俄罗斯方块.py
俄罗斯方块.py import pygame import random# 初始化游戏 pygame.init()# 设置游戏窗口的大小 screen_width 800 screen_height 600 play_width 300 play_height 600 block_size 30top_left_x (screen_width - play_width) // 2 top_left_y screen_height - play_heigh…...
IP协议详解
目录 一. IP协议概述 1. 概念 2. 特点 (1) 无连接性 (2) 不可靠传输 (3) 数据包分片和重组 二. IP协议报文格式 1. 版本 (4位) 2. 首部长度 (4位) 3. 服务类型 (8位) 4. 总长度 (16位) 5. 标识, 标志位, 片偏移 6. 生存时间 (8位) 7. 协议 (8位) 8. 首部检验和 (1…...
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理 课题摘要:一、项目结构各目录说明: 二、依赖项三、依赖管理任务四、依赖管理步骤1. 初始化Go Modules项目2. 添加依赖3. 指定依赖版本4. 更新依赖5. 清理未使用的依赖6. 离线工作7. 模块隔离8. 可重现构建 …...
代码生成器
源码 表结构 代码的目录结构 后端代码 前端代码 查询数据库的表 前端 后端 只查询当前数据库的表去除掉定时任务和生成器的表格去除掉已经导入的表格<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult"…...
MySQL 性能调优:打造高效数据库
SQL 语句层面的性能调优策略 合理选择字段属性 在创建 MySQL 表时,为了获取更好的性能,选择合适的字段属性至关重要。 首先,要依据实际情况合理设置字段的类型及宽度。例如,对于像手机号码这类固定长度为 11 位的字段ÿ…...
Elasticsearch 实战应用:提升数据洞察与交互体验
随着数据量的不断增长和数据处理需求的日益复杂,Elasticsearch 在实战应用中的价值愈发凸显。在本次教学中,我们继续深入探索 Elasticsearch 的更多高级实战应用,致力于培养学生在数据洞察和用户交互方面的卓越能力。 一、数据建模与优化策略…...
Ubuntu 配置静态 IP 地址
在 Ubuntu 系统中配置静态 IP 地址,适用于服务器或虚拟机需要固定 IP 的场景。以下是详细的步骤说明。 1. 确认网络接口信息 在配置之前,先确认系统的网络接口名称和当前的网络配置。 1.1 查看网络接口 运行以下命令获取网络接口的名称(如…...
2025美赛数学建模十大常用算法之层次分析法AHP详解
层次分析法(Analytic Hierarchy Process, AHP)详解 一、层次分析法简介 层次分析法(AHP)是一种系统化的多准则决策方法,由美国运筹学家萨蒂(Thomas L. Saaty)于20世纪70年代提出。AHP通过构建层…...
鸿蒙学习笔记:用户登录界面
文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素:一张图片增添视觉感,两个分别用于账号与密码的文本输入框&#…...
电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)
玩家可能不愿意在小屏幕上使用 Android 应用程序。此外,某些游戏玩家可能更喜欢在更大的屏幕上寻找刺激的体验,例如 PC 提供的体验,这可以增强他们的乐趣。因此,他们可能对如何在 PC 上流畅地运行 Android 应用程序感到好奇。本指…...
Java原生实现代码沙箱的实现
代码沙箱实现 代码沙箱:只负责接收代码和输入,返回编译运行的结果,不负责判题(可作为独立项目/服务,提供给其他需要执行代码的项目使用) 以Java语言为主,实现代码沙箱。主要学习其思想、关键流…...
Docker基础命令实战
问题:Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp 199.59.148.9:443: connect: connection refused 在pull nginx时出现的报错,可能原因是镜像源过期了,我们需要更换镜像源 …...
【QT实战の心情笔记】
文章目录 界面布局主要界面分为三部分:1. 笔记列表区域2. 笔记内容编辑区域3. 操作按钮区域 Qt Designer 界面设计步骤完整界面布局图各控件设置和属性Qt Designer 文件 (.ui) 数据库表结构SQL 表结构: 逻辑代码1. 项目结构2. Note 类 (Note.h 和 Note.c…...
关于Unity VFX 在Spawn状态的一些笔记
一. periodic burst 和 single burst 的区别 1. Single Burst 定义:Single Burst 是一次性发射粒子,只在粒子系统启动时触发一次。 它是一个瞬时的发射行为,适合单次效果。 特性: 只触发一次。发射时间通常是粒子系统启动时。不会重复发射,除非重新触发粒子系统。适用场景…...
AutoMQ 流表一体新特性 Table Topic 发布: 无缝集成 AWS S3 Table 和 Iceberg
超越共享存储:使用 Apache Iceberg 中的 AutoMQ Table Topic 实现流处理与分析的统一 自 2023 年底官宣以来,AutoMQ 成功地将 Apache Kafka 从“Shared Nothing architecture”转变为“Shared Storage architecture”,这为京东、知乎、小红书…...
springboot445新冠物资管理(论文+源码)_kaic
摘 要 使用旧方法对新冠物资管理的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在新冠物资管理的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的新冠物资管…...
【AIGC】LangChain 环境搭建及模型API能力集成使用详解
目录 一、前言 二、LangChain 概述 2.1 LangChain 是什么 2.2 LangChain 主要特点 2.3 LangChain能做什么和能力一览 2.4 LangChain 主要应用场景 三、环境准备 3.1 python 开发环境 3.1.1 python环境 3.1.2 配置vscode环境 3.1.3 安装LangChain相关插件包 3.2 获取…...
YOLOv8目标检测(六)_封装API接口
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…...
Firecrawl教程①:自动化抓取与数据转化,赋能AI应用
Firecrawl教程①:自动化抓取与数据转化,赋能AI应用 前言一、功能特点1. 支持 LLM 可处理的数据格式2. 全面抓取网站3. 强大的操作支持4. 灵活的定制选项5. 支持多种编程语言 SDK二、如何开始使用 Firecrawl第一步:获取 API 密钥第二步:官网在线工具使用第三步:安装 Firecr…...
2-2-18-17 QNX系统架构之“实时”
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
Linux下部署MySQL8.0集群 - 主从复制(一主两从)
目录 一、部署前准备 1、查看系统信息 # 查看系统版本 cat /etc/red* # 查看系统位数 getconf LONG_BIT[rootlocalhost ~]# cat /etc/red* CentOS Linux release 7.5.1804 (Core) [rootlocalhost ~]# getconf LONG_BIT 642、下载对应安装包 进入MySQL官网:https:…...
将HTML转换为PDF:使用Spire.Doc的详细指南
目录 引言 1. 为什么选择 Spire.Doc? 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…...
HarmonyOS 实践 - 设计模式在代码中的作用
文章目录 前言设计模式概述单例模式:全局状态管理代码分析 策略模式:界面主题切换代码分析 示例测试单例模式测试策略模式测试 体验评价总结 前言 在软件开发中,设计模式是公认的最佳实践,它能帮助开发者通过模块化和规范化的代码…...
kubeadm一键部署K8S 集群架构
kubeadm一键部署K8S 集群架构(centos7) https://www.k8src.cn/ https://kubernetes.io/zh-cn/docs/home/ https://blog.csdn.net/m0_58709145/article/details/140128179 https://blog.csdn.net/jiaqijiaqi666/article/details/129745828 Kubeadm init报错[ERROR CRI]: contai…...
[NSSCTF 2022 Spring Recruit]factor
给了: 说n是p*q 先求一下p*q factordb.com 然后再让pq 得到:31207540994438423298 接着用md5加密得到falg NSSCTF{7957a92ef959998115a6bda6d992656e}...
go 中使用redis 基础用法
1、安装redis 参考链接:https://www.codeleading.com/article/98554130215/ 1.1 查看是否有redis yum 源 yum install redis没有可用的软件包,执行1.2 1.2下载fedora的epel仓库 yum install epel-release --下载fedora的epel仓库1.3启动redis s…...
git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…...
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…...
【人工智能数学基础】——深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用
深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用 贝叶斯理论(Bayesian Theory)是概率论和统计学中的一个重要分支,它以托马斯贝叶斯(Thomas Bayes)命名,主要关注如何根据新的证据更…...
Gin-vue-admin(1):环境配置和安装
目录 环境配置如果443网络连接问题,需要添加代理服务器 后端运行前端运行 环境配置 git clone https://gitcode.com/gh_mirrors/gi/gin-vue-admin.git到server文件目录下 go mod tidygo mod tidy 是 Go 语言模块系统中的一个命令,用于维护 go.mod 文件…...
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例 摘要 本文将详细探讨一种利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,并通过分析给定代码示例,揭示其工作原理和潜在风险。我们将重点讨论如何在靶机上实现调用计算器…...
Gargoyle路由安装dockerd
ea8500刷石像鬼路由1.14.0,安dockerd,需先下载并安装以下依赖包,逐个安装。 kernel_5.10.176-1-6b05bc664d80d655942a20fb9ef8c3cd_arm_cortex-a15_neon-vfpv4.ipk kmod-br-netfilter_5.10.176-1_arm_cortex-a15_neon-vfpv4.ipk kmod-crypto…...
在linux系统的docker中安装GitLab
一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …...
滑动窗口
滑动窗口 标志: 利用两个指针 只进不退的特性 (样子与窗口类似) 解题模板 更新结果的时机 应该具体题目具体分析。 例题: 438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 1658. 将 x 减到 0 的最小操作数 - 力…...
人工智能 AI 大模型研究设计与实践应用技术研究报告
人工智能 AI 大模型研究设计与实践应用技术研究报告 摘要: 本报告深入探讨了人工智能 AI 大模型的研究设计架构以及在各领域的实践应用技术。通过对模型架构、训练方法、优化策略的详细阐述,结合实际案例分析其在自然语言处理、计算机视觉、智能医疗等领…...
【深度学习】 零基础介绍卷积神经网络(CNN)
CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…...
答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境
一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统,支持多种试题类型、多种试题难度、练题、考试、补考模式,提供全部前后台无加密源代码,支持私有化部署 二.测试环境 系统环境:CentOS、 运行环境&#x…...
PowerMILL 客制化宏 - 变量
从PowerMILL2012起,命令起始支持变量。支持变量将使宏命令更加灵活和功能强大。可以对变量做一些运算而不依赖其它语言。 当前支持有变量类型为: INT; REAL; STRING; ENTITY; ARRAY LIST; OBJECT; 以下就…...
第五篇:前后端如何“扯皮”——HTTP 在开发中的应用
文章目录 第五篇:前后端如何“扯皮”——HTTP 在开发中的应用1. HTTP 在前后端分离中的作用1.1 前后端分离的崛起1.2 HTTP 的职责 2. RESTful API 与 GraphQL 的对比2.1 RESTful API:标准化的老兵2.2 GraphQL:灵活的新秀2.3 RESTful 和 Graph…...
如何在 Ubuntu 22.04 服务器上安装 Jenkins
简介 Jenkins 是一个非常流行的免费自动化工具,每个人都应该了解它。DevOps 工程师使用它来自动化代码构建、测试和部署。本文将重点介绍如何在新的 Ubuntu LTS 版本,即 Ubuntu 22.04 中安装 Jenkins。 但在此之前,让我们快速讨论一下 Jenk…...
关于代码注释
代码注释的重要性与最佳实践 在软件开发过程中,代码注释被认为是代码质量的一个重要组成部分。它不仅帮助开发人员理解和维护代码,还有助于团队协作和代码的可持续性。然而,如何有效地使用注释是一个值得深思的问题。本文将探讨代码注释的重…...