文章目录
前言
大家还记得这篇介绍数据库历史的文章中提到的E.F. Codd博士吗?
没错,他就是关系模型之父。如果有人问什么是关系模型,E.F. Codd博士的回答一定是有代表性的。
Codd’s 12 Rules
让我们来看一下Codd博士眼中的关系模式。
在Codd 博士的研究中,他提出了一系列规则,这些规则后来被称为“Codd的十二条规则”。
根据他的观点,一个数据库要想被视为真正的关系型数据库,必须遵守这些规则。这些规则定义了数据库应该如何存储和管理数据、确保数据的完整性和独立性,以及提供对数据的高效访问。
规则1:信息规则
数据库中存储的数据,无论是用户数据还是元数据,必须是某个表单元的值。数据库中的一切都必须以表格格式存储。
规则2:保证访问规则
每个数据元素(值)都必须能够通过表名、主键(行值)和属性名(列值)的逻辑组合来访问。不能使用其他方式,如指针,来访问数据。
这两条主要针对的是网络模型和分层模型。
规则3:NULL值的系统化处理
数据库中的NULL值必须得到系统化的统一的处理。这是一个非常重要的规则,因为NULL可以被解释为以下几种情况之一:数据缺失、数据未知或数据不适用。
必须正视对NULL值的处理,没有正确地处理NULL值是很多Bug的原因。
规则4:活跃的在线目录
整个数据库的结构描述必须存储在一个在线目录中,该目录被称为数据字典,可以被授权用户访问。用户可以使用与访问数据库本身相同的查询语言来访问目录。
规定了数据库元数据的存储和访问方式。
规则5:全面的数据语言规则
只能使用一种支持数据定义、数据操作和事务管理操作的线性语法语言来访问数据库。这种语言可以直接使用,也可以通过某些应用程序使用。如果数据库允许在没有这种语言的帮助下访问数据,那么它被认为是违规的。
指的是标准化SQL
规则6:视图更新规则
理论上,所有可以更新的数据库的视图,也必须能够被系统更新。
规则7:高级插入、更新和删除规则
数据库必须支持高级插入、更新和删除。这不应仅限于单行,即它还必须支持并集、交集和差集操作以产生数据集记录。
规则8:物理数据独立性
数据库中存储的数据必须独立于访问数据库的应用程序。数据库的物理结构变化不得影响外部应用程序对数据的访问方式。
规则9:逻辑数据独立性
数据库中的逻辑数据必须独立于其用户视图(应用程序)。逻辑数据的更改不得影响使用它的应用程序。例如,如果两个表合并或一个表分成两个不同的表,用户应用程序不应该受到影响或变化。这是最难应用的规则之一。
还记得数据库系统的三层架构吗?这篇文章介绍了物理模式、概念模式和外部模式。概念模式屏蔽了物理细节,实现了物理数据独立性。外部模式屏蔽了概念细节,实现了逻辑数据独立性。
文章链接: 【如此简单!数据库入门系列】之学霸数据库(3) – 数据库基本原理
规则10:完整性独立性
数据库必须独立于使用它的应用程序。所有完整性约束都可以独立修改,无需对应用程序进行任何更改。这条规则使得数据库独立于前端应用程序及其界面。
规则11:分布独立性
最终用户不能看到数据分布在不同位置上。用户应该始终认为数据仅位于一个节点。这条规则被视为分布式数据库系统的基础。
从完整性约束和数据分布角度,要求数据库系统与应用独立。针对当时某些数据库系统在使用方式上存在的问题。
规则12:非破坏性规则
如果系统具有提供对底层记录访问的接口,则该接口不能破坏系统并绕过安全性和完整性约束。
主要针对系统安全性
Codd博士的十二条规则涵盖了从数据存储、访问方式、NULL值处理、到数据的逻辑和物理独立性等多个方面,为关系型数据库的设计和实现提供了一套完整的指导原则。这些规则对于推动关系数据库技术的发展和应用起到了关键作用,也奠定了Codd博士在数据库领域的权威地位。
关系模型
回过头来,我们再看一下关系模型中的核心概念。
核心概念
-
表(Tables):在关系数据模型中,关系以表格的格式保存。表格存储了实体之间的关系。一个表有行和列,其中行代表记录,列代表属性。
-
元组(Tuple):表的单个行,也称为记录。
-
关系实例(Relation instance):关系数据库系统中一组有限的元组集合表示关系实例。关系实例中没有重复的元组。
-
关系模式(Relation schema):关系模式描述了关系名称(表名)和属性。
-
关系键(Relation key):每行有一个或多个属性,称为关系键,可以唯一标识关系(表)中的行。
-
属性域(Attribute domain):每个属性有一些预定义的值范围,称为属性域。
-
约束(Constraints):是指为了使一个关系成为有效的关系而必须满足的一些条件。这些条件被称为关系完整性约束(Relational Integrity Constraints)。
关系完整性约束
主要有三种完整性约束:
-
键约束(Key Constraints):关系中必须至少有一个属性的最小子集,可以唯一地标识一个元组(tuple)。这个属性的最小子集被称为该关系的键(key),即主键。如果有多个这样的最小子集,它们被称为候选键(candidate keys)。
-
域约束(Domain Constraints):每个属性都被限制在一个特定的值范围内。例如,年龄不能小于零,电话号码不能包含0-9以外的数字。
-
引用完整性约束(Referential Integrity Constraints):引用完整性约束基于外键(Foreign Keys)的概念。外键是可以在另一个关系中引用的关系的键属性。引用完整性约束规定,如果一个关系引用了不同或相同关系的一个键属性,那么那个键元素必须存在。
超键、候选键、主键、外键的区别?
目的都是保证数据完整性,它们之间关系:主键 ⊆ 候选键 ⊆ 超键,外键是另一个表的候选键
关系代数
关系代数是一种过程性查询语言,它以关系的实例作为输入并产生关系的实例作为输出。
关系代数使用操作符来执行查询。一个操作符可以是一元的或二元的。关系代数可以递归执行,中间结果也被视为关系。
可以将关系代数理解为,在关系上执行的一种面向过程的查询语言。
为什么突然提到关系代数?
- 有助于理解SQL语句底层是如何执行的
- 有助于理解数据库基本原理
SQL语句是声明式的,即告诉系统我希望得到什么样的结果,至于如何一步一步计算结果是系统自己的事情。
系统将声明式的SQL语句“翻译”成过程式的关系代数,进一步形成可以在物理模式上执行的代码。同一个SQL语句可以“翻译”成多个等价的关系代数,从这些关系代数中找出一个效率最优的,这正是优化器的工作。
关系代数有很多操作,这里介绍几个最基本的操作。
Select选择操作 (σ)
选择操作的目的是从关系 r 中选出满足给定谓词 p 的元组。
表示为: σp( r ),其中:
- σ 是选择操作的符号。
- p 是一个命题逻辑公式,可以包含如 and, or, not 这样的连接词,以及关系运算符如 =, ≠, ≥, <, >, ≤。
- r 代表一个关系(即数据库中的一个表)
例如:
- σsubject=“database”(Books)
会从 Books 关系中选择出所有 subject 为 “database” 的元组 - σsubject=“database” and price=“450”(Books)
会从 Books 关系中选择出所有 subject 为 “database” 并且 price 为 “450” 的元组 - σsubject=“database” or year>“2010”(Books)
会从 Books 关系中选择出所有 subject 为 “database” 或者出版年份大于 “2010” 的元组
Project投影操作(∏)
投影操作(∏)根据给定的谓词来选择列。
表示为 : ∏A1, A2, An ( r ),其中,A1, A2, An 是关系 r 中的属性名。
例如
- ∏subject, author (Books)
从关系Books中投影出subject和author列,形成一个新的关系。
Union并集操作(∪)
它执行两个给定关系之间的并集,定义如下:
r ∪ s = { t | t ∈ r 或 t ∈ s }
表示为 :r U s , 其中,r和s可以是数据库关系或关系结果集(临时关系)。要使并集操作有效,必须满足以下条件:
- r和s必须有相同数量的属性(attribute)
- 属性的域(domain)必须是兼容的
- 重复的元组(tuple)会自动消除
例如
- ∏ author (Books) U ∏ author (Articles)
分别从Books和Articles关系中投影出作者的名字, 然后对这两个结果进行并集,输出结果是那些写了书或文章或两者都写的作者的名字
Difference集合差(-)
集合差操作(-)的结果是在一个关系中存在但在第二个关系中不存在的元组。
表示为 : r − s,用于找出在r中但不在s中的所有元组。
例如:
- ∏ author (Books) − ∏ author (Articles)
输出那些写了书但没有写文章的作者的名字。
笛卡尔积(Χ)
笛卡尔积(Χ)操作将两个不同关系的信息合并到一个关系中。
表示为 :r Χ s ,其中 r 和 s 是关系,它们的输出将被定义为:
r Χ s = { q t | q ∈ r 且 t ∈ s}
例如:
- σauthor = ‘tutorialspoint’(Books Χ Articles)
输出一个关系,显示由 tutorialspoint 编写的所有书籍和文章。
重命名操作 (ρ)
重命名操作 (ρ) 允许为关系代数的结果命名,因为其结果也是关系,但是没有任何名称。
表示为:ρ x (E) , 其中,表达式E的结果被保存为名为x的关系。
ER模型到关系模型
上篇文章介绍了ER模型。ER模型是对现实世界的一种建模方法,它可以映射成关系模型。也就是说,我们可以使用ER图来创建关系模式。虽然我们无法将所有的ER约束导入到关系模型中,但是可以生成一个近似的模式。
这里介绍一些基础的映射算法。
实体映射
- 为每个实体创建一个表
- 实体的属性对应表的字段,并采用对应的数据类型
- 声明主键
关系映射
- 为每个关系(ER模型中的关系)创建一个表
- 将关系相关的所有实体的主键作为表中的字段,并采用各自的数据类型
- 如果关系具有任何属性,将每个属性添加为表的字段
- 声明一个主键,由关系相关的所有实体的主键组成
- 声明所有的外键约束
层次结构映射
- 创建所有高层实体的表
- 创建低层实体的表
- 在低层实体的表中添加高层实体的主键
- 在低层表中,添加低层实体的所有其他属性
- 声明高层表的主键和低层表的主键
- 声明外键约束
系列文章
- 【如此简单!数据库入门系列】之初识数据库 – 数据库基本概念
- 【如此简单!数据库入门系列】之学霸数据库 – 数据库基本原理
- 【如此简单!数据库入门系列】之学霸数据库(2) – 数据库基本原理
- 【如此简单!数据库入门系列】之学霸数据库(3) – 数据库基本原理
- 【如此简单!数据库入门系列】之前世今生 – 数据库历史
- 【如此简单!数据库入门系列】之前世今生(2) – 数据库历史
- 【如此简单!数据库入门系列】之ER模型快速入门
如果喜欢这篇文章,请不要忘记关注、点赞和收藏哦!
您的鼓励将是我创作的最大动力!