这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战
关系对应数据库中的表,关系是对表的概念的抽象。可以将其看做一种数据结构,由属性(列)定义其域的取值范围,由属性的具体的值组成的元组,对应表中的行,即一条记录。
列的名称和类型、完整性约束构成关系的模式(Schema),即关系的实体型,关系的类型,也就是metadata。而满足模式的数据集合也叫实例(instance),即数据行,或实体集。
关系数据库中的概念简介
IBM公司的E.F.Codd于1970年提出关系数据模型。出自他的论文《A Relational Model of Data for Large Shared Data Banks”》,以及后续提出关系代数和关系演算的概念。这些构成了关系数据库最重要的基础。
关系数据结构
关系模型主要分为两个方面:关系数据结构和关系完整性约束。
本篇主要介绍关系数据结构。
关系(Relation)
关系数据库中的“关系”这一概念,可以看做是一个单一的数据结构。
关系表示某种数据结构,现实世界中的实体、实体间的联系都可以用关系来表示。
比如是学生实体,可以用关系表示;教师实体,可以用关系表示;学生上某个老师的课,这样的关系(联系),也可以用关系表示。
关系对应数据库中的表,关系是对表的概念的抽象。
关系则可以看做是二维数组表示的表这种结构。表由列数据结构组成,和行组成的实体数据。
实体(Entity)
数据表中的一条记录就是一个实体。
客观存在并可相互区别的事物称为实体,可以是具体的人、事、物或抽象的概念。
属性(Attribute)
实体所具有的某一特性称为属性。一个实体可以有若干个属性。
对应表中的列(Column)。
值(Value)
某一个实体对应的某属性具体的内容值。
域(Domain)
域的概念通常很少接触到,因此大多数时候会感到陌生。
域是一组具有相同数据类型的值的集合。
简单说,域就是属性的取值范围,列(这一类型)的取值范围。
例如:
- 整数
- 实数
- 介于某个取值范围的整数(比如规定人的"年龄"属性,范围为0~120)。
- 指定长度的字符串集合
- {'男', '女'}("性别"的域)
笛卡尔积(Cartesian Product)
- 笛卡尔积
笛卡尔积来自于对多个域进行的属性值的交叉构造的新的空间。
所有域上的所有任意值构成的空间,就是笛卡尔积。对应SQL语句中的交叉连接(Cross JOIN)。
所有域取值的任意组合。笛卡尔积可以看作是 关系的“域”。
交叉连接(Cross JOIN)的结果也被称为笛卡尔积。
给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2,…,Dn的笛卡尔积空间为: D1×D2×…×Dn = {(d1,d2,…,dn)|di∈Di,i=1,2,…,n}
- 基数(Cardinal number)
笛卡尔空间的大小用基数来表示。
若(i=1,2,…,n)为有限集,其基数为(i=1,2,…, n),则 即笛卡尔积的基数M为所有域的大小的乘积:
或:
- 笛卡尔积举例
D1=学生集合 {张大, 王二}
D2=专业集合 {计算机专业, 信息专业}
D1、D2的笛卡尔积为:
D1×D2×D3={ (张大,计算机专业),(张大,信息专业), (王二,计算机专业),(王二,信息专业) }
基数为:2×2=4。
关于交叉连接(CROSS JOIN)
交叉连接返回两个表所有数据行的笛卡尔积。返回的结果集的数据行数等于第一个表中符合条件的数据行数乘以第二个表中符合条件的数据行数。
如下,新建两个表,并插入数据,查询两个表的笛卡尔积,即交叉连接:
CREATE TABLE C1(
Id int primary key,
MyCharts varchar(10)
);
CREATE TABLE C2(
Id int primary key,
Num int not null,
OtherCharts varchar(10)
);
insert into C1 values(1,'笛'),(2,'卡'),(3,'尔积');
insert into C2 values(1,3,'笛'),(2,2,'卡'),(3,1,'尔积');
SELECT * FROM C1 CROSS JOIN C2;
查询结果如下:
Id MyCharts Id Num OtherCharts
1 笛 1 3 笛
2 卡 1 3 笛
3 尔积 1 3 笛
1 笛 2 2 卡
2 卡 2 2 卡
3 尔积 2 2 卡
1 笛 3 1 尔积
2 卡 3 1 尔积
3 尔积 3 1 尔积
CROSS连接不需要on条件。
码(Key)
唯一标识实体的属性集合称为码,或候选码。一个实体可能有多个码,选取其中一个作为主码(即表中的主键)
实体型(Entity Type)
用实体名及其属性名集合,用来抽象和表示同类实体,称为实体型。
个人感觉实体型的翻译,很容易在语义上让人不太理解。翻译为“实体类型”,则很容易理解,而它的含义确实是实体类型。
实体集(Entity Set)
同一类型实体的集合称为实体集。
联系(Relationship)
表示的是显示世界中事物内部以及事物之间的联系。
分为:
- 实体内部的联系:组成实体的各属性之间的联系。
- 实体之间的联系:不同实体集之间的联系。
实体的联系就要涉及到一对一(1:1)、一对多(1:m)和多对多(m:n)。
由笛卡尔积引出的关系、元组、码等概念
关系(Relation)
(笛卡尔积)的子集叫作在域 上的关系,表示为:
R:关系名 n:关系的目或度(Degree),也就是列的个数。
元组(tuple)
关系中的每个元素 ,即每单个域值的笛卡尔积组合,叫做一个n元组(n-tuple) 或简称元组,通常用 t 表示。
对应表中的一行记录。
属性
关系中不同列称为属性(Attribute),每个属性有一个名字。列对应着某个域。
n目关系必有n个属性。
码
- 候选码(Candidate key)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码。也叫码。
最简单的情况:候选码只包含一个属性。
- 全码(All-key)
最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码(All-key)。
主码(Primary key)
若一个关系有多个候选码,则选定其中一个为主码(Primary key)
主属性
候选码的各属性称为主属性(Prime attribute)
不包含在任何侯选码中的属性称为非主属性(Non-Prime attribute)或非码属性(Non-key attribute)
单元关系、二元、多元关系
当n=1时,即只有一个属性时,称该关系为单元关系(Unary relation)或一元关系
当n=2时,即有两个属性时,称该关系为二元关系(Binary relation)。
n个属性时为n元关系。
关系模式(Relation Schema)
什么是关系模式
关系模式对应的是表模式,是型(关系的类型),主要是列的名字和类型。
关系模式是型,则关系就是值(该类型的值),可以从这个概念理解。
- 关系模式是对关系的描述
- 元组集合的结构(列的集合的结构)
- 属性构成
- 属性来自的域
- 属性与域之间的映象关系
- 完整性约束条件
- 元组集合的结构(列的集合的结构)
关系模式的形式化表示
关系模式可以形式化地表示为:
- R 关系名
- U 组成该关系的属性名集合
- D U中属性所来自的域
- DOM 属性向域的映象集合
- F 属性间数据的依赖关系的集合
关系模式与关系的“关系”
“型”与“值”的关系
关系模式:是对关系的描述,是静态的、稳定的
关系:是关系模式在某一时刻的状态或内容,是动态的、随时间不断变化的。即表中的数据变化。
关系模式和关系通常可以笼统地称为关系。
关系数据库
在一个给定的应用领域中,所有关系的集合构成一个关系数据库。
关系数据库就是关系构成的集合(特定场景或需求、业务下),也就是多个表组成的集合。
参考
主要参考自《数据库系统概论(基础篇)》