层次模型
tree
- Record and field
- Parent-Child relationship(PCR)
每个记录类型只有一个父节点
无法表达多对多信息
采用虚记录解决多对多
网状数据模型
系:主记录->属记录
主记录和属记录都可以有好多个
关系模型
表:table/relation
-
拥有更高的抽象级别,可以用数学里面集合论的知识研究
-
屏蔽底层编程细节,易于理解
-
可以引入代数系统
-
非过程化查询语言
-
软链接,逻辑指针
-
属性和域
- 原子数据:要求表的每个属性是原子的,不能再分。不允许出现表中套表。(一范式)
- 允许空值
- 关系(表)和元组
属性的个数称作目
属性,列,字段
元组,行,记录
主键:一组属性
- unique
- not null
- 可以决定其他元组的其他属性
- 属性组的子集不满足上述条件。如果不满足这个条件就称作超键。
- 如果多个属性组满足上述条件,我们可以指定一个为主键,其他的为候补键
- 如果这个属性组就是元组本身,称这个属性组为全键
外键:一组属性
- 来自其他关系,并且是其他关系的主键。逻辑指针
- 且必须在另一个表里面存在这个主键
域完整性约束:每个元组的每个属性的值都必须满足值域
实体完整性约束:主键不允许为空
引用完整性约束:外键的值必须在所引用的表中存在
关系代数
基本操作
- 选择Selection σ\sigmaσ :选择一些行
- 投影Projection π\piπ:选择一些列。投影操作应该消除可能出现的重复元素。实际的系统不会自动进行消除重复元素,除非用户要求。
- 叉乘Cross-product ×\times× : 笛卡尔乘积
- 集合差Set-difference−-−:集合减法
- 合并Union∪\cup∪:将两个表合并起来
上述五种操作构成了数据库完备的操作集合。任何其他操作都可以通过这些操作完成。
上面的操作都是封闭的。
后面两种操作要求参与运算的两个集合满足并兼容的条件:
- 属性个数一样
- 属性类型一样
连接操作:先做笛卡尔乘积,再做选择。实际上可以进行查询优化,否则效率比较低。
- 等值连接
- 自然连接:按照两个表的共同属性进行等值连接
除法操作:A/B
A/B=πx(A)−πx(πx(A)×B−A)A/B = \pi_x(A)-\pi_x(\pi_x(A)\times B-A) A/B=πx(A)−πx(πx(A)×B−A)
首先先将A中特有的属性x和B中的属性y分离开,然后再叉乘,得到的是一个比A大的集合,减去A后剩下的就是那些原本没有B属性的元组,将这些x提取出来再减去他们就是正确的x.
外连接:找不到匹配仍然保留元素,用空值填补
- 左外连接:保留左边表的所有元素
- 右外连接:保留右边表的所有元素
- 全外连接:保留两张表中的所有元素
外并:将不满足并兼容的表并在一起,新表的属性是原来两张表的属性的并,元组加在一起,缺少的元素补空值。
关系演算
基于谓词逻辑的非过程化的表达
- 元组关系演算TRC
- 域关系演算DRC
等价的,区别在于变量的定义不同。域关系演算的变量是属性。
域关系演算
- 原子公式
- <x1,x2,…,xn>属于表
- X op Y
- X op constant
- 公式
- 原子公式
- 逻辑运算
- 使用量词
对某个变量使用量词就称这个量词被绑定
不安全的查询:如果查询结果是无限的,就说这个查询是不安全的。
安全的关系演算和关系代数是等价的。
SQL语言建立在关系演算之上。
元组关系演算
变量定义在元组上
ER数据模型
传统的数据模型擅长表达以记录为基础的结构化的数据,支持日常事务型的应用。
不能根据用户的需求或者应用的需求
不能用一种很自然的方法表达实体之间的关系
语义信息不够明确
支持的数据类型太少,有时候不能满足应用的需求
实体Entity:现实世界中可区别的对象,使用一组属性来描述
实体集Entity Set:实体的集合
允许复合类型,多值属性
联系Relationship:实体之间的联系
E-R图:对E-R模型的图形化的展示。
方框:实体
圆圈:属性
菱形:联系
基数比例约束:
- 一对一
- 一对多
- 多对多
参与度约束:一个实体参与一个联系的最少和最多次数
全参与
部分参与
扩展ER模型:
弱实体:不能单独存在,必须依赖其他实体存在的实体。例如职工的家属
普遍化和特殊化
聚集:把联系看作实体集和其他实体发生联系
范畴:不同类型的实体组成范畴
面向对象数据模型
突破一范式的限制