【MYSQL】 三大范式 表的关系 外键 ER图

2023-05-16

三大范式

  • 第一范式(每列保持原子性)

每一列属性都是不可再分的属性值,确保每一列的原子性

两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据

  • 第二范式(属性完全依赖于主键)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

通俗点说就一张表只干一件事,每一列都要和主键有关

例如:创建一个信息表

CREATE TABLE message(
	student_id INT,
  student_name VARCHAR(20),
  age INT,
  course_id INT,
  score INTPRIMARY KEY (student_number,course_id)
);

在这个表中 student_name, age 只依赖于student_id,score(学分) 只依赖于 score_id,所以说 student_namescore(学分)是没有关系的,这就不满足第二范式

下面将表进行拆分

CREATE TABLE message(
  id INT PRIMARY KEY
	student_id INT,
  course_id INT
);
CREATE TABLE student(
	student_id INT PRIMARY KEY,
  student_name VARCHAR(20),
  age INT
);
CREATE TABLE class(
  course_id INT PRIMARY KEY,
  score INT
);

拆分之后,message 表中的 student_id course_id 完全依赖于 id 主键,而 studentclass 表中的其他字段又完全依赖于主键。

  • 第三范式(属性不依赖于其它非主属性,属性直接依赖于主键)

数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。

例如:

学号姓名年龄学院名称学院电话
001张三18理工123
002李四17建工456
003王五19人文789

从上表可知,所有属性都完全依赖于学号,所以满足2NF。但是 学院电话 是直接依赖 学院名称 ,而不是 学号 。所以调整如下:

学生表

学号姓名年龄
001张三18
002李四17
003王五19

学院表

学院名称学院电话
理工123
建工456
人文789

主键、外键

主键: 主键是表的一个特殊字段,可以唯一地标识表中的每条信息。

**外键:**如果一个实体的某个字段指向另一个实体的主键,就称为外键。如果表B的一个字段(外键)依赖于表A的主键。则称表A为父表,表B为子表。

原则:外键必须依赖于数据库中已经存在的父表的主键,外键可以为空

作用:建立该表与父表的关联关系

增加子表记录时,先查询是否有与之对应的父表记录,如果主表没有相关的记录,从表不能插入

使用外键,当父表有删除和更新操作时,从表有以下数据处理方式:

以删除时的影响为例

  1. NO ACTION = RESTRICT(限制),表示不允许删除,只有子表中的数据删除后才能删除父表中的数据。
  2. CASCADE(级联),删除父表中的数据后,将关联的子表数据也删除。
  3. SET NULL(表示设置为空),父表中的数据删除后,将子表中关联的字段设置为空。

现在我们开发更多人偏向不使用外键,理由是:

  1. 程序逻辑:某些程序逻辑中,程序的逻辑已经足够保证完整性,我会在存储过程或包等地方做严谨的判断
  2. 性能问题:比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很长。并且这个操作可以在代码逻辑里进行控制,通过外键再判断一次,就是降低性能。并且有些地方判不判断也无所谓的,但是用了外键,就必须花时间去判断
  3. 维护麻烦

表的关系

  • 一对一(1:1)

比如:一个人只能有一个身份证号码,一个身份证号码只能属于一个人

实现方式

可以在任意一方添加唯一外键指向另一方的主键。

  • 一对多(1:N)

比如:一个班级有多个学生

实现方式:

在从表(N对应的表)创建一个字段作为外键,指向主表(1对应的表)的主键

  • 多对多(M:N)

例如:一个课程可以被多个学生选择,一个学生可以选择多个课程

实现方式:

三个表。一个定义第一个实体,一个定义第二个实体,第三个表示它们之间的关系


ER图

实体:矩形

属性(实体的属性):椭圆形

关系(两个实体之间的关系):菱形

如图:

img

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【MYSQL】 三大范式 表的关系 外键 ER图 的相关文章

  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • MySQL SELECT 输出同一行中每个 id 的下一个日期

    我查询的表结构如下 ID Date Before value After value 1 2014 04 25 Win Loss 1 2014 04 30 Loss Win 1 2014 08 18 Win Loss 1 2014 08 2
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W

