跳转至

Lec2 关系模型

阅读信息

987 字  3 分钟  本页总访问量 加载中...

关系

Relationship为现实中实体之间的关系,relation对应数据库中的一张表

关系(relation)的定义是什么? 给定若干集合,定义关系为所有集合笛卡尔积的子集。笛卡尔积即所有集合中元素组成有序对的集合,可以用一张二维表表示。

relation能拆分成什么?

  • schema:即表头,表示relation的结构,如Student(sid:int, name:string, age:int)。属性是schema的一部分。
  • instance:表中项的值。元组是instance的内容。

或进一步细化:

  • 属性(attribute):对应表中的列。attribute必须原子不可分(一个属性里的每个值都必须是单一、不可再拆分的基本值,不能是多值或复合值,否则要分成多个列。复合值会导致冗余。)域(domain)表示一个attribute的所有可能的值。所有domain中都包含null,null表示不存在、或存在但不知道。
  • 元组(tuple):对应表中的行

数据库由多张表组成。可将信息存在不同的表中,减少冗余。

码/键

码(用K表示)是属性的集合,用于区分每一行数据。

码有哪些种类?

  • 超码(superkey):能唯一标识一行记录的“一个或多个属性”的集合。即若两个tuple不同,则它们在超码中属性对应的值不同。
  • 候选码(candidate key):候选码是最小的超码,去掉其中任何一个属性后就不能唯一标识(要唯一确定tuple可能需要多个属性)
  • 主码(primary key):主码是候选码、且由程序员自己选定。一个表只能有一个主码,但主码可以由多个属性组成(即复合主码)。一般对应实体的表有主码,对应关系的表不需要主码、只要外码。
  • 外码(foreign key):外码是一张表中属性的集合,它的值引用另一个表的主码,用来建立表之间的关联。E.g.,两张表r、s中都有sid属性,且sid为表s中的主码,则r中取值为s中的值,其中r称为参照关系、s称为被参照关系。参照关系中熟悉感的取值是被参照关系中属性的值,且一定在被参照关系中存在。

关系代数表达式

关系代数表达式是用关系代数运算符把一个或多个关系(表)组合起来的公式,用来表示查询。

有哪些基本(fundamental)关系代数表达式?

  • 选择(\(\sigma\)):对单表,按条件筛选。\(\sigma_p(r)=\{t|t\in r \text{ and } p(r)\}\),其中p为选择谓词,可由and、or、not连接。
  • 投影(\(\Pi\)):对单表,选择列(自动去重)。表示为 \(\Pi_{\text{attributes}}(r)\)
  • 并(\(\cup\)):对双表,合并两表(自动去重)。表示为 \(r\cup s\)。两张表必须满足等目(属性个数相同)同源(属性的域相同)。
  • 差(\(-\)):对双表,\(r-s=\{t|t\in r \text{ and } t\notin s\}\)。r和s也必须等目同源。
  • 笛卡尔积(\(\times\)):对双表,\(r\times s=\{(t,q) | t\in r \text{ and } q\in s\}\)
  • 重命名(\(\rho\)):命名上述操作的返回结果。\(\rho_X(E)\),其中E为关系代数表达式,X为新的关系名。

有哪些额外(additional)关系代数表达式?

额外关系代数表达式都能通过前面6种操作实现。

  • 交 ($\cap \():\)r\cap s={t|t\in r \text{ and } t\in s}$,要求两张表等目同源。
  • 自然连接(\(\bowtie\)):把两张表中共有属性的值相等的行配对并合并成一行,自动去重,记为 \(r \bowtie s\)。进一步,\(r \bowtie_{\theta} s\) 将等于换成自定义的表达式 \(\theta\)
  • 除(\(\div\)):表达“对所有”的查询,e.g. 选课(学生,课程) \(\div\) 必修课(课程) = 选了所有必修课的学生
  • 赋值(\(\leftarrow\)):新名字 \(\leftarrow\) 表达式。

有哪些扩展(extended)关系代数表达式?

  • 泛化投影:允许在投影时写表达式,比如算新列、重命名列
  • 聚合函数:COUNT、SUM、AVG、MIN、MAX,场合GROUP BY结合使用
  • 外连接:将自然连接中未匹配的元组填充为null并连接,按填充哪些表分为左外连接、右外连接、全外连接。

null有什么特点?

聚合函数自动忽略null值,但COUNT、分组、排序时不忽略null。null值参与大于小于判断都为unknown状态,不会返回(只返回true/false)。

怎么实现增删改操作?

删:\(r\leftarrow r-E\) 增:\(r\leftarrow r\cup E\)