域、笛卡尔积、关系、元组、属性
- 域是一组具有相同数据类型的值的集合,比如整数,浮点数,无理数。或者{小明,小红,小丽,…}
- 笛卡尔积为域和域之间的运算,就是,遍历两个集合所有的可能组合。 D 1 × D 2 = { ( x , y ) } D_1 \times D_2=\{(x,y)\} D1×D2={(x,y)}
主码、候选码、外码
- 候选码是一个属性组,这个属性组能够唯一地标识一个元组(比如说居民身份证在国内唯一的标识了某一个确定的人),而其子集不能。
- 一个关系如果有多个候选码,选定一个作为主码,候选码的各个属性成为主属性
- F是R的外码,如果F满足:
F是R的一个或者一组属性,且F不是R的主码;
Ks是关系S的主码,而F与Ks相对应
比如,学生关系中的所选择的专业号这一属性,这与专业关系中的专业的专业号可以形成一一对应,那么这时我们称专业号是学生关系中的外码。并且,称学生关系为参照关系,专业关系为被参照关系;
注:外码可以为空,该例中表示未给学生分配专业。
关系模式,关系,关系数据库
-
关系,在用户看来,就是一张扁平的二维表。专业术语叫它:只包含单一的数据结构——关系
-
关系模式就是关系的描述, R ( U , D , D O M , F ) R(U,D,DOM,F) R(U,D,DOM,F),包括:
- U U U表示该关系的属性名集合,比如学生名,学号,…
- D D D表示属性中数据来自的域,比如字符串,数字串,…
- D O M DOM DOM为属性向域的映像集合,比如规定学生名中只能映射到{小明,小红,…}
- F F F为属性间的依赖关系,比如小红的学号是2015053078,而不是2015053071
- 关系数据库就是在一个给定的应用领域中,所有关系的集合。比如校园网系统,关系数据库就是包括学生学号关系,专业课关系,选课关系,课程老师关系,学生老师关系,…等等关系的集合
关系模型的完整性规则
-
实体完整性
主属性不能包含有空 -
参照完整性
外码可以为空,但是外码的取值范围一定是在被参照关系所对应属性中的取值。
比如,学生关系,其中的专业号引用了专业关系中的专业号,这时,学生关系中的专业号属性可以为空,表示暂时没有给这个学生分配专业,但是这个专业号不能是专业关系中不存在的专业号。
- 用户定义的完整性
就是说,为了满足用户的需求,我们额外给关系加上的约束条件就是用户定义完整性
比如,学生的成绩在0-100之间
关系运算
选择
σ
F
(
t
)
(
R
)
\sigma_{F(t)}(R)
σF(t)(R)
表示在
R
R
R关系中,使得
F
(
t
)
=
t
r
u
e
F(t)=true
F(t)=true的所有
t
t
t的集合,比如
σ
n
a
m
e
=
"
林
俊
杰
"
(
小
明
的
盆
友
们
)
\sigma_{name="林俊杰"}(小明的盆友们)
σname="林俊杰"(小明的盆友们)就是表示从小明的盆友们这个关系中选择出所有叫做林俊杰的个体出来。如果我们把关系理解成为一个表格的话,那么我们可以理解为这个式子的结果就是一行一行的数据,有几个人叫“林俊杰”,我们就有几行
投影
Π
A
(
R
)
=
{
t
[
A
]
∣
t
∈
R
}
\Pi_{A}(R)=\{t[A]|t\in R\}
ΠA(R)={t[A]∣t∈R}
比如说,
Π
n
a
m
e
,
g
e
n
d
e
r
(
小
明
的
盆
友
们
)
\Pi_{name, gender}(小明的盆友们)
Πname,gender(小明的盆友们)就表示输出两列,一列是小明的所有盆友的名字,另一列是所有盆友的性别。
连接
R
⋈
A
θ
B
S
=
{
t
r
t
s
^
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
θ
t
s
[
B
]
}
R\Join_{A \theta B} S = \{\widehat{t_r t_s}|t_r\in R \wedge t_s\in S \wedge t_r[A]\theta t_s[B]\}
R⋈AθBS={trts
∣tr∈R∧ts∈S∧tr[A]θts[B]}
其中
A
,
B
A, B
A,B是属性,大概的人意思就是对于关系
R
R
R和
S
S
S来说,只要有一部分的数据满足
A
A
A这些属性与
B
B
B这些属性有
θ
\theta
θ的关系,那么我们就把他们取出来,然后连接在一起。
比如
R
R
R中的属性有
n
a
m
e
,
s
t
u
d
e
n
t
i
d
name, student\ id
name,student id,
S
S
S中的属性有
s
t
u
d
e
n
t
i
d
,
c
o
u
r
s
e
n
a
m
e
student\ id, course\ name
student id,course name,那么我们这时候使用连接技能:
R
⋈
s
t
u
d
e
n
t
i
d
=
s
t
u
d
e
n
t
i
d
S
R \Join_{student\ id = student\ id} S
R⋈student id=student idS就是表示,如果
R
R
R的某些行和
S
S
S中的某些行的
s
t
u
d
e
n
t
i
d
student\ id
student id相同的话,我们就把他们连接在一起,并且作为连接的输出。
像集
有一个关系
R
(
X
,
Z
)
R(X, Z)
R(X,Z)其中
X
X
X和
Z
Z
Z是属性,那么
Z
x
Z_x
Zx表示
{
t
[
Z
]
∣
t
∈
R
,
t
[
X
]
=
x
}
\{t[Z]|t\in R, t[X]=x\}
{t[Z]∣t∈R,t[X]=x},就是从中找到满足
t
[
X
]
=
x
t[X]=x
t[X]=x的那些行,然后求它们所对应的
t
[
Z
]
t[Z]
t[Z]值
除
终于说到的真正想说的运算了,有点小复杂。
R
÷
S
=
{
t
r
[
X
]
∣
t
r
∈
R
∧
Π
Y
(
S
)
⊆
Y
x
,
x
=
t
r
[
X
]
}
R\div S=\{t_r[X]|t_r\in R \wedge \Pi_Y(S)\subseteq Y_x, x=t_r[X]\}
R÷S={tr[X]∣tr∈R∧ΠY(S)⊆Yx,x=tr[X]}
=
{
x
∣
t
r
∈
R
∧
Π
Y
(
S
)
⊆
Y
x
}
=\{x|t_r\in R \wedge \Pi_Y(S)\subseteq Y_x\}
={x∣tr∈R∧ΠY(S)⊆Yx}这里我们还是选择举个栗子来说明吧。
在这里,
X
X
X属性在这里为
A
A
A,
Y
Y
Y属性在这里为
B
,
C
B,C
B,C,所以
x
x
x可能的取值为
{
a
1
,
a
2
,
a
3
,
a
4
}
\{a_1,a_2,a_3,a_4\}
{a1,a2,a3,a4}; 所以
Y
x
Y_x
Yx的所有可能取值为
Y
x
=
a
1
=
{
(
b
1
,
c
2
)
,
(
b
2
,
c
3
)
,
(
b
2
,
c
1
)
}
Y_{x=a_1}=\{(b_1,c2),(b2,c3),(b_2,c_1)\}
Yx=a1={(b1,c2),(b2,c3),(b2,c1)}或者
Y
x
=
a
2
{
(
b
3
,
c
7
)
,
(
b
2
,
c
3
)
}
Y_{x=a_2}\{(b_3,c_7),(b_2,c_3)\}
Yx=a2{(b3,c7),(b2,c3)}或
Y
x
=
a
3
=
{
(
b
4
,
c
6
)
}
Y_{x=a_3}=\{(b_4,c_6)\}
Yx=a3={(b4,c6)}或者
Y
x
=
a
4
=
{
(
b
6
,
c
6
)
}
Y_{x=a_4}=\{(b_6,c_6)\}
Yx=a4={(b6,c6)}
而
Π
Y
(
S
)
=
Π
Y
(
B
,
C
)
=
{
(
b
1
,
c
2
)
,
(
b
2
,
c
1
)
,
(
b
2
,
c
3
)
}
\Pi_{Y}(S)=\Pi_{Y}(B,C)=\{(b_1,c_2),(b_2,c_1),(b_2,c_3)\}
ΠY(S)=ΠY(B,C)={(b1,c2),(b2,c1),(b2,c3)},不难观察出使得
Π
Y
(
S
)
⊆
Y
x
\Pi_Y(S)\subseteq Y_x
ΠY(S)⊆Yx的
x
x
x只有
a
1
a_1
a1,所以结果就是
a
1
a_1
a1啦!