【数据库】Mysql数据库的三大范式1NF 2NF 3NF

文章目录

  • 简述
  • 1NF
  • 2NF
  • 3NF
  • 面试相关

简述

  • 1NF:字段不可拆分
  • 2NF:有主键,非主键字段依赖主键
  • 3NF:非主键字段不能互相依赖

1NF

属性不可分割,即每个属性都是不可分割的原子项(实体中的属性即表中的列)。只要字段值还可以继续拆分,就不满足第一范式。

例如:数据表中存在address地址该属性,若每条数据的值为“xx省xx市”,则该属性即可分割属性,分为“xx省”、“xx市”两个属性。

范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定,并非必须遵守该范式。

2NF

在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下。

例如某订单表为:

-- 订单表
CREATE TABLE myorder (
    product_id INT,
    customer_id INT,
    product_name VARCHAR(20),
    customer_name VARCHAR(20),
    PRIMARY KEY (product_id, customer_id)
);

product_name 只依赖于 product_idcustomer_name 只依赖于 customer_idproduct_namecustomer_id 是没有关系的,customer_nameproduct_id 也是没有关系的。

这就不满足第二范式:其他列都必须完全依赖于主键列

需要做如下改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE product (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

拆分之后,myorder 表中的 product_idcustomer_id 完全依赖于 order_id 主键,而 productcustomer 表中的其他字段又完全依赖于主键,即满足第二范式。

3NF

在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    customer_phone VARCHAR(20)
);

表中的 customer_phone 有也许依赖于 customer_id ,也就不满足第三范式:其他列之间不能有传递依赖关系

改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    phone VARCHAR(20)
);

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

面试相关

如何通俗理解三个范式?

  • 第一范式是对原子性的约束,要求属性具有原子性,不可拆分。
  • 第二范式是对记录的唯一性约束,要求具有唯一标识,即实体的唯一性
  • 第三范式是对字段冗余性的约束,即任何字段不能由其他字段派生出来

范式设计的优缺点?

  • 优点:减少数据冗余
  • 缺点:查询时需要关联多个表,更难进行索引优化

参考:
https://www.bilibili.com/video/BV1Vt411z7wy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/4030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 高德地图添加多个点标记

新建文件 amap.vue&#xff1a; <template><div id"amapcontainer" style"width: 1000px; height: 720px"></div> </template><script> import AMapLoader from amap/amap-jsapi-loader; window._AMapSecurityConfig {sec…

速度与兼容性功能大比拼:7款浏览器测评,哪一款更好用

还在为使用哪款浏览器而发愁吗&#xff1f;电脑配置低&#xff0c;又想浏览网页顺畅、下载速度快&#xff0c;那么就要挑选功能齐全、速度快的浏览器。话不多说&#xff0c;给大家做了7款浏览器的最全测评&#xff0c;看看2023年哪个浏览器更好用&#xff0c;更适合自己。 本次…

基于云计算的Java版云HIS系统源码,已在公立二甲医院应用三年

系统概述&#xff1a; 这是一套SaaS模式Java版云HIS系统源码&#xff0c;已在公立二甲医院应用三年&#xff0c;系统运行稳定、功能齐全&#xff0c;界面布局合理、操作简便。融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病历系统均拥有自主知识产…

物理机CPU使用率报警

背景知识 (background) CPU是稀缺的共享资源&#xff0c;CPU使用率过高&#xff0c;可能造成更多的上下文切换、调度延迟、CGroup CPU Throttle。 无论是物理机或容器化混合部署的应用&#xff0c;CPU做不到完全隔离&#xff0c;最多只能限制使用上限。部分进程CPU使用过多&a…

自动指出测试问题,TestGPT来袭,测试工程师,你准备好了么

测试是软件开发流程的关键部分。软件代码引起的错误在2020年给美国本土企业造成了2.08万亿的损失。鉴于如此高昂的成本&#xff0c;预防代码错误成为一件重要的事情&#xff0c;这也是测试这个工作产生的根本原因。为了防止错误&#xff0c;开发需要进行定期和彻底的测试&#…

ShowMeAI周刊 | AI独立开发者:帆船旅行但月入万刀;创业吧!新黄金时代来了;资本看好哪些创业方向;被AI震麻的一周again

这是ShowMeAI周刊的第8期。聚焦AI领域本周热点&#xff0c;及其在各圈层泛起的涟漪&#xff1b;拆解AI独立开发者的盈利案例&#xff0c;关注中美AIGC的创业者们&#xff0c;并提供我们的商业洞察。欢迎关注与订阅&#xff01; | &#x1f440;日报&周刊合辑 ⌛ 『Danielle…

