介绍

数据库的三大范式就是数据库的表应该如何设计,应该注意什么。

第一范式

要求每一张表都有一个主键,每一个字段都不可再分。

举例:

id username address
1 张三 中国,北京
2 李四 美国,洛杉矶
1 王五 日本,东京

问题:上面的这张表没有主键,因为第一条记录和第三条记录id重复,address可以再分,不是原子性。

修正如下:

id username country city
1 张三 中国 北京
2 李四 美国 洛杉矶
3 王五 日本 东京

注意:第一范式需要设计每张表时都要满足的,即要有主键,每个字段都具有原子性。

第二范式

在满足第一范式的基础上,非主键列要完全依赖于主键。有点抽象,看下面的例子。

酒店编号 房间类型编号 评价分数 房间类型
1 01 80 单人间
1 02 90 双人间
2 01 70 单人间

这张表中酒店编号和房间类型编号联合做主键,评价分数完全依赖于酒店编号和房间类型编号,可是房间类型只依赖于房间类型编号,这是部分依赖,不满足第二范式。

修正:

酒店房间类型评价分数表

酒店编号 房间类型编号 评价分数
1 01 80
1 02 90
2 01 70

房间类型表

房间类型编号 房间类型
01 单人间
02 双人间

第三范式

第三范式是建立在第二范式的基础上的,要求所有的非主键字段直接依赖主键,不要产生传递依赖。

举例:

id 入住人姓名 房间类型编号 房间类型描述
01 张三 001 单人间
02 李四 002 双人间
03 王五 001 单人间

上面这张表中房间类型描述不直接依赖于id,而是通过依赖于房间类型编号这个非主键列而依赖于主键,属于传递依赖,不符合第三范式。

(房间类型描述->房间类型编号->id)

修正:

将一张表拆分为两张表

id 入住人姓名 房间类型编号
01 张三 001
02 李四 002
03 王五 001
房间类型编号 房间类型描述
001 单人间
002 双人间

如果这篇博客写得有问题,欢迎在评论区留言。

mysql_三大范式的更多相关文章

  1. SqlServer之数据库三大范式

    分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依 ...

  2. 数据库的设计(E-R图,数据库模型图,三大范式)

    一.数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系,进行规划和结构化的过程. 二.数据库设计的重要性 如果一个数据库没有进行一个良好的设计,那么这个数据库完成之后他的缺点是 ...

  3. MySql三大范式与数据库设计和表创建常用语句

    [数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: ...

  4. MySQL(三)之SQL语句分类、基本操作、三大范式

    一.SQL语句的分类     DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select)     DDL(Data ...

  5. 【SqlServer系列】数据库三大范式

    1   概述 一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分:第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关 ...

  6. Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置

    数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...

  7. Java基础88 数据库设计的三大范式

    数据库的设计原则:建议设计的表尽量遵守三大范式 1.第一范式 要求表的每个字段必须是不可分割的独立单元 Student表:    name       -- 违反了第一范式             张 ...

  8. 2.4 Oracle之DCL的SQL语句之用户权限以及三大范式

    DCL   (Data Control Language,数据库控制语言)用于定义数据库权限 一.用户权限 1.1  建立用户以及授权: Eg :CREATE USER 用户名  IDENTIFIED ...

  9. 2017年10月21日 数据库基础&三大范式

    1. 数据库里面常用 int        整型nvarchar   字符串float       小数型decimal(,) 小数型money      小数型datetime   时间类型 ima ...

  10. 新人浅谈__(数据库的设计__数据库模型图,数据库E-R图,三大范式)

    >>>>  为什么需要规范的数据库设计 在实际的项目开发中,如果系统的数据存储量较大,设计的表比较多,表和表之间的关系比较复杂,就需要首先考虑规范的数据库设计,然后进行创建库, ...

随机推荐

  1. C++中va_list, va_start, va_arg, va_end的基本用法

    关于va_list, va_start, va_arg, va_end 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这 ...

  2. 迁移学习《Asymmetric Tri-training for Unsupervised Domain Adaptation》

    论文信息 论文标题:Asymmetric Tri-training for Unsupervised Domain Adaptation论文作者:Kuniaki Saito, Y. Ushiku, T ...

  3. windows通过修改注册表来修改暂停更新时间

    但通过修改注册表,我们可以将这个天数修改成自己期望的,比如10年. 在小娜或者运行中输入 regedit 打开注册表编辑器,展开至 HKEY_LOCAL_MACHINE\SOFTWARE\Micros ...

  4. it必给装机小软件附源码

    需要的包 启动之后是这个样子的 远吗如下: #authon fengimport zipfile as zfimport osimport win32apiimport win32conimport ...

  5. C# System.ObjectDisposedException: Cannot access a disposed object, A common cause of thiserror is disposing a context that was resolved from dependency injection and then later trying touse...

    项目中使用了依赖注入,这个错误在我项目中的原因:在async修饰的异步方法中,调用执行数据库操作的方法时,没有使用await关键字调用,因为没有等待该调用,所以在调用完成之前将继续执行该方法.因此,已 ...

  6. 解决svn本身上传没有权限和配置自动更新的钩子

    第一步 :建立你的web程序目录和版本库目录 mkdir /data/webwww/project1 svnadmin create /data/svnwww/project1 进入/data/web ...

  7. Yii2批量插入数据

    方法一 yii2一次插入多行数据  /** * @inheritdoc 批量添加 * @params $add array 添加数据 */ public function add_all($add) ...

  8. 分享一个开源的windows安卓投屏工具,scrcpy

    看到scrcpy可能很多人会以为是大名鼎鼎的Scrcpy(一个十分强大的多线路爬虫框架),sorry今天分享的主角不是他,而是他: github地址:https://github.com/Genymo ...

  9. 在void 中使用return的意思

    在定义的void函数里如果想要提前终止函数 格式为 return; 如果 在有返回值的函数中 格式为: return+值(0 -1 ......) 但如果在void 函数中写return 0 ; 则会 ...

  10. JavaScript基础语法-变量

    JavaScript JavaScript - 变量 1. 概念 变量是用于存放数据的容器 通过变量名可以获取数据 并且数据是可修改的 2. 使用 声明变量 只声明不赋值 直接调用 程序会输出unde ...