随机推荐

  • EGO Planner代码解析----CMakeLists.txt和package.xml

    ROS本质上就是由一个又一个的package组成的 xff0c package可以说是ROS的细胞 在catkin make的时候它会一个一个的去找package然后生成目标文件 一个package可以有多个节点 判断是否为Package
  • EGO Planner代码解析bspline_optimizer部分(3)

    1 int BsplineOptimizer earlyExit void func data const double x const double g const double fx const double xnorm const d
  • EGO Swarm翻译

    目录 摘要 介绍 相关工作 A 单四旋翼局部规划 B 拓扑规划 C 分布式无人机集群 基于梯度的局部规划隐式拓扑轨迹生成 A 无需ESDF梯度的局部路径规划 B 隐式拓扑轨迹生成 无人机集群导航 A 机间避碰 B 定位漂移补偿 C 从深度图
  • 嵌入式刷题训练1——牛客网

    嵌入式软件工程师面试常考题 文章目录 Q1 xff1a extern关键字的作用是什么 xff1f Q2 xff1a 关于virtual void Draw 61 0 xff0c 下面说法正确的有几个 xff1f Q3 xff1a 对于类的
  • Ubuntu桌面卡死解决办法

    Ubuntu桌面卡死解决办法 我采用这种方式圆满解决 同时按住 Ctrl 和 Alt 键 xff0c 按住不要放
  • sonic 编译

    本文是转载 xff0c sonic 编译 sonic编译过程讲解 xff0c 点击这里
  • arduino总线舵机+实时串口通信控制

    arduino语法 digitalWrite 函数 digitalWrite pin value 定义引脚的电平 pin xff1a 你希望设置模式的引脚的编号 0 xff5e 13 value xff1a 表示为HIGH 高电平 或LOW
  • GNURadio3.9.4创建OOT模块实例

    目录 1 创建自己的block xff08 注意 module 与 block 的区别 xff09 1 1 创建 module 1 2 在创建的 myDemux 中创建 block 2 修改相应的代码 2 1 修改 C 43 43 代码 2
  • LibreOffice具体用法

    1 在命令行执行libreoffice version xff0c 检查是否已经安装LibreOffice span class token comment Linux 下的安装方法 span span class token commen
  • 《1.9.ARM裸机第九部分-定时器、看门狗和RTC》

    第一部分 章节目录 1 9 1 什么是定时器 1 9 2 S5PV210中的定时器 1 9 3 S5PV210的PWM定时器1 1 9 4 S5PV210的PWM定时器2 1 9 5 S5PV210的PWM定时器3 1 9 6 蜂鸣器和PW
  • 云计算概述(5个基本特征、4种部署模型、3种服务类型)

    文章目录 一 IT系统组成二 云计算概述三 云计算的 5 个基本特征四 云计算的 4 种部署模型 xff08 一 xff09 私有云 xff08 二 xff09 社区云 xff08 三 xff09 公共云 xff08 四 xff09 混合云
  • keil安装、注册及pack包安装

    keil安装 注册及pack包安装 一 keil安装包下载二 keil安装三 keil注册四 安装pack包方法一 xff1a keil中直接更新方法二 xff1a 官网下载pack包 前言 xff1a 刚开始接触keil时 xff0c 找
  • Ubuntu18.04下安装opencv3.4.3的完整攻略

    之前写过一篇在Ubuntu18 04下安装opencv4 5的攻略 xff0c 具体是参考了官方的一些文档 xff0c 但是opencv中的很多应用在后来进行了删减 xff0c 如果想要使用opencv训练xml文件 xff0c 需要用到其
  • mysql8远程连接报错1251异常详细(保姆级教程)

    环境centos7 43 mysql8 本地navicat破解版 这种情况下考虑还是因为mysql的版本问题 xff0c 在mysql5的时候mysql使用的是mysql native password加密协议 xff0c 在mysql8之
  • Jave操作Hbase——建立学生信息管理系统

    上文对hbase的建表 对数据的插入 查询 删除进行封装 62条消息 Hbase学习 对表操作进行封装 小镭敲代码的博客 CSDN博客 本文调用封装好的方法 xff0c 建立学生信息管理系统 xff0c 实现 1 注册学生信息 2 查看学生
  • 在Hbase使用过滤器(行键过滤器、列族与列过滤器、值过滤器)

    本文介绍Hbase中的过滤器 xff1a 1 行键过滤器 2 列族与列过滤器 3 值过滤器 4 其他过滤器 格式如下 xff1a scan 39 表名 39 FILTER 61 gt 过滤器 比较运算符 39 比较器 39 34 一 行键过
  • 无人机学习

    无人机飞行原理及控制方法 xff08 以四旋翼无人机为例 xff09 四旋翼无人机一般是由检测模块 xff0c 控制模块 xff0c 执行模块以及供电模块组成 检测模块实现对当前姿态进行量测 xff1b 执行模块则是对当前姿态进行解算 xf
  • 安装完torch geometric,import torch_geometric然后报错:OSError: [WinError 127] 找不到指定的模块

    1 出错原因 xff1a 对于import torch geometric xff0c 然后报错 xff1a OSError WinError 127 找不到指定的模块 我出错的原因是 xff1a pytorch的版本我用的是1 4 xff
  • Word中设置不同页面的页眉不一样的方法(页脚、页码同理)

    目录 1 不同部分页眉的修改 2 如何删除页眉中的横线 1 不同部分页眉的修改 在Word中设置也没的时候默认每页都是一样的 xff0c 如果我们想要不同部分的页眉内容不一样 xff0c 则需要在不同的部分之间加入分节 符 xff0c 注意
  • 【MYSQL】 三大范式 表的关系 外键 ER图

    三大范式 第一范式 xff08 每列保持原子性 xff09 每一列属性都是不可再分的属性值 xff0c 确保每一列的原子性 两列的属性相近或相似或一样 xff0c 尽量合并属性一样的列 xff0c 确保不产生冗余数据 第二范式 xff08