What is a good data model?
数据模型
- 数据的逻辑组织方式(数据的基本结构和结构的语义)
- 文档模型(MongoDB 2000s)
- 关系模型(SQL DB 1970s~80s)
- 层次模型(IBM IMS 1960s)
- 网状模型(GE IDS 1960s)
- 数据模型决定了数据的访问形式(接口),因此决定了系统的功能性和易用性。
Schema
- 对数据库中数据的结构性描述
- 参照schema才能正确书写查询
- 一种数据库的元数据(Metadata)
- 描述数据库中有什么样的数据
- Metadata:Data about data
- DataModel相当于Schema的Metadata,即MetaMetadata!
表达能力
- 如何衡量数据模型的表达能力?
- 数据本身能够表达什么信息?
- 计算机能够理解的信息
- 查询能够满足哪些信息需求?
- 数据本身能够表达什么信息?
- 表达能力的两个维度
- 表达能力的范围:能够满足哪些信息需求
- 上限为Turing Completeness
- 计算机的表达能力上界,数据库无法达到
- 表达的精简程度:用户描述需求是否方便
- Prolog比Java更精简更强
- 表达能力的范围:能够满足哪些信息需求
- DeclarativeLanguage(声明式程序设计语言)
- 相对于ProceduralLanguage(过程式语言)
- 表达更精简,只需要告诉程序要什么,而不是怎么要
- 例子
- FirstOrder Logic
- Prolog
- SQL/CRUD
- 对DBMS的智能提出了更高要求!
- 相对于ProceduralLanguage(过程式语言)
关系模型
关系
- 笛卡尔积的子集
- 单一的数据结构----关系
- 现实世界的实体以及实体间的各种联系均用关系来表示
- 逻辑结构----二维表
- 从用户角度,关系模型中数据的逻辑结构是一张二维表
- 建立在集合代数的基础上
结构
-
关系
D 1 × D 2 × … × D n D_1×D_2×…×D_n D1×D2×…×Dn的子集叫作在域 D 1 , D 2 , … , D n D_1,D_2,…,D_n D1,D2,…,Dn上的关系,表示为 R ( D 1 , D 2 , … , D n ) R(D_1,D_2,…,D_n) R(D1,D2,…,Dn)
R:关系名
n:关系的目或度(Degree)
-
元组
关系中的每个元素是关系中的元组,通常用t表示。
-
单元关系与二元关系(n-ary)
当n=1时,称该关系为单元关系(Unaryrelation)或一元关系
当n=2时,称该关系为二元关系(Binaryrelation)
-
关系的表示
关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域
-
属性
- 关系中不同列可以对应相同的域
- 为了加以区分,必须对每列起一个名字,称为属性(Attribute)
- n目关系必有n个属性
-
码
- 候选码(Candidatekey)
- 若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
- 简单的情况:候选码只包含一个属性
- 全码(All-key)
- 最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码(All-key)
- 主码
- 若一个关系有多个候选码,则选定其中一个为主码(Primarykey)
- 主码也可以由多个属性组成
- 主属性
- 候选码的诸属性称为主属性(Primeattribute)
- 不包含在任何侯选码中的属性称为非主属性(Non-Primeattribute)或非码属性(Non-keyattribute)
- 候选码(Candidatekey)
-
基本的关系性质
- 列是同质的(Homogeneous)
- 不同的列可出自同一个域
- 其中的每一列称为一个属性
- 不同的属性要给予不同的属性名
- 列的顺序无所谓,,列的次序可以任意交换
- 任意两个元组的候选码不能相同
- 行的顺序无所谓,行的次序可以任意交换
关系代数
- 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
- 关系代数
- 运算对象是关系
- 运算结果亦为关系
- 关系代数的运算符有两类:集合运算符和专门的关系运算符
- 传统的集合运算是从关系的“水平”方向即行的角度进行
- 专门的关系运算不仅涉及行而且涉及列
选择
- 选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算
投影
- 投影操作主要是从列的角度进行运算
- 投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
连接
- 等值连接
- 自然连接
- 去除冗余行
- 悬浮元祖(Dangling tuple)
- –两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
- 外连接(OuterJoin)
- 如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接
- 左外连接(LEFTOUTER JOIN或LEFTJOIN)
- 只保留左边关系R中的悬浮元组
- 右外连接(RIGHTOUTER JOIN或RIGHTJOIN)
- 只保留右边关系S中的悬浮元组
- 一般的连接操作是从行的角度进行运算