精华内容
下载资源
问答
  • 数据库规范化

    千次阅读 2017-03-21 14:31:24
    数据库规范化能够让数据库设计者更好地了解组织内部当前的数据结构,最终得到一系列的数据实体。数据库规范化通过对数据库表的设计,可以有效降低数据库冗余程度。 在进行数据库规范化的时候,我们有一系列的步骤...

    规范化(Normalization)是数据库系统设计中非常重要的一个技术。数据库规范化能够让数据库设计者更好地了解组织内部当前的数据结构,最终得到一系列的数据实体。数据库规范化通过对数据库表的设计,可以有效降低数据库冗余程度。   

    在进行数据库规范化的时候,我们有一系列的步骤需要遵循。我们把这些步骤称作范式,即Normalisation Form(NF),其中包括第一范式、第二范式、第三范式、第四范式以及第五范式(1NF、2NF、3NF、4NF、5NF)。

    通常情况下,我们通过第三范式就能够满足大部分的数据库表的规范化,但也有些时候,我们需要更高的NF。

    以下就是进行数据库规范化时的步骤:   

    第一步:首先我们将数据源转化成未规范化范式(UNF)   

    第二步:将未规范化的数据转化为第一范式(1NF)   

    第三步:将1NF转化为2NF   

    第四步:将2NF转化为3NF   

    在完成3NF之后,如果数据源仍然处于未规范化状态,那么我们还需要进行以下几步:   

    第五步:将3NF转化为BC范式(Boyce-Code Normal Form,BCNF)   

    第六步:将BCNF转化为4NF   

    第七步:将4NF转化为5NF

    展开全文
  • 什么是数据库规范化 维基百科的定义如下: 数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。 数据库范式是埃德加·科德设计...

    什么是数据库规范化

    维基百科的定义如下:

    数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性

    数据库范式是埃德加·科德设计出来的。在1970年代初,他定义了第一范式(First normal form)第二范式(Second normal form),和**第三范式(Third normal form)**的概念。数据库范式可以理解成一系列的规范或者规则,为了实现数据库规范化的目标,我们需要按照这些范式的规则来优化数据库。

    关于这些范式的规则我会在文章后续部分说明。

    现在数据库设计最多满足第三范式,普遍认为范式过高,虽然具有对数据关系更好的约束性,但也导致数据关系表增加而令数据库IO更易繁忙,原来交由数据库处理的关系约束现更多在数据库使用程序中完成。

    因此,本文数据库的优化实例只做到第三范式。

    术语

    为了更准确,简洁地定义各个范式的规则,我们需要知道一些术语的含义。对于有些术语来说,我不打算写出它标准化的定义,这是因为标准化定义十分晦涩。对于这样的术语,俺直接给出相应的例子,理解它代表的是什么东西就行。

    • 关系(relation):数据库中的「表」
    • 元组(tuple):数据库表中的「行」
    • 属性(attribute ):数据库表中的「列」
    • 超键(superkey):数据库关系中能够唯一标示元组(即,行)的属性集合。超键例子
    • 候选键(candidate key):不含有多余属性的超键。也就是说,这个超键属性集合的任何一个真子集(proper subset),都不能唯一标示元组。候选键有时也被称为主键(primary key)。一个表中的候选键可能不唯一
    • 主属性(prime attributes):候选键中包含的属性
    • 非主属性(non-prime attribute):任何一个候选键都没有包含的属性

    下面俺给出一个关于上面部分术语的例子。这个例子来源于 yangyang17

    假如有以下学生和教师两个表:

    Student(student_no, student_name, student_age, student_sex, student_credit, teacher_no)

    Teacher(teacher_no, teacher_name, teacher_salary)

    超键:Student表中可根据学生编号(student_no),或身份证号(student_credit),或(学生编号,姓名)(student_no,student_name),或(学生编号,身份证号)(student_no,student_credit)等来唯一确定是哪一个学生,因此这些组合都可以作为此表的超键

    候选键:候选键属于超键,且是最小的超键,即如果去掉超键组合中任意一个属性就不再是超键了。Student表中候选键为学生编号(student_no),身份证号(student_credit)

    主键:主键是候选键中的一个,可人为决定,通常会选择编号来作为表的主键。

    数据库的3个范式介绍

    在这个小节,俺会用具体的例子来说明每个范式所包含的规则。

    第一范式

    第一范式的定义:

    First normal form (1NF) is a property of a relation in a relational database. A relation is in first normal form if and only if the domain of each attribute contains only atomic (indivisible) values, and the value of each attribute contains only a single value from that domain.

    第一范式必须符合下面3个标准:

    1. Eliminate repeating groups in individual tables
    2. Create a separate table for each set of related data
    3. Identify each set of related data with a primary key

    下表是一个不符合第一范式的 例子Telephone Number 列并不是原子的,它可以继续拆分下去。

    第一范式

    解决上面问题的一个直观方法是多引入一列,如下图所示。但是,这种方法仍然有3个问题。第一、下表仍然包含 “repeating group”,即包含概念上相似的属性,电话号。第二、这样做会引入没有意义的顺序。比如,为什么 555-861-2025 放到 Telephone Number1 列,而不是放到 Telephone Number2 列呢?第三、当一个客户再多一个号码时,会修改表结构,增加一列。

    第一范式

    下面的表结构可以解决上面的问题。由于第一范式要求能唯一地标识出一个元组,而现在 Customer ID 重复了,所以我们需要 Telephone Number 与 Customer ID 的组合才能标识出一个元组。

    第一范式

    另一种设计方案如下所示,它是使用两张表。

    第一范式

    第二范式

    第二范式必须满足下面2个条件:

    1. be in first normal form (1NF)
    2. not have any non-prime attribute that is dependent on any proper subset of any candidate key of the relation

    第2个条件翻译过来的含义为:任何一个非主属性不能依赖于候选键属性集合的真子集属性。

    下表的每个值都是单一值,所以它符合第一正规化。但它不符合第二范式。这是因为,一个元件 ID 和供应商 ID 合在一起组成一个主键,但供应商的名称和住址却只和供应商 ID 有关(部分依赖)。

    第二范式

    把上表的结构改成下面的结构,就符合第二范式了。

    第二范式

    第三范式

    第三范式必须满足下面2个条件:

    1. 符合第二范式
    2. all the attributes in a table are determined only by the candidate keys of that relation and not by any non-prime attributes

    也就是说,符合第三范式的表结构不应该包含 transitive dependency. 即,非主属性之间不能有依赖关系。比如下表的结构就包含 transitive dependency,因为非主属性 Author 决定了另一个非主属性 Author Nationality.

    第三范式

    根据数据库范式优化数据库结构

    在这个小节中,俺会给出一个数据库表的初始结构,它不符合数据库范式。我会一步一步地改进它,直到让它满足数据库的第三范式。下表是一个不符合范式的初始结构:

    数据库范式

    满足第一范式

    初始表中的 Subject 列并不是原子的,一种方式是将其拆分成3个列。如下所示:

    第一范式

    如果用上面的方式,当某本书增加一个 subject 时,就需要更改表结构,增加一列。因此,用下面的方式修改表,使其符合第一范式会更好一些。

    第二范式

    拆分成上面的结构以后,我们需要把 Subject 表与 Book 表连接起来。由于一本书可能对应多个 subject,而一个 subject 也可能对就多本书,这是一个典型的 多对多 关系。因此我们需要新建一张关联表:

    第二范式

    满足第二范式

    从下表可以看出,{Book} 和 {Book Type} 是一个候选键。但是,只有一个 price 属性是由这2个主属性共同影响的(这是合理的,因为同样一本书,电子版与精装的价格肯定是不同的)。其它的属性都是只由 Book 这个主属性影响的。因此,这不符合第二范式。

    第二范式

    按照下面的方式修改以后,就符合第二范式了。

    第二范式

    满足第三范式

    由于下表中的非主属性 Genre ID 决定了另一个非主属性 Genre Name,即存在 transitive dependency,所以它并不符合第三范式。

    第三范式

    改成下面的结构以后,就符合第三范式了。至此,我们从一个不符合任何范式的初始表结构,一步一步地改成了现在这个结构。
    第三范式

    参考链接

    数据库规范化

    Database normalization

    第二范式

    展开全文
  • 数据库规范化-范式

    千次阅读 2015-05-21 14:40:09
    数据库规范化-范式

    数据库规范化-范式
    范式定义
    第二范式
    第三范式
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • 数据库规范化过程

    千次阅读 2019-08-25 13:41:37
    数据库规范化过程 关系数据库的规范化说的通俗一些就是对表的规范化。 规范化的必要性: 根据项目的需求,我们会创建相应的数据库表格来完成项目中的数据的存储。这已经成为做项目的固定流程了,但是在真正的开始...

    数据库规范化过程

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

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

    关键知识点函数依赖

    设R(U)是属性集上的一个子集,X和Y是U的子集,若对于R(U)上的任意一个可能的关系r,如果r中不可能存在两个元组,它们在X上的属性值相等,而在Y上的属性值不相等,则称X函数决定于Y或Y函数依赖与X,记作X->Y。
    定义可能有些难以理解,我在这里简单的解释一下:函数依赖描述的是两个集合之间的一种映射关系,这种映射关系与函数是一样的,例如 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范式。

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

    展开全文
  • 数据库规范化理论与范式

    千次阅读 2019-06-17 17:32:31
    1,数据库规范化理论的目的 1.消除冗余数据 2.确保数据的依赖性处于有效状态
  • 关系型数据库规范化的通俗理解

    千次阅读 2019-05-26 11:17:35
    最近参加数据库系统工程师的考试,结合自己的工程经验,终于对数据库规范化理论有了一知半解。 本文试图从工程化的角度,用大白话去解释数据库规范化的结论,如果有不严谨之处,敬请指正。我不会去详细介绍每个范式...
  • 关系数据库规范化理论

    千次阅读 2016-03-16 22:53:23
    关系数据库规范化理论
  • 关系数据库规范化(例题解析)

    万次阅读 2016-10-20 16:27:14
    关系数据库规范化
  • 什么是最小函数依赖集? 如何计算最小函数依赖集? 算法步骤 (1)将F中的所有函数依赖的右边化为单一属性; (2)去掉F中的所有函数依赖...(闭包如何求解请参考:数据库规范化:闭包求解) 例题2 例题3 ...
  • 数据库规范化理论

    千次阅读 2018-05-11 16:59:31
    关系模式的规范化 好的关系:尽可能少的数据冗余、没有插入异常、没有删除异常、没有更新异常 1.完全依赖与部分依赖(冗余和更新异常) 2.传递依赖 范式 第1范式 每个属性不可再分 第2范式 不允许关系模式中的非主...
  • 最近在了解数据库规范化的四个等级, 一直有点模糊, 写个文章记录一下学习历程. 文章内容会时刻更新, 欢迎和感谢大家的一起交流
  • 数据库规范化技巧

    2004-04-01 00:00:00
    数据库规范化技巧点击此处阅读全文
  • 数据库——关系数据库规范化习题

    千次阅读 2019-06-29 16:39:00
     插入异常:如果某个系刚成立,目前暂时没有在校学生,无法把系住处的信息存入数据库。  删除异常:如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系住处的信息也删除了。  (5)如何分解?分解后...
  • 4.1 数据依赖 4.1.1 关系模式中的数据依赖 概念回顾 关系模式的形式化定义 4.1.2 数据依赖对关系模式的影响 什么是数据依赖 关系模式的简化表示 数据依赖与关系模式 ...4.3.1 关系范式规范化的步骤
  • 数据库规范化设计与性能的问题

    千次阅读 2010-08-29 14:26:00
    数据库规范化设计时,为了满足三大范式,我们的数据操作性能会受到相应的影响。所以,在实际的数据库设计中,既要考虑到三大范式,避免数据的冗余和各种数据库操作异常,又要考虑数据访问性能。有时,为了减少表间...
  • 数据库规范化 - 六大范式解析

    千次阅读 2020-06-06 22:03:02
    范式就是数据库表的评级,可以理解为表结构的设计标准的级别,是关系的约束条件的规范,范式越高,表的划分越细 关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF - ...
  • 若符合这两个基本条件,则说明这个数据库规范化水平还是比较高的。 当然这两个指标只是最基础的判定条件。为了让数据库更加的规范,需要符合以下五点要求。 要求一:表中应该避免可为空的列。 虽然表中允许空列,...
  • 关系数据库规范化 在了解规范化范式之前我们先来了解下函数依赖 ——什么是函数依赖呢? 1、函数依赖 函数依赖:设 X,Y 是关系 R 的两个属性集合,当任何时刻 R 中的任意两个元组中的 X 属性值相同时,则它们的 Y ...
  • 关系数据库规范化理论---范式

    千次阅读 2017-11-08 15:27:02
    此篇博文是我的第一篇文章,在复习数据库范式...关系模式规范化的必要性:关系模式规范化,使之达到较高的范式是设计好关系模式的唯一途径。否则,所设计的关系数据库会产生一系列的问题。 关系模式应满足的基本要求:
  • 数据库规范化设计的五个原则

    千次阅读 2014-11-20 19:43:48
     在数据库表设计的时候,数据库管理员应该养成一个好习惯,用一个ID号来 唯一的标识行记录,而不要通过名字、编号等字段来对纪录进行区分。每个表都应该有一个ID列,任何两个记录都不可以共享同一个ID值。另外,这...
  • 数据库规范化设计理论摘要

    千次阅读 2011-06-02 19:15:00
    对于一个大项目来讲,数据库的设计命名规范是很重要的一个环节,好的表设计,让人看得很舒服,一看就明白是什么意思了,下面看到一篇很不错的数据库对象命名参考文档,所以整理分享给大家。 引言 ...
  • 数据库规范化理论---模式分解

    千次阅读 2018-01-21 19:03:48
    这里主要讨论基础考试选择题,判断一个分解是有损无损、是否保持函数依赖。 一、公式法 无损分解⇔R1∩R2→(R1-R2)或R1∩R2→(R2-R1) 保持函数依赖⇔(F1∪F2)+=F+ 说明:这里的判断无损的→以及判断保持...
  • 数据库规范化设计理论摘要要

    千次阅读 2010-05-20 09:09:00
    SQL数据库设计规范参考之数据库对象命名详细文档时间:2009-12-16 13:23:29 来源:www.cnblogs.com 作者: -对于一个大项目来讲,数据库的设计命名规范是很重要的一个环节,好的表设计,让人看得很舒服,一看就明白是...
  • 数据库规范化理论---求候选键

    千次阅读 多人点赞 2018-01-21 11:16:01
    以下是写的比较科学规范的闭包求解方法,设X和Y均为关系R的属性集的子集,F是R上的函数依赖集,若对R的任一属性集B,一旦X→B,必有B⊆Y,且对R的任一满足以上条件的属性集Y1 ,必有Y⊆Y1,此时称Y为属性集X在函数...
  • 如果我们要设计关系型数据库的表模式,则很有可能会出现冗余,为了避免这种情况,我们需要一些规则,这些规则称为依赖。 函数依赖简单地说就是属性集A推导出属性集B,比如 给定这些规则之后,如果某个关系...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 316,594
精华内容 126,637
关键字:

数据库规范化