第三章 关系模型.
关系数据模型之前较老的数据模型有:层次模型和网络模型。
与早期的数据模型相比,关系模型的主要有点是数据表述简单。
数据定义语言(Data Definition Language DDL)
完整性约束:在数据模型中,需要提供的一系列的结构来表达数据必须满足的约束条件。
关系模型中用于描述数据的主要结构是关系。一个关系由关系模式和关系实例共同组成。
关系模式需要给出关系名,每个字段(称之为列或属性)的名称,以及每个字段的域。
关系模式中的域约束指定了关系的每个实例必须满足的条件。
关系的度(degree,也成为arity)是指字段的数目。
关系实例的基(cardinality)是指该关系实例具有记录的数目。
关系数据库模式可以看成是数据库中关系模式的集合。
支持创建,删除,修改关系表的SQL子集称为数据定义语言DDL。
SQL分为DDL, DML(数据库操作语言,SELECT UPDATE INSERT DELETE), DCL(数据库控制语言):
创建:
插入:
INSERT INTO Students (sid, name, login, age, gpa) VALUES (..., ...., ...., ... ,...)
在字段值次序正确的情况下,可以省略字段名列表。但是加上去会更加清晰。
删除:
DELETE FROM student S WHERE S.name = ‘。。。’
UPDATE:更新字段值
UPDATE Student S SET S.age = S.age + 1 WHERE S.sid = 123456
关系的完整性约束:数据库模式定义时指定的约束条件。
键约束:指关系具有一个特定的最小字段集合,通过它可以唯一确定每条记录。
能够唯一确定每条记录的关系的字段称为关系的候选键。
不存在键字段集合的一个子集,通过该子集能够唯一确定每条记录。
例如:由于字段集合{sid, name}存在一个子集合{sid}是关系的键,所以{sid, name}不是关系的Students的键。这里的{sid,name}称为超键。
一个关系可以有若干个候选键。例如Students中的字段login和age组合起来可以唯一确定学生的记录,所以{login, age}也是键。
主码:primary key。
在SQL中的UNIQUE语句来将关系表的某些字段集合声明为键.
UNIQUE (name, age)的意思是将{name, age}的组合作为码。
CONSTRAINT来命名一个约束,这样当违反了约束使,系统能够返回约束名,用于对错误定位
CONSTRAINT StudentsKey PRIMARY KEY(SID)
外键约束:
引用关系的外码必须与被引用关系的主码相匹配,字段的数目以及数据类型都要相同,但字段名可以不同。
外键也可以指向本关系。例如拓展关系Students增加字段partner,并声明为指向关系Students的外键。
FOREIGN KEY(grader) REFERENCES Students(sid)
FOREIGN KEY(sid) REFERENCES Students
PRIMARY KEY(sid, cid)
取值范围约束,主码约束,外码约束
一般约束:
当前关系数据库以表约束(table constraints)或者断言(assertions)的形式支持一般约束。
表约束与某个表相关联,当对关系表进行修改时,需要检查是否违反约束。
断言一般涉及多个表,当其中任何一个表修改时,都需要检查其他表是否违反约束。
SQL提供了一些方法来处理外码约束问题,我们需要考虑一下三个问题:
1.如果向引用表中插入的记录,其字段X的值不存在于被引用表中,是否应该继续执行?
2.如果删除被引用表的一条记录,应该怎么做?
(1)删除引用表中所有相应的记录
(2)如果有引用表记录指向要删除的被引用表记录,则不允许删除
(3)对于引用表中的相应记录,将其外键值改为某些默认值
(4)将其外键值改为null
3.如果修改被引用表的某条记录的主码值,应该怎么做?
NO ACTION :违反约束时操作被拒绝执行。
CASCADE(串联):如果删除一条被引用表记录,则引用表的相应记录也将被删除
例如:
FOREIGN KEY KEY (studid) REFERENCES Students,
ON DELETE CASCADE,
ON UPDATE NO ACTION)
在删除一条记录时,设置默认值ON DELETE SET DEFAULT,例如在定义sid字段时可以指定默认的学生,sid CHAR(20) DEFAULT ‘123456’
或者设置为NULL, ON DELETE SET NULL。
事务与约束:
在一个数据库上运行的程序成为事务,它可以包含若干条访问数据库的语句。
SQL允许一个约束被设定为推迟(DEFERRED deferred)或者立即执行(IMMEDIATE)模式
SET CONSTRAINT ConstraintFoo DEFERRED
查询语句
SELECT * FROM Student S WHERE S.age < 18
用*符号表示我们希望查询结构包括选中记录的所有字段。
联系集也可以映射到关系模型中的某个关系。
联系集应包括以下属性:来自参与实体的主码属性,作为外码字段。和联系集的描述属性
联系集中的非描述性的属性集可9以作为关系的超键(superkey),如果联系没有键约束,那么这个属性集就成为一个候选键。
如果用一个超键作为主键的话,那么这个超键的组成属性不允许其值为null,对这些字段也就隐含有NOT NULL的约束。
使用角色指示器来生成有意义的字段名:
如果不使用SQL提供的表约束和断言功能,许多参与约束都无法表达。
当联系集的所有参与实体都具有键约束和完全参与时,这种情况下最后的转换方法就是将所有实体和联系一起映射到一个单独的表。
!转换带有码约束的联系集P57
!转换带有参与约束的联系集P58
未完,待补充