Structure of Relational Databases
- 关系数据库由表 (table) 的集合构成,每个表有唯一的名字
- 表中的一行戴奥了一组值之间的一种联系 (relationship)
- 表是这种联系的一个集合
- Venn图如下
可以看到,table和relation两个概念密切相关。
- r e l a t i o n ⟹ t a b l e relation\implies{table} relation⟹table
- a t t r i b u t e ⟹ c o l u m n attribute\implies{column} attribute⟹column
- 关系实例 (relation instance):一个关系的特定实例,即即一组特定的行;
- 对于关系的每个属性,都存在一个允许取值的集合,成为该属性的域 (domain)
- 关系的所有属性的域都具有原子性 (atomic 不可再分)
Database Schema
- Database Schema 数据库模式:数据库的逻辑设计 可类比变量定义
- Databse Instance 数据库实例:给定时刻数据库中状态 类比某一时刻变量的值
Keys
用于区分给定关系中不同元组的方法。
- Superkey 超码:能够在一个关系中唯一地标识一个元组的,一个或多个属性的集合。
- Candidate key 候选码:如果一个超码地任意真子集都不能成为超码,这样最小的超码称为候选码。
- Primary key 主码:被数据库设计者选中的、主要用来在一个关系中区分不同元组的候选码。
- Venn图如下
需要注意,码是整个关系的一种性质,而不是单个元组的性质。
- 一个关系模式(r1)可能在它的属性中包括另一个关系模式和(r2)的主码,这个属性在r1上称作参照r2的外码 (foreign key)
r1称为外码的参照关系(referencing relation)
r2称为外码的被参照关系(referenced relation)
Schema Diagrams
一个含有主码和外码依赖的数据库模式可以用模式图(schema diagram)表示。
Relational Query Languages
查询语言(query language) 是用户用来从数据库中请求获取信息的语言。
过程化与非过程化。
Relational Operations
| Symbol (Name) | Usage | Example |
|---|---|---|
| σ \sigma σ (Selection) | 返回输入关系中满足谓词的元组 | σ a g e > = 18 ( s t u d e n t ) \sigma_{age>=18}(student) σage>=18(student) |
| Π \Pi Π (Projection) | 对输入关系的所有行输出指定的属性。从输出中去除重复元组 | Π I D , s a l a r y ( i n s t r u c t o r ) \Pi_{ID,salary}(instructor) ΠID,salary(instructor) |
| ⋈ ⋈ ⋈ (Natural join) | 从两个输入关系中输出这样的元组对:他们在具有相同名字的所有属性上取值相同 | i n s t r u c t o r ⋈ d e p a r t m e n t instructor⋈department instructor⋈department |
| × \times × (Cartesian product) | 从两个输入关系中输出所有的元组对 | i n s t r u c t o r × d e p a r t m e n t instructor \times department instructor×department |
| ⋃ \bigcup ⋃ (Union) | 输出两个输入关系中元组的并 | Π n a m e ( i n s t r u c t o r ) ⋃ Π n a m e ( s t u d e n t ) \Pi_{name}(instructor) \bigcup \Pi_{name}(student) Πname(instructor)⋃Πname(student) |
| − - − (Set Difference) | 输出两个输入关系中元组的差 | Π n a m e ( i n s t r u c t o r ) − Π n a m e ( s t u d e n t ) \Pi_{name}(instructor) - \Pi_{name}(student) Πname(instructor)−Πname(student) |
例题:
(1)
Π
p
e
r
s
o
n
_
n
a
m
e
(
σ
c
i
t
y
=
"
M
i
a
m
i
"
(
e
m
p
l
o
y
e
e
)
)
\Pi_{person\_name}(\sigma_{city="Miami"}(employee))
Πperson_name(σcity="Miami"(employee))
(2)
Π
p
e
r
s
o
n
_
n
a
m
e
(
e
m
p
l
o
y
e
e
⋈
σ
s
a
l
a
r
y
>
100000
(
w
o
r
k
s
)
)
\Pi_{person\_name}(employee⋈\sigma_{salary>100000}(works))
Πperson_name(employee⋈σsalary>100000(works))
(3)
Π
p
e
r
s
o
n
_
n
a
m
e
(
σ
c
i
t
y
=
"
M
i
a
m
i
"
(
e
m
p
l
o
y
e
e
)
⋈
σ
s
a
l
a
r
y
>
100000
(
w
o
r
k
s
)
)
\Pi_{person\_name}(\sigma_{city="Miami"}(employee)⋈\sigma_{salary>100000}(works))
Πperson_name(σcity="Miami"(employee)⋈σsalary>100000(works))
(4)
Π
p
e
r
s
o
n
_
n
a
m
e
,
c
i
t
y
(
e
m
p
l
o
y
e
e
⋈
σ
c
o
m
p
a
n
y
_
n
a
m
e
=
"
F
i
r
s
t
B
a
n
k
C
o
r
p
a
r
a
t
i
o
n
"
(
w
o
r
k
s
)
)
\Pi_{person\_name, city}(employee⋈ \sigma_{company\_name="First Bank Corparation"}(works))
Πperson_name,city(employee⋈σcompany_name="FirstBankCorparation"(works))
(5)
Π
p
e
r
s
o
n
_
n
a
m
e
,
s
t
r
e
e
t
,
c
i
t
y
(
e
m
p
l
o
y
e
e
⋈
σ
c
o
m
p
a
n
y
_
n
a
m
e
=
"
F
i
r
s
t
B
a
n
k
C
o
r
p
a
r
a
t
i
o
n
"
⋀
s
a
l
a
r
y
>
10000
(
w
o
r
k
s
)
)
\Pi_{person\_name, street, city}(employee ⋈ \sigma_{company\_name="First Bank Corparation"\bigwedge salary>10000}(works) )
Πperson_name,street,city(employee⋈σcompany_name="FirstBankCorparation"⋀salary>10000(works))
(6)
Π
p
e
r
s
o
n
_
n
a
m
e
(
σ
e
m
p
l
o
y
e
e
.
c
i
t
y
=
c
o
m
p
a
n
y
.
c
i
t
y
(
e
m
p
l
o
y
e
e
×
(
w
o
r
k
s
⋈
c
o
m
p
a
n
y
)
)
)
\Pi_{person\_name}(\sigma_{employee.city=company.city}(employee \times (works ⋈ company)))
Πperson_name(σemployee.city=company.city(employee×(works⋈company)))