首页 数据库 mysql教程 规范化过程主要为克服数据库逻辑结构中的什么?

规范化过程主要为克服数据库逻辑结构中的什么?

Aug 28, 2020 pm 01:49 PM
数据库

规范化过程主要为克服数据库逻辑结构中的插入异常、删除异常以及冗余度大的缺陷。数据库规范化能够让数据库设计者更好地了解组织内部当前的数据结构,最终得到一系列的数据实体。数据库规范化通过对数据库表的设计,可以有效降低数据库冗余程度。

规范化过程主要为克服数据库逻辑结构中的什么?

数据库规范化过程

关系数据库的规范化说的通俗一些就是对表的规范化。

规范化的必要性:

根据项目的需求,我们会创建相应的数据库表格来完成项目中的数据的存储。这已经成为做项目的固定流程了,但是在真正的开始处理业务需求的时候,就会意识到自己的表格设置的不合理,导致数据的重复存储,插入异常,删除异常,更新异常等问题,这时就需要来重新的规划表格,既浪费时间,又消耗人力财力,十分不划算,因此规范化是十分有必要的,所以今天就在这里教给大家规范表的方法。

在教规范化数据库方法之前,先给大家介绍知识:

关键知识点函数依赖

定义可能有些难以理解,我在这里简单的解释一下:函数依赖描述的是两个集合之间的一种映射关系,这种映射关系与函数是一样的,例如 y = x^2,在这里对于x来说,一个x就对应一个y值,但是不存在,一个x对应多种y值的情况,所以就可以说y函数依赖于x,然而对于y来说,存在一个y值对应多个x值的情况,所以说x并不函数依赖于y。这就是函数依赖。

接下来我们介绍几种特殊的函数依赖:

完全函数依赖

定义:

如果X->Y,并且对于任意一个X的真子集X’都不存在,X’->Y,那么我们就说 X->Y这种函数依赖属于完全函数依赖。

简单的解释一下: 函数z = x + y,对于z来说:z函数依赖于x和y,但是z并不单独依赖于x或单独依赖于y,这就说明z函数依赖于x和y的这种依赖就是完全函数依赖。

部分函数依赖:

定义:

如果X->Y,但是Y不完全依赖于X,则称这种依赖为部分完全依赖。 也就是说:函数z = x + 0y 是可以看成 ,也就是说z函数依赖于x和y,但是z又单独依赖于x,那么这就是部分函数依赖。

传递函数依赖:

定义:

如果X->Y, Y -> Z ,并且不成立,Y->X也不成立。则称Z传递函数依赖于X。

这个比较简单,函数组z = x^2, x = 2y可以化简为z = 4y ^2,很容易看出:z是函数依赖于x,x依赖于y,并且z->x不成立,这就是传递函数依赖。

关键知识点之二-----键

候选键:一个属性(字段)或一个属性组(多个字段)能够完全决定于关系模式(表)中的其他属性(字段)。也就是说其他属性(字段)完全依赖于该属性(字段)或属性组(多个字段)。

主键:如果候选键多于一个,则选择其中一个作为主键。被选做主键的属性或属性组在该关系模式(表)中的每一个元祖(行)中的值是不允许重复和取值为null的。

主属性:报完在任何一个候选键中的属性,称为主属性。如果候选键是由多个属性共同组成的,那么这些属性组中每一个属性都是主属性。

非主属性:不包含在任何键中的属性称为非主属性。

外键:某属性或属性组在当前关系模式(表)中不是主键,但是另一个关系模式(表)中充当主键的身份,则称该属性或属性组为外键。

在介绍完了上述的基本知识点之后,我们来开始学习数据库表的规范过程:

想要规范表,就首先需要一个标准,来衡量表是否已经规范。这个标准就是----范式。

范式一共有六种:第一范式(1NF),第二范式(2NF),第三范式(3NF),BC范式(BCNF),第四范式(4NF),第五范式(5NF)。

在上面六中范式中,在一般的情况下我们需要将表规范到BCNF就已经十分完美了,在真正的项目中其实只需要达到3NF就足够了。

接下来重点介绍前4中范式:

第一范式:关系模式R中的所有属性都是不可分的数据项。

简单来说就是只要你能把表建出来,这个表就已经满足了第一范式了。例如student表(student_id, course_id,  student_name, age, sex, grade, sdept, sdept_director),在这个表中很明显grade这一项是受student_id, course_id,共同决定的,所以应该让这两项联合做为主键。