线程基础知识总结

文章目录[toc]1. 认识线程&#xff08;Thread&#xff09;1.1 概念1.2 创建线程1.2.1 方法1 继承Thread类1.2.2 方法2 实现Runnable接口1.2.3 实现 Callable 接口&#xff0c;使用 FutureTask 接收线程返回值1.2.4 对比上面两种方法2. Thread类及常见方法2.1 Thread的常见构造方…

GPS时间序列分析---剔除跳跃点,拟合时间序列

通常利用GPS时间序列进行数据分析时&#xff0c;会遇到大地震的发生&#xff0c;这个时候会导致GPS的观测结果出现很大的跳跃值&#xff0c;这对后续的数据处理和分析带来了困难。这里分享一个最近了解的&#xff0c;可以用于处理这一问题的工具包---TSAnalyzer。下面主要介绍该…

基于springboot心理健康管理系统(程序+数据库+文档)014

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

位置编码Positional Encoding

位置编码Positional Encoding1.Transformers中的PE2.什么是Transformer位置编码2.1.表格型2.2.相对位置的关系-函数型3.为什么可以表示相对距离&#xff1f;4.其他参考内容全来自于网络总结。 其他参考1其他参考2 1.Transformers中的PE 摘抄自这里。 公式是初中生都看的懂, …

编程题 进制转换(Java实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Mybatis配置之别名(typeAliases)优化、设置(settings)优化、映射器(mappers)优化以及生命周期和作用域的学习和理解

文章目录一.Mybatis配置之别名优化1.1 举例说明1.2 总结二.Mybatis的设置&#xff08;settings&#xff09;优化三.Mybatis的映射器&#xff08;mappers&#xff09;四. 生命周期和作用域一.Mybatis配置之别名优化 发现Mybatis在类配置文件中&#xff0c;执行Sql语句时如下&am…

C#,码海拾贝(02)——复数Complex计算类,《C#数值计算算法编程》源代码升级改进版

一、周长发《C#数值计算算法编程》1.1图书简介 《C#数值计算算法编程》是2007年1月1日电子工业出版社出版的图书&#xff0c;由周长发编写。ISBN:9787121032035本书囊括了近90个实用经典算法&#xff0c;每一个算法都独立成节。每一节都包括算法原理、算法实现和示例3个部分。算…

初识冯诺依曼体系结构

目录 1.冯诺依曼体系结构 2.冯诺依曼体系的原理 3.数据流向 4.冯诺依曼体系的意义 1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 &#xff08;1&#xff09;输入单元&#xff1a;…

#详细介绍!!! 线程池的拒绝策略(经典面试题)

本篇单独讲解线程池的拒绝策略&#xff0c;介绍了当线程池任务满了之后&#xff0c;线程池会以什么样的方式来响应添加进来的任务 目录 一&#xff1a;理解线程池拒绝策略的触发情况代码理解 二&#xff1a;线程池的四种常见的拒绝策略 1.ThreadPoolExecutor.AbortPolicy 2…

【SpringBoot】| 邮箱发送验证码,你会了吗?

目录&#x1f981; 题外话&#x1f981; 提前准备2.1 配置邮箱第三方登录2.1.1 点击设置——账户2.1.2 开启POP3/SMTP服务2.2 添加依赖2.3 yaml配置&#x1f981; 进入主题&#x1f981; 测试使用&#x1f981; 尾声3.1 安利一个生成验证码的工具类3.1.1 添加依赖3.1.2 编写配置…

ChatGPT相关核心算法

ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…

AutoSAR COMM-通信管理器通信通道ID【ComMChannelId】的定义

总目录链接==>> AutoSAR入门和实战系列总目录 @学前问答: 怎么理解通信管理器中通道ID? 通道ID主要应用在哪些模块? 文章目录 1 通信通道ID定义2 通信通道ID的使用3 答疑解析1 通信通道ID定义 我们称通信管理器【COMM】、状态管理器【BUSSM】、网络管理器【NM,BUS…

【lwIP(第四章)】网络接口

目录一、lwIP网络接口简介二、lwIP的netif结构三、lwIP的netif相关函数1. lwIP网络接口的全局变量2. netif_add()函数3. netif_remove()函数4. netif_set_default()函数一、lwIP网络接口简介 lwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#xff0c;由于网卡…

MYSQL——美团面试题

MYSQL——美团面试题 2023/3/27 美团二面 题目描述 Create table If Not Exists courses (student varchar(255), class varchar(255));insert into courses (student, class) values (A, Math); insert into courses (student, class) values (B, English); insert into co…
最新文章