关系数据库
绝大多数的数据库系统叫做关系数据库系统(relational database system), 他们是基于关系数据模型的(relation data model), 具有3大关键组成部分:结构(structure), 完整性(integrity), 语言(language):
1. 结构:定义数据的表示
2. 完整性:数据约束
3. 语言:提供了访问和操纵数据的方式
关系结构 (relational structures)
关系模型(relational Model)建立在简单自然的结构的基础之上,
Relation(关系):是一个没有重复行的表。
表的每一行(row)叫做一个记录(record/tuple), 表的一列(column) 表示单个属性值。
row 也叫 tuple(元组), column 也叫 attribute(属性)。
其他关于数据库中的文档中经常出现Relation,Tuple等词,实际上Relation为表,Tuple为记录:
Relation -> Table
Row -> Tuple
Column -> Attribute
完整性约束 (Integrity Constraints)
同一行中的数据相互关联,不同表中的数据也可能通过公共属性(common attributes) 相互关联。
完整性约束是指表中的有效数据应该满足的条件,分3种类型:域约束(domain constraints),主键约束(primary key constraints),外键约束(foreign key constraints)。
域约束和主键约束又称为内部约束(intrarelational constraints): 约束仅涉及到一个表。
外键约束又称为外部约束(interralational constraints): 约束涉及到多个表。
域约束 (Domain Constraints)
域约束指定属性的许可值(数据类型 + 值大小),可以在标准数据类型的基础上进一步缩小属性值的范围,比如学校的学分可以限定为 1 ~ 5 之间。属性值也可以为 null
,表示未知或不可用。
主键约束 (Primary Key Constraints)
超键(superkey) : 是一个属性或属性集,唯一标识表。也就是说,没有两个元组在超键上具有相同的值。
根据定义,一个表由互不重复的元组构成,表中所有属性的集合形成一个超键。
键K
是一个最小超键,一个表可以有多个键,这种情况下, 每一个键都叫一个候选键。数据库设计者指定候选键之一为主键,主键经常用于标识表中的元组。举例来说,Student
表中的StudentId
主键, Course
表中的CourseId
为主键。主键用于区分不同的记录。
对于 Enrollment 表 ssn + courseId
共同构成主键:它是唯一确定一个元组的最小元素集合。
Student Table
ssn | firstName | mi | lastName | phone | birthDate | street | zipCode | deptID |
---|---|---|---|---|---|---|---|---|
444111110 | Jacob | R | Smith | 9129219434 | 1985-04-09 | 99 K Street | 31435 | BIOL |
444111111 | John | K | Stevenson | 9129219434 | null | 100 M Street | 31411 | BIOL |
444111112 | George | K | Smith | 9129213454 | 1974-10-10 | 1200 A | 31419 | CS |
Enrollment Table(登记表)
ssn | courseId | dateRegistered | grade |
---|---|---|---|
444111110 | 11111 | 2004-03-19 | A |
444111110 | 11112 | 2004-03-19 | B |
444111110 | 11113 | 2004-03-19 | C |
444111111 | 11111 | 2004-03-19 | D |
Course Table
courseId | subjectId | courseNumber title | numOfCredits |
---|---|---|---|
11111 | CSCI 1301 | Introduction to Java I | 4 |
11112 | CSCI 1302 | Introduction to Java II | 3 |
11113 | CSCI 3720 | Database Systems | 3 |
外键约束 (Foreign Key Constraints)
关系数据库中,数据是相互关联。一个表中的元组相互关联。不同表中的元组通过他们的公共属性相互关联。通俗来讲,外键即为若干个表的公共属性。外键定义了表和表之间的关系。
正式地说:如果表R
中的一组属性FK
引用了表R
,FK
如果满足下列两条规则即为外键:
1. FK
中属性的域和 表T
中主键的域相同。
2. 表R
中FK
的一个nonnull
值必须匹配表T
中一个主键的值。
上面的3个表中,Enrollment表中的courseId
为 foreign key, 引用了Course表中的主键courseId
, Enrollment表中的每一个courseId
都必须匹配Course表中的一个courseId
值。
包含有 foreign key 的表叫child table, 被引用的表叫 referenced table 或 parent table。
创建Enrollment表的SQL命令:
create table Enrollment (
ssn char(9),
courseId char(5),
dateRegistered date,
grade char(1),
primary key (ssn, courseId),
foreign key (ssn) references
Student(ssn),
foreign key (courseId) references
Course(courseId)
);
Enrollment 表的 primary key为 ssn + courseId
, 有两个foreign key:ssn
和courseId
,Enrollment 为子表,Course 和 Student 均为父表。
强制要求完整性约束 (Enforcing Integrity Constraints)
数据库管理系统会自动强制要求完整性约束,用户任何违反完整性的操作都将被拒绝,例如:
1. 插入违反域约束的记录:例如插入记录(“11115,” “CSCI,” “2490,” “C++ Programming,” 0)到Course表,但credit小时必须大于0.
2. 插入与表中主键重复的记录:DBMS将报告错误,拒绝操作。
3. 试图从Course表中删除记录,但是由于其主键值被Enrollment中的记录引用,此操作也将被DBMS拒绝。
[1] Introduction to Java Programming 10th. 32.2
[2] https://en.wikipedia.org/wiki/Foreign_key
[3] https://en.wikipedia.org/?title=Primary_key&redirect=no