- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL之范式的使用详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、范式 。
范式的英文名称是Normal Form,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF).
第一范式(1NF) 。
第一范式其实是关系型数据库的基础,即任何关系型数据库都是符合第一范式的。简单的将第一范式就是每一行的各个数据都是不可分割的,同一列中不能有多个值,如果出现重复的属性就需要定义一个新的尸实体。 下面数据库便不符合第一范式:
1
2
3
4
5
6
|
+
------------+-------------------+
| workername | company |
+
------------+-------------------+
| John | ByteDance,Tencent |
| Mike | Tencent |
+
------------+-------------------+
|
上面描述的数据所表达的意思是,Mike在Tencent工作,而John同时在ByteDance和Tencent工作(假设这是可能的)。但是这种表达方式并不符合第一范式,即列的数据必须是不可分的,要满足第一范式,必须是下面的这种形式:
1
2
3
4
5
6
7
|
+
------------+-----------+
| workername | company |
+
------------+-----------+
| Mike | Tencent |
| John | ByteDance |
| John | Tencent |
+
------------+-----------+
|
第二范式(2NF) 。
首先,一个数据库要满足第二范式必须要先满足第一范式。 我们先看一个表格:
1
2
3
4
5
6
7
8
|
+
----------+-------------+-------+
| employee | department | head |
+
----------+-------------+-------+
| Jones | Accountint | Jones |
| Smith | Engineering | Smith |
| Brown | Accounting | Jones |
| Green | Engineering | Smith |
+
----------+-------------+-------+
|
这个表描述了被雇佣者,工作部门和领导的关系。这个表所表示的关系在现实生活中是完全可能存在的,现在让我们考虑一个问题,如果Brown接任Accounting部门的领导,我们需要怎样对表进行修改?这个问题将会变得非常麻烦,因为我们会发现数据都耦合在一起了,你很难找到一个很好的能唯一确定每一行的判断条件来执行你的UPDATE语句。而我们把能够唯一表示数据库中表的一行的数据成为这个表的主键。 因此,没有主键的表是不符合第二范式的,也就是说符合第二范式的表需要规定主键.
因此我们为了使上面的表符合第二范式,需要将它拆分为两个表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
+
----------+-------------+
| employee | department |
+
----------+-------------+
| Brown | Accounting |
| Green | Engineering |
| Jones | Accounting |
| Smith | Engineering |
+
----------+-------------+
+
-------------+-------+
| department | head |
+
-------------+-------+
| Accounting | Jones |
| Engineering | Smith |
+
-------------+-------+
|
在这两个表中,第一个表的主键为employee,第二个表的主键为department。在这种情况下,完成上面的问题就显得非常简单了.
第三范式(3NF) 。
一个关系型数据库要满足第三范式必须要先满足第二范式。 将第三范式前,我们同样先看两个表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
+
-----------+-------------+---------+-------+
| studentid | studentname | subject | score |
+
-----------+-------------+---------+-------+
| 1 | Mike | Math | 96 |
| 2 | John | Chinese | 85 |
| 3 | Kate | History | 100 |
+
-----------+-------------+---------+-------+
+
-----------+-----------+-------+
| subjectid | studentid | score |
+
-----------+-----------+-------+
| 101 | 1 | 96 |
| 111 | 3 | 100 |
| 201 | 2 | 85 |
+
-----------+-----------+-------+
|
上面的两个表格的主键分别为studentid和subjectid,很显然两个表都符合第二范式.
但是我们会发现这两个表有重复冗余的数据score。因此第三范式就是要消除冗余的数据,具体到上面的情况,就是两个表只有一个能够存在score这一列数据。那么怎么将这两个表联系起来呢,这里就出现了外键。如果两个表中有冗余重复的列,而且这个表中的一个非主键列在另一个表中是主键,那么我们为了消除冗余列可以把这个非主键列作为联系两个表的桥梁,也就是外键。 通过观察可以发现,studentid在第一个表中是主键,在第二个表中是非主键,所以他就是第二个表的外键。因此上述情况我们有了以下符合第三范式的写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
+
-----------+-------------+---------+
| studentid | studentname | subject |
+
-----------+-------------+---------+
| 1 | Mike | Math |
| 2 | John | Chinese |
| 3 | Kate | History |
+
-----------+-------------+---------+
+
-----------+-----------+-------+
| subjectid | studentid | score |
+
-----------+-----------+-------+
| 101 | 1 | 96 |
| 111 | 3 | 100 |
| 201 | 2 | 85 |
+
-----------+-----------+-------+
|
可以发现在设定了外键之后,第一个表即使删除了score列,也可以通过studentid在第二个表中查找到相应的score的值,这样即消除了数据的冗余,又不会影响查找,满足第三范式.
2、范式的优点和缺点 。
范式的优点 。
范式的缺点 。
到此这篇关于MySQL之范式的使用详解的文章就介绍到这了,更多相关MySQL 范式 内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://segmentfault.com/a/1190000037544475 。
最后此篇关于MySQL之范式的使用详解的文章就讲到这里了,如果你想了解更多关于MySQL之范式的使用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想知道使用 C# 自定义属性和 AOP 框架(如 PostSharp)之间的区别。 如何在它们之间进行选择? 最佳答案 自定义属性是在代码元素上声明元数据的方法,这些元素可以被系统的其他元素理解,包
我正在阅读各种中间形式,但除了类似 wiki 的条目之外,我无法获得有关 A-normal 形式的信息。这里有人知道这件事或有关于它的好资源吗? 最佳答案 见 Administrative norma
使用 RESTful 服务,您可以创建、读取、更新和删除资源。当您处理数据库 Assets 之类的东西时,这一切都很有效 - 但这如何转换为流数据呢? (或者确实如此?)例如,就视频而言,将每一帧视为
我有大约 25 个 Activity ,现在我需要编写一个在大约 3 到 5 个 Activity 中相同的函数,现在我可以使用这些 OOP 范例中的任何一个吗? 静态方法 单例类(应用程序类) 父类
我最近遇到了这个类,并对 getters 和 setter 已实现。 我以前没有遇到过这种情况,欢迎提出第二点意见。 您认为这是一个好的范例吗?不好吗?是邪恶的吗? 标题: class Too
我在多重继承菱形方案下组织了 4 个类。 BASE / \ / \ Deriv1 Deriv2
使用 RESTful 服务,您可以创建、读取、更新和删除资源。当您处理数据库 Assets 之类的东西时,这一切都很有效 - 但这如何转换为流数据呢? (或者确实如此?)例如,就视频而言,将每一帧视为
SQL 数据库中有两个函数依赖关系。 a) 部分函数依赖:非键列依赖于复合主键中的一些列,但不是所有列。 b) 传递函数依赖:任何非键列依赖于其他非键列。 对于一个好的 SQL 数据库。 规则 1:列
现在,我正在使用 PHP/Laravel 进行编程,但我认为这可能适用于任何其他 MVC 框架。我将使用 PHP/Laravel 语法。 我有一个需要非常基本的审计跟踪的应用程序。数据库中的审计表(a
我阅读了以下示例,该关系 A(X,Y,Z,P,Q,R) 具有以下函数依赖性。 为什么这是在 1NF 中? 谁能帮帮我? 最佳答案 该图不是正常符号。我想箭头指向 FD 的确定属性。我假设不是来自盒子的
1 概述 一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分;第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关
我正在开发一个流规则引擎,我的一些客户有几百条规则,他们想对到达系统的每个事件进行评估。规则是纯(即无副作用) bool 表达式,它们可以任意深度嵌套。 客户在运行时创建、更新和删除规则,我需要动态检
Rails 使用 MVC 范式。模型、 View 和 Controller 很有趣,实际上只有 Controller 才有“应用程序”或父 Controller 。实际上,rails 中有一个 app
该文件如下所示。我需要读取它们并将它们存储在数据结构中(可能是邻接表)。但我不知道如何忽略无用的注释并在 'p cnf' 之后开始阅读。 c This Formula is generated by
这可能是重复的,因为我无法在脑海中找到单词来激发查询。 我每天都在使用 PHP、C#、JavaScript,但只有在 JavaScript 中我才能像疯子一样开箱即用。 例如,给定一个简单的(我知道它
谁能向我解释 NSAttributedString 如何正确遵循 MVC 范式?我知道它不是从 NSString 继承的,但它仍然是一个字符串,所以我会说这是我模型的一部分。但是,在谈论 MVC 时,
我正在努力加深对副作用以及应如何控制和应用它们的理解。 在下面的航类列表中,我想为每个满足条件的航类设置一个属性: IEnumerable fResults = getResultsFromProvi
这是我一直怀疑的事情。考虑以下代码段。 class A(object): def check(self): super(A, self).check() pri
在关系型数据库设计中,例如有schema S(banker, bname, customer)和function dependencies (FDs) 银行家->名字customer,bname->银
我已经对设计模式进行了一段时间的思考,现在我才刚刚开始了解如何将其中一些更慎重地融入到我的开发工作中。然而,我仍然对他们在本书开头对 MVC 的处理以及它与本书其余部分的关系感到困惑。 我使用过的大多
我是一名优秀的程序员,十分优秀!