理解数据库范式
为了实现不同级别的数据库'普通形式',通过检查异常的关系(表)并在检测到,通过检查与异常的关系来组织或分解数据库中的数据。这导致从数据库中删除冗余数据和数据依赖性。结果,通过具有较小且良好的结构关系来实现数据库设计,这些关系需要较少的存储空间进行数据。最后,在冗余数据和性能之间进行折衷,因为数据的归一化导致分离关系。连接主要用于检索需要更多处理能力的数据。
有兴趣学习更多关于数据库设计的知识吗?在Udemy.com网站上查看在线数据库课程。
什么是数据库范式?
从理论上讲,数据库“范式”(NF)是一个定义数据库关系的过程,这种关系不会受到逻辑不一致和异常(如插入、编辑和删除)的影响。每一种关系都有最高的范式,但这并不意味着它就是‘范式’的最高层次。“范式”与每一种关系相关联;因此,要实现整个数据库范式,每个关系都必须达到最高范式。
“范式”是一种关系的简化状态,在这种状态上应用有关函数依赖关系(属性之间的关系)的规则。以下是“范式”的规则或不同层次。
- “第一范式”(1NF)的结果是一个没有多值属性的关系。
- “第二范式”(2NF)导致了一种没有部分功能依赖的关系。
- “第三正常形式”(3NF)导致无递奏函数依赖关系的关系(两个非键属性之间的功能依赖性)。
- “Boyce-Codd范式”是通过删除3NF之后的剩余函数依赖项来实现的。
- “第四范式”的结果是一个没有多值依赖关系的关系。
- “第五范式”是通过去除所有剩余的异常现象来实现的。
只讨论了前三种范式,因为它涵盖了设计数据库时的所有基本问题。
第一标准表格(1NF)
当关系中没有存在多值属性时,据说关系处于“第一正常形式”。因此,在1NF中的关系符合关系定义中的所有所需属性。重要属性是每个属性值必须只包含单个值和相同类型,每个属性都有唯一的名称。订单是微不足道的。换句话说,关系中没有两行可以是相同的。以下表显示了学生的多价属性和结果1NF关系。
StudentID | 的名字 | deptname. | DeptLocation | CourseTitle | DateCompleted |
1 | 约翰先生 | 软件 | 北 | DBMSJava | 01/10 / 20xx06 / 10 / 20xx |
2 | Doe先生 | 电信 | 南 | c++ Java | 01/10 / 20xx06 / 10 / 20xx |
3. | 十字架先生 | 软件 | 北 | DBMSJava | 01/10 / 20xx06 / 10 / 20xx |
StudentID | 的名字 | deptname. | DeptLocation | CourseTitle | DateCompleted |
1 | 约翰先生 | 软件 | 北 | DBMS. | 01/10/20XX |
1 | 约翰先生 | 软件 | 北 | Java | 06/10/20XX |
2 | Doe先生 | 电信 | 南 | C ++ | 01/10/20XX |
2 | Doe先生 | 电信 | 南 | Java | 06/10/20XX |
3. | 十字架先生 | 软件 | 北 | DBMS. | 01/10/20XX |
3. | 十字架先生 | 软件 | 北 | Java | 06/10/20XX |
在第一个表中,存在一个多值属性‘CourseTitle’,这就是为什么它不是一个有效关系的原因。第二个表通过填充创建新行的空位置,并将该属性作为主键的一部分,从而惟一地标识表中的每一行,从而删除了这个多值属性。这使得第二个表成为“第一范式”中的有效关系。
第二标准表格(2NF)
当关系已经处于“第一正常形式”时,并且关系中的每个非关键属性都是完全起作用的,并且依赖于主键,则据说关系处于“第二正常形式”。以下规则用于标识2nf关系:
- 仅将一个属性分配为关系中的主键。
- 关系中的所有属性组成一个主键。
- 关系中的每个非键属性都完全依赖于主键的所有组件。
在主键是复合键的“第一个正常形式”的最后一表中,关系不在2nf中,因为'name'和'deptname'仅在功能上依赖于“Studentid”的主键的一部分。'dateCompleted'也是如此,这是“Coursetitle”。这被称为部分功能依赖性。因此,在1NF学生关系中存在部分功能依赖性,它创建数据冗余和异常,如删除课程细节也会删除学生的部门信息。要将1NF学生与2NF转换为2NF,该关系被分解为满足上述规则之一的较小和结构良好的关系。
表:student_basic_info.
StudentID | 的名字 | deptname. | DeptLocation |
1 | 约翰先生 | 软件 | 北 |
2 | Doe先生 | 电信 | 南 |
3. | 十字架先生 | 软件 | 北 |
表:Student_Course_Info
StudentID | CourseTitle | DateCompleted |
1 | DBMS. | 01/10/20XX |
1 | Java | 06/10/20XX |
2 | C ++ | 01/10/20XX |
2 | Java | 06/10/20XX |
3. | DBMS. | 01/10/20XX |
3. | Java | 06/10/20XX |
上面的表'student_basic_info'满足2nf的第一个规则,其中只有一个属性'suddentid'作为主键。“Student_Course_Info”满足第三条规则,作为“数据成分”完全函数依赖于主键的每个组件。此外,从该表的分解,显然删除了一些冗余数据。
三级标准表格(3NF)
当一个关系已经在2NF中,并且在两个或多个非关键属性(也称为传递依赖)之间不存在功能性依赖时,一个关系就是“第三范式”。
2NF表名' Student_Basic_Info '不在3NF中,因为' DeptLocation '(一个非键属性)在功能上依赖于非键属性' DeptName ',存在一个传递依赖。由于这种依赖性,存在数据冗余,因为每个学生的系名重复了一个系的位置。一些异常现象也存在。更新部门位置的修改需要更改多个记录。如果没有' StudentID ',就不可能插入新部门,最后,要删除' Mr. '的' StudentID '。John '还删除部门位置信息。为了达到3NF,需要进一步分解。以下是结果表:
表:student_basic_info.
StudentID | 的名字 | deptname. |
1 | 约翰先生 | 软件 |
2 | Doe先生 | 电信 |
3. | 十字架先生 | 软件 |
表:Department_Info
deptname. | DeptLocation |
软件 | 北 |
电信 | 南 |
特色课程
最近更新于2021年3月
像专业人士一样使用Oracle SQL Developer:学习将帮助你成为最高效的SQL Developer |的特性和技巧来自Standout-Dev Academy的Carlos
探索课程