关系模型
维基百科,自由的百科全书
-{T|zh-tw:關聯模型;zh-cn:关系模型}- 用于数据库管理的-{A|zh-tw:關聯;zh-cn:关系}-模型是基于谓词逻辑和集合论的一种-{A|zh-tw:資料;zh-cn:数据}-模型。
目录 |
[编辑] 模型
关系模型的基本假定是所有数据都表示为数学上的关系,就是说 n 个集合的笛卡儿积的一个子集,有关这种数据的推理通过二值(就是说没有 NULL )的谓词逻辑来进行, 这意味着对每个命题都没有两种可能的求值: 要么是真要么是假。数据通过关系演算和关系代数的一种方式来操作。
关系模型允许设计者通过数据库规范化的提炼,去建立一个信息的一致性的模型。访问计划和其他实现与操作细节由 DBMS 引擎来处理,而不应该反映在逻辑模型中。这与 SQL DBMS 普遍的实践是对立的,在它们那里性能调整经常需要改变逻辑模型。
基本的关系建造块是域或者叫数据类型。元组是属性的有序多集(multiset),属性是域和值的有序对。关系变量(relvar)是域和名字的有序对(序偶)的集合,它充当关系的表头(header)。关系是元组的集合。尽管这些关系概念是数学上的定义的,它们可以宽松的映射到传统数据库概念上。表是关系的公认的可视表示;元组类似于行的概念。
关系模型的基本原理是信息原理: 所有信息都表示为关系中的数据值。所以,关系变量在设计时刻是相互无关联的: 反而,设计者在多个关系变量中使用相同的域,如果一个属性依赖于另一个属性,则通过参照完整性来强制这种依赖性。
[编辑] 竞争者
其他模型还有层次模型和网状模型。使用这些旧体系的一些系统现在仍在一些数据中心中使用,那里有高数据容量需求或者现存系统复杂得使迁移到采用关系模型的系统花费巨大;还要注意新的面向对象数据库,尽管它们中很多都是 DBMS 构造工具,而不是严格的 DBMS。
关系模型是第一个形式化的数据库模型。在它被定义之后,非形式化模型被用做描述描述层次数据库(层次模型)和网状数据库(网状模型)。层次和网状数据在关系数据库之前就存在了,但是只在关系模型被定义之后才作为模型来描述,用来建立比较的基础。
[编辑] 历史
关系模型是由 Dr. Ted Codd 作为数据的一般模型而发明的,随后由 Chris Date 和 Hugh Darwen 等人维护和开发。在第三次宣言(1995) 中他们展示了如何向关系模型扩展上面向对象特征而不用妥协它的基本原理。
[编辑] 误实现
SQL 最初作为关系数据库的标准语言而提出,而在实际上总是违背它。所以 SQL DBMS 实际上不是真正的 RDBMS,并且当前 ISO SQL 标准不提及关系模型或者使用关系术语或概念。
[编辑] 实现
已经有很多尝试去生成 Codd、Date、Darwen 等人开发的关系数据库模型的真正实现。但都没有获得流行性成功。Rel 是其中最新的尝试之一。SQL 使用概念"表"、"列"和"行"来替代"关系变量"、"属性"和"元组"。
[编辑] 争论
Codd 自己提议了关系模型的一个三值逻辑版本,而且四值逻辑版本也被提议了,用来处理缺失信息。但是这些都未被实现,大概是由于顾及到了复杂性。SQL NULL 意图成为三值逻辑系统的一部分,但是由于在标准和它的实现中的逻辑上的错误而没有达到目标。
[编辑] 设计
数据库规范化通常在设计关系数据库时进行,用来增进数据库设计的逻辑上的一致性和事务处理性能。
有两种常用的模式图系统来辅助关系模型的可视表示: 实体-联系模式图(ERD),和美国空军在 ERD 基础上建立的 IDEF1X 方法中所使用的关联 IDEF 模式图。
[编辑] 样例数据库
一些关系变量和它们的属性的一个理想化和非常简单的例子:
Customer(Customer ID, Tax ID, Name, Address, City, State, Zip, Phone)
Order(Order No, Customer ID, Invoice No, Date Placed, Date Promised, Terms, Status)
Order Line(Order No, Order Line No, Product Code, Qty)
Invoice(Invoice No, Customer ID, Order No, Date, Status)
Invoice Line(Invoice No, Line No, Product Code, Qty Shipped)
Product(Product Code, Product Description)
在这个设计中我们有六个关系变量: Customer, Product, Order, Order Line, Invoice, 和 Invoice Line. 粗体字有下划线的属性是候选键(码)。非粗体字有下划线的属性是外键(码)。
通常任意选择一个候选键(码)叫做主键(码)并且优先于其他候选键(码),它们也就被叫做可选键(码)。
候选键(码)是强制元组不重复的唯一性标识符;否则关系就违背了集合的基本定义而成为是叫做包的东西了。键(码)可以是复合的,就是说可以由多个属性组合而成。下面是我们的例子 Customer 关系变量的一个表格化描述;关系可以被认为是归结到一个关系变量的值。
[编辑] 集合理论公式
关系模型中的基本概念是关系名字和属性名字。我们通常把他们表示为如 "Person" 和 "name" 这样的字符串,并且我们通常使用变量 r, s, t, ... 和 a, b, c 来涉及它们。另一个基本概念原子值的集合包含着如数值和字符串这样的值。
我们的第一个定义关注元组的概念,它是表格中行或记录的概念的形式化。
- 定义 表头是属性名字的有限集合。
下一个定义定义了关系,它是关系模型中对表格内容的形式化。
- 定义 关系是带有表头 H 和表体 B 的一个元组(H, B),表体是都有域 H 的元组的集合。
这种关系紧密的对应于在一阶逻辑中通常叫做谓词外延的东西,除了我们这里用属性名字标识在谓词中的位置之外。在关系模型中数据库模式是由一组关系名字,与这些名字相关联的表头,和在数据库模式的每个实例上保持的约束构成的。
- 定义 在表头 H 上的关系全集 U 是有表头 H 的关系的非空集合。
- 定义 关系模式(H, C) 由表头 H 和对有表头 H 的所有关系 R 定义的谓词 C(R) 构成。
- 定义 如果关系有表头 H 并满足 C 则它满足关系模式(H, C)。
[编辑] 键(码)约束和函数依赖
最简单和最重要的一类关系约束是键(码)约束。它告诉我们在特定关系模式的所有实例中元组可以通过它特定属性的值来标识。
- 定义 超键(码)被写为属性名字的有限集合。
- 定义 超键(码) K 在关系(H, B)中保持,条件是 K ⊆ H 并且在 B 中没有两个不同的元组 t1 和 t2 使 t1[K] = t2[K]。
- 定义 超键(码)在表头 H 之上的关系全集 U 中保持,条件是它在 U 中的所有关系中保持。
- 定义 超键(码) K 保持为在 H 之上的关系全集 U 的一个候选键(码),条件是它保持为 U 的超键(码)并且没有 K 的真子集也保持为 U 的超键(码)。
- 定义 函数依赖(简写为 FD)被写为 X->Y,X 和 Y 是属性名字的有限集合。
- 定义 函数依赖 X->Y 在关系(H, B)中保持,条件是 X 和 Y 是 H 的子集并且对于在 B 中所有的元组 t1 和 t2 使得如果 t1[X] = t2[X] 则 't1[Y] = t2[Y]。
- 定义 函数依赖 X->Y 在表头 H 之上的关系全集 U 中保持,条件是它在 U 中的所有关系中保持。
- 定义 函数依赖在表头 H 下是不证自明的,条件是它在 H 下的所有关系全集中保持。
- 定理 FD X->Y 在表头 H 下是不证自明的,当且仅当 Y ⊆ X ⊆ H。
- 定理 超键(码) K 在 H 之上的关系全集 U 中保持,当且仅当 K ⊆ H 并且 K->H 在 U 中保持。
- 定义(Armstrong 规则) 设 S 是 FD 的集合,则 S 在表头 H 下的闭包写为 S+,它是 S 的符合如下规律的最小超集:
- (自反律) 如果 Y ⊆ X ⊆ H,则 X->Y 在 S+ 中。
- (传递律) 如果 X->Y 在 S+ 中并且 Y->Z 在 S+ 中,则 X->Z 在 S+ 中。
- (增广律) 如果 X->Y 在 S+ 中并且 Z ⊆ H,则 X∪Z -> Y∪Z 在 S+ 中。
- 定理 Armstrong 规则是可靠的和完备的,就是说给定一个表头 H 和只包含 H 的子集的 FD 集合 S,则 FD X->Y 在 S+ 中,当且仅当在它在 H 之上的其中所有的 S 中的 FD 都保持的所有的关系全集中保持。
- 定义 如果 X 是属性的有限集合并且 S 是 FD 的有限集合,则 X 在 S 下的补集写为 X+,它是符合如下规律的 X 的最小超集:
- 如果 Y->Z 在 S 中并且 Y ⊆ X+ 则 Z ⊆ X+。
属性集合的补集可以用来计算特定的依赖是否在 FD 集合的闭包中。
- 定理 给定表头 H 和只包含 H 的子集的 FD 的集合 S,X->Y 保持在 S+ 中,当且仅当 Y ⊆ X+。
- 算法(从FD 推导候选键(码))
INPUT: 只包含表头 H 的子集的 FD 的集合 S OUTPUT: 在 H 之上的其中所有的 S 中的 FD 都保持的所有的关系全集中 保持为候选键(码)的超键(码)的集合 C begin C := ∅; // 找到的候选键(码) Q := { H }; // 包含候选键的超键(码) while Q <> ∅ do 设 K 是来自 Q 的某个元素; Q := Q - { K }; minimal := true; for each X->Y in S do K' := (K - Y) ∪ X; // 推导新超键(码) if K' ⊂ K then minimal := false; Q := Q ∪ { K' }; fi od if minimal and 没有K 的子集在 C 中 then 从 C 中去除 K 的所有超集; C := C ∪ { K }; fi od end
- 定义 给定表头 H 和只包含 H 的子集的 FD 的集合 S,S 的不可简约覆盖是符合如下规律的 FD 的集合 T
- S+ = T+
- 没有T 的真子集 U 使 S+ = U+,
- 如果 X->Y 在 T 中则 Y 是单元素(singleton)集合并且
- 如果 X->Y 在 T 中并且 Z 是 X 的真子集则 Z->Y 不在 S+ 中。
[编辑] 参见
- Tuple-versioning
[编辑] 引用
- Codd, E. F. (1970). "A relational model of data for large shared data banks". Communications of the ACM, , Vol. 13, No. 6, pp. 377-387. Retrieved from http://www.acm.org/classics/nov95/toc.html Sept. 4, 2004.
- Date, C. J., Darwen, H. (2000). "Foundation for Future Database Systems: The Third Manifesto", 2nd Edn. Addison-Wesley.
- Date, Christopher J. (2003). "Introduction to Database Systems". 8th ed.