第二范式:在满足第一范式的基础上,满足非主属性都完全依赖于R的主键。

这就需要用到前面讲的内容了,要判断非主属性是否完全依赖于主键。如果不满足就重 更改表的结构。例如student表(student_id, course_id, student_name, age, sex, grade, sdept_id, sdept_director)因为student_id, course_id两项联合做为主键,但是对于其他的字段name, age, sex这些 属性来说,它们是完全依 赖于student_id这一属性的,所以它们对于student_id, course_id共同作为主键是部分 依赖的。这就不满足第二范式的定义了,所以应该把 grade拿出来,将这一个大表拆成 两份小表:student(student_id, name, age, sex, sdept_id, sdept_director), student_score(student_id, course_id, grade);

第三范式:在满足第二范式的情况下去除传递依赖。

例如:student表(student_id, student_name, age, sex, sdept, sdept_director),很明显每一个专业决定一个专业主任,所以sdept_director传递依赖于student_id,所以应该再拆分一个表student(student_id, student_name, age, sex)和sdept(sdept_id, sdept_name, sdept_director),这样就满足了第三范式。

BC范式:在满足第三范式的情况下,再满足一下三点:

1、所有的主属性完全依赖于其他不包含自己的候选键;
2、所有的非主属性完全依赖于每一个候选键;
3、没有任何属性完全函数依赖于任何一组非主属性。

之前的三个范式都是对非主属性进行各种约束,BC范式是在他们基础上,再对主属性进行约束,解决了主属性之间的部分依赖的问题,以及不存在主属性完全依赖于非主属性的问题。 我们的student表 student(student_id, student_name, age, sex),主键是student_id,所以主属性是student_id,很显然前两条都已经满足,因为学生的姓名可能重复,所以student_id与student_name之间没有函数依赖关系,所以student表满足BC范式。

以上就是数据库的规范化过程

相关推荐:《mysql教程

以上是规范化过程主要为克服数据库逻辑结构中的什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言如何实现数据库的增删改查操作? Go语言如何实现数据库的增删改查操作? Mar 27, 2024 pm 09:39 PM

Go语言是一种高效、简洁且易于学习的编程语言,因其在并发编程和网络编程方面的优势而备受开发者青睐。在实际开发中,数据库操作是不可或缺的一部分,本文将介绍如何使用Go语言实现数据库的增删改查操作。在Go语言中,我们通常使用第三方库来操作数据库,比如常用的sql包、gorm等。这里以sql包为例介绍如何实现数据库的增删改查操作。假设我们使用的是MySQL数据库。

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate多态映射可映射继承类到数据库,提供以下映射类型:joined-subclass:为子类创建单独表,包含父类所有列。table-per-class:为子类创建单独表,仅包含子类特有列。union-subclass:类似joined-subclass,但父类表联合所有子类列。

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

如何在PHP中处理数据库连接错误 如何在PHP中处理数据库连接错误 Jun 05, 2024 pm 02:16 PM

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

深入解析HTML如何读取数据库 深入解析HTML如何读取数据库 Apr 09, 2024 pm 12:36 PM

HTML无法直接读取数据库,但可以通过JavaScript和AJAX实现。其步骤包括建立数据库连接、发送查询、处理响应和更新页面。本文提供了利用JavaScript、AJAX和PHP来从MySQL数据库读取数据的实战示例,展示了如何在HTML页面中动态显示查询结果。该示例使用XMLHttpRequest建立数据库连接,发送查询并处理响应,从而将数据填充到页面元素中,实现了HTML读取数据库的功能。

PHP处理数据库中文乱码的技巧与实践 PHP处理数据库中文乱码的技巧与实践 Mar 27, 2024 pm 05:21 PM

PHP是一种广泛应用于网站开发的后端编程语言,它具有强大的数据库操作功能,常用于与MySQL等数据库进行交互。然而,由于中文字符编码的复杂性,在处理数据库中文乱码时常常会出现问题。本文将介绍PHP处理数据库中文乱码的技巧与实践,包括常见的乱码原因、解决方法和具体的代码示例。常见的乱码原因数据库字符集设置不正确:数据库在创建时需选择正确的字符集,如utf8或u

如何用 Golang 连接远程数据库? 如何用 Golang 连接远程数据库? Jun 01, 2024 pm 08:31 PM

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。

See all articles