Skip to content

约 1963 个字 18 张图片 预计阅读时间 10 分钟

Chap 2 | Relational Model

章节启示录

本章节是课程的第二节内容,虽然但是,这是我第一篇DB的笔记。感觉前面的部分有点乱,但主要是一些定义和概念的熟悉。本章节上课讲的速度比较快,主要内容是关系基本模型、各种键值和各种关系代数式的表示,听起来难度不大,但要想自己解决题目还需要多加熟悉和练习。

1.关系模型

相关定义

1.关系模型非常简单和优雅。
2.关系数据库是基于关系模型的一个或多个关系的集合。
3.关系是包含的表。
4.关系模型的主要优点是其简单的数据表示,并且可以轻松表达复杂的查询。

一个简单的例子:

2.关系数据库的基本结构

2.1基本定义

一般地,给出一个集合的集群(多个集合的意思,我自己取的名字)\(D_1,D_2,……,D_n(D_i=a_{ij} |_{j=1……k})\),
关系 \(r\) 则是 \(D_1×D_2×……×D_n\) (笛卡尔积)的一个子集。
因此,一个关系是一个 $n-tuples (可以理解为行)的集合 \((a_{1j},a_{2j},……,a_{nj})\),且 \(a_{ij}∈D_i(i∈[1,n])\)

一个实际例子:

\(D_1\) = 导师集合 = {张清玫, 刘逸},
\(D_2\) = 专业集合 = {计算机, 信息},
\(D_3\) = 学生集合 = {李勇, 刘晨, 王名}
\(D_1×D_2×D_3\)=
{(张清玫, 计算机, 李勇),
(张清玫, 计算机, 刘晨),
(张清玫, 计算机, 王名),
(张清玫, 信 息, 李勇),
(张清玫, 信 息, 刘晨),
(张清玫, 信 息, 王名),
(刘 逸, 计算机, 李勇),
(刘 逸, 计算机, 刘晨) }

一个代数化例子:

\(customer-name\) = {Jones, Smith, Curry, Lindsay}
\(customer-street\) = {Main, North, Park}
\(customer-city\) = {Harrison, Rye, Pittsfield}
\(r\) =
{(Jones, Main, Harrison),
(Smith, North, Rye),
(Curry, North, Rye),
(Lindsay, Park, Pittsfield)}

关系理论第一范式

关系中的所有分量不可再分,即它是原子的(atomic)
关系中的所有分量(attribute)其实就是像excel中的表的每一列的属性值,每一个属性值的取值范围称为它的域(domain)。

  • 一个特殊的值 \(NULL\) 存在于所有的域中,\(NULL\) 的含义有两种,分别是:①不存在 ②存在但不知道。

两个定义(relation schema和relation instance)

  • 1.relation schema(关系架构):它描述了关系中的结构。直接看例子。
    \(Student-schema\) = (sid: string, name: string, sex: string, age: int, dept: string)
    我们可以把这个架构简写为:
    \(Student-schema\) = (sid, name, sex, age, dept)
    那么我们如果把这个例子抽象成一个理论定义,接下来的表述应该是这样的:
    假设\(A_1,A_2,……,A_n\) 是属性值(attributes),那么 \(R=(A_1,A_2,……,A_n)\) 是一个关系架构(relation schema)。
    \(r(R)\)则是一个在关系架构\(R\)中的关系。
  • 2.relation instance(关系实例):是指关系中的具体的值,其中行被称为tuple,列被称为attribute。

2.2Key(码/键)

几个键

  • 1.超码(superkey):在一个关系中唯一地标识一个元组。

    e.g:{ID} 和 {ID,name} 都是超码

  • 2.候选码(candidate key):超码的最小子集。 候选码的任意真子集都不可能是超码,候选码就是最小的超码。

    e.g:{ID}是一个候选码

  • 3.主码(primary key):是候选码之一。唯一或者没有。由数据库设计者指定,不指定的话就没有主码。一般主码会有下划线标注
  • 4.外码(foreign):关系 \(r1\) 的属性中包含关系 \(r2\) 的主码,该主码就是 \(r1\) 的外码。

3.代数表达式

3.1基本代数关系表达式

1.选择(Select)

\(\large\sigma_p(r)=\{t|t∈ r\ and\ p(t)\}\)

e.g:\(\large\sigma_{branch-name='Perryridge'}(account)\)

2.投影(Project)

\(\large\Pi_{A_1,A_2,……,A_k}(r)\)

e.g:\(\large\Pi_{account-number,balance}(account)\)

3.并(Union)

\(\large r \cup s = \{t|t∈r\ or\ t∈s\}\)

e.g:\(\large\Pi_{customer-name}(depositor) \cup \Pi_{customer-name}(borrower)\)

4.差(Set Difference)

\(r-s=\{t|t∈r\ and\ t\ \notin s\}\)

e.g:

5.笛卡尔积(Cartesian Product)

e.g:
\(r×s=\{\{t,q\}|t∈r \ and \ q∈s\}\)

6.重命名(Rename)

\(\rho_{Newname}(E)\)

一个例子🌰

下面将借助一个银行的例子熟悉以上提到的6个基本操作。

  • Find all loans of over $1200.
    \(\large\sigma_{amount>1200}(loan)\)
  • Find the loan number for each loan of an amount greater than $1200.
    \(\large\Pi_{loan-number}(\sigma_{amount>1200}(loan))\)
  • Find the names of all customers who have a loan, or an account, or both, from the bank.
    \(\large\Pi_{customer-name}(borrower) \cup \Pi_{customer-name}(depositor)\)
  • Find the names of all customers who at least have a loan and an account at bank. \(\large\Pi_{customer-name}(borrower) \cap \Pi_{customer-name}(depositor)\)
  • Find the names of all customers who have a loan at the Perryridge branch.
    Query 1:
    \(\large\Pi_{customer-name}(\sigma_{branch-name='Perryidge'}\sigma_{borrower.loan-number=loan.loan-number}(borrower×loan))\)
    Query 2:
    \(\large\Pi_{customer-name}(\sigma_{borrower.loan-number=loan.loan-number}(borrower×(\sigma_{branch-name='Perryridge'}(loan))))\)
    第二个算法要更加的好,因为它在做笛卡尔积之前做了一些筛选,减少了表的大小。
  • Find the largest account balance (i.e., self-comparison).
    \(Step1\):Rename account relation as d.
    \(Step2\):Find the relation including all balances except the largest one. \(\large\Pi_{account.balance}(\sigma_{account.balance<d.balance}(account×\rho_d(account)))\)
    \(Step3\):Find the largest account balance.
    \(\large\Pi_{balance}(account)-\Pi_{account.balance}(\sigma_{account.balance<d.balance}(account×\rho_d(account)))\)

3.2其他代数关系表达式

1.交(Set Intersection)

\(\large r\cap s=\{t|t∈ r\ and\ t∈s\}\)
提示:\(\large r\cap s=r-(r-s)\)

e.g:

2.自然连接(Natural Join)
\(R=(A,B,C,D),S=(B,D,E)\)
\(\large r\bowtie s=\Pi_{r.A,r.B,r.C,r.D,s.E}(\sigma_{r.B=s.B\ \cap \ r.D=s.D}(r×s))\)

e.g:

注意:
(1) r, s必须含有共同属性(名和域都对应相同);
(2) 连接二个关系中同名属性值相等的元组;
(3) 结果属性是二者属性集的并集, 但消去重名属性。

3.除(Division)

\(\large r\div s=\{t|t∈\Pi_{R-S}(r)\ \cap\ [\forall u ∈ s(tu ∈ r)]\}\)

e.g:

4.赋值(Assignment)

\(r\gets s\)

e.g:
\(\large temp \gets \Pi_{R-S}(r)\)

一个例子🌰

同样地我们来看一个例子。

  • Find all customers who have an account from at least the “Downtown” and the “Uptown” branches.
    Query1:
    \(\large\Pi_{customer-name}(\sigma_{branch-name='Downtown'}(depositor\bowtie account))\newline \cap\Pi_{customer-name}(\sigma_{branch-name='Uptown'}(depositor\bowtie account))\) Query2:
    \(\large\Pi_{customer-name,branch-name}(depositor\bowtie account)\div \rho_{temp(branch-name)}(\{('Downtown'),('Uptown')\})\)
  • Find all customers who have an account at all branches located in Brooklyn city. \(\large\Pi_{customer-name,branch-name}(depositor \bowtie account)\div \Pi_{branch-name}(\sigma_{branch-city='Brooklyn'}(branch))\)
  • 查询选修了全部课程的学生学号和姓名
    涉及表: 课程信息course(cno, cname, pre-cno, credits), 选课信息 enrolled(sno, cno, grade), 学生信息student(sno, sname, sex, age)
    当涉及到求“全部”之类的查询,常用“除法”
    \(Step1\):找出全部课程号:\(\Pi_{Cno}(Course)\)
    \(Step2\):找出选修了全部课程的学生的学号:\(\Pi_{Sno,Cno}(enrolled)\div \Pi_{Cno}(Course)\)
    \(Step3\):与student表自然连接(连接条件Sno)获得学号、姓名:\(\Pi_{Sno,Cno}(enrolled)\div \Pi_{Cno}(Course) \bowtie \Pi_{Sno,Sname}(student)\)

运算顺序

  • project \(\Pi\)
  • select \(\sigma\)
  • cartesian product \(×\)
  • join,divison \(\bowtie \ \div\)
  • intersection \(\cap\)
  • union,difference \(\cup \ -\)

3.3扩展代数关系表达式

1.广义投影(Generalized Projection) 通过允许在投影列表中使用算术函数来扩展投影操作。
\(\large\Pi_{F_1,F_2,……,F_n}(E)\)

e.g:
给定一个关系\(credit-info(customer-name, limit, credit-balance)\)
\(\large\Pi_{customer-name,limit'-'credit-balance}(credit-info)\)
'-'表示减法而不是连接词。
这个代数关系表达式找出了每个人可以多花多少钱。

2.聚合函数(Aggregate Functions)
聚合函数接受值的集合并返回单个值作为结果。

  • \(avg\): average value
  • \(min\): minimum value
  • \(max\): maximum value
  • \(sum\): sum of values
  • \(count\): number of values

\(G_1,G_2,……,G_n \ \LARGE g_{\large F_1(A_1),F_2(A_2),……,F_n(A_n)}\large(E)\)

e.g:

3.外部连接(Outer Join)
连接操作的扩展,可避免信息丢失。
$\large ⟕ $ 和 $\large ⟖ $

e.g:


Null Values

关于NULL值的一些讨论。

复习时的一些补充

  • Attribute values are (normally) required to be atomic, i.e., indivisible (--- 1st NF, 关系理论第一范式) E.g., multivalued attribute values are not atomic. E.g., composite attribute values are not atomic.
  • 参照关系中外码的值必须在被参照关系中实际存在, 或为null。
  • 投影中多值属性被删除
  • If attributes of r(R) and s(S) are not disjoint, then renaming for attributes must be used. (同名属性值需要重命名)
  • If a relational-algebra expression E has arity n, then $\rho x(A1, A2, …, An)(E) $ (对relation E及其attributes都重命名)
  • 聚合结果没有名称,可以使用重命名操作为其命名。为方便起见,我们允许在聚合操作中重命名。
  • Result of select predicate is treated as false if it evaluates to unknown

Comments