数据库原理与应用(2)数据模型、关系模式、实体间联系、E-R图、主键、外键、约束
【概念】
实体:实体是客观存在且具有公共性质的可相互区别的现实世界对象的集合,像是学生、商品、学位、职称、选课等。
实例:实体中每个具体的记录都叫做示例,像是一头牛、一匹马等。

属性:实体具有的某一特征或性质,像是性别、年龄等。属性是区分不同实体的依据。
型:对实体中数据结构和属性的说明,比如说学生实体具有由学号、姓名、性别、出生日期等属性构成的记录型。
值:具体的一条示例所有属性集合(1534677781343,李明,男,2001.1.3)就是学生李明数据记录的值。


键:唯一标识实体的属性集,也叫做码或关键字。例如,学号是学生实体的键,对于实例:1534677781343,李明,男,2001.1.3,通过学号1534677781343唯一指定李明。
候选码:关系中的一个属性可以唯一标识一个数据记录,像是我们可以通过学号1534677781343唯一指定李明,那么学号就可以作为候选码;而我们不可以通过性别男来唯一指定李明,因为男生不止他一个,所以性别就不可以作为候选码。一个关系中候选码可以有多个,候选码不可以为空,也没有多余属性。
一个关系模式中可以有多个候选码。
主键:分为单字段主键和组合主键。其中组合主键可由表中多个字段(属性)组合而成。在这里仅介绍单字段主键,也叫做主码或主关键字。它是某个能够唯一标识一条记录的属性,是从候选码中人为挑选的一个。
一个关系模式中只有一个主键。主键不能为空值。
主键的功能主要体现在唯一(UNIQUE)和非空(NOT NULL)功能上,定义为主键即默认唯一且非空。
主键的删除只是删除了指定的主键约束,并不能够删除字段。
关系表中不允许存在无主码、主码值相同的记录。
外键:子数据表中出现的父数据表的主键,称为子数据表的外键。外键要么与父表主码的值相同,要么取空值。
子数据表中出现的父数据表的主键与父数据表原有主键的字段名可以不同,只要定义在相同的域即可。
创建外键时,设置的字段和关联的字段必须具有相同的数据类型。
外键约束中,主表和从表(也可以叫父表和子表)可以是1张表,也可以是2张表。
在这里举一个例子。
【例1】borrow表(子表)的读者编号(rID)需要出现reader表(父表)的reader_ID主键作为它的外键,从而为borrow表添加参照完整性约束。
1.建表代码:
2. 在borrow表中添加外键。

外键名:可以不填, 系统自动生成,也可以自己写一个上去。
字段:子表中设置为外键的字段,也就是要在子表中出现的父表的主键。
被引用的模式:两张表所在的数据库名。
被引用的表(父):父表名。
被引用的字段:父表中要出现在子表中的主键名。
删除时/更新时:设置为CASCADE,也就是关联的表更新后,此表同步更新。
*提示:如果rID不允许为空则当,选择删除时SET NULL就会出现Cannot add foreign key constraint的提示,这是因为删除置空有条件,必须满足字段允许为空。
3.两张表外观。


4. 外键约束
district:严格模式(默认),父表不能删除或更新一个已经被子表数据引用的记录;
cascade:级联模式,父表的操作,对应子表关联的数据也跟着被删除;
set null:置空模式,父表的操作之后,子表对应的数据(外键字段)被置空。

域:属性的取值范围。例如性别的域为(男,女),手机号域为11位整数。
实体型:用实体名和属性名集合来抽象和刻画同类实体,例如学生(学号、姓名、性别、出生日期)就是一个实体型。
实体集:同类实体的集合。例如全体学生就是学生实体的一个实体集。

实体间的联系:
一对一联系(1:1):例如班级和班长之间就是一对一联系,一个班级只有一个班长。
一对多联系(1:n):例如一个班级有一个辅导员,但担任辅导员的老师可以同时担任其他班级的辅导员,所以辅导员和班级之间就是一对多联系。
多对多联系(m:n):例如一个学生可以学习多门课程,每门课程也可以有多个学生,那么学生和课程之间的关系就是多对多联系。
【例2】某校学生、教师和课程实体对应的关系模式如下:学生(学号,姓名,性别,年龄,家庭住址,电话)课程(课程号,课程名)教师(职工号,姓名,年龄,家庭住址,电话)如果一个学生可以选修多门课程,一个课程可以多个学生选修;一个教师只能讲授一门课程,但是一门课程可以由多个教师讲授。则学生和课程之间是一个的关系模式。
A. 不需要增加一个新的关系模式,不需做其他改变
B. 不需要增加一个新的关系模式,只需要将1端的码插入到多端
C. 需要增加一个新的选课关系模式,该模式的主键为课程号
D. 需要增加一个新的选课关系模式,该模式的主键为课程号和学号
在这里,每个学生和课程是一对多关系,课程和教师是多对多关系。那么问题中学生和课程的表述就应该理解为一个学生选择课程,那学生就是1端,课程就是多端,如果把1端的码插入到多端的话,插过去的码(学号、姓名、性别)没有对应的值,这时候就需要增加一个新的选课关系模式,用两个主键对两端中包含的元组进行标识,主键需要可以做到唯一标识一条数据记录,那就选择课程号和学号作为主键。
【例3】某医院数据库的部分关系模式为:科室(科室号,科室名,负责人,电话)、病患(病历号、姓名、住址、联系电话)和医生(职工号、医生姓名、科室号、住址,联系电话)。假设每个科室有一名负责人和一部电话,每个科室有若干医生,一名医生只能属于一个科室;一个医生可以为多个病患看病;一个病患可以由多个医生诊治。则就诊关系的主键是_________。
这里如果想实现唯一标识一条数据记录的话就需要选择病历号、职工号、就诊时间作为主键。因为一个病患可以在不同时间来多次就诊,可能是不同的医生为他进行诊治,一个医生一天也可以为很多病患进行诊治,为了排除这些不确定性,我们就需要三个属性作为主键。

【E-R图】
实体用矩形表示,属性用椭圆形表示,联系用菱形表示。
过程:确定实体集、确定联系和联系类型、设计局部及整体的E-R图、确定属性、优化E-R图。

E-R图可将现实世界的信息抽象地表示为实体及实体间的联系。
E-R用于描述数据库的概念模型。

【关系的完整性】
实体完整性:关系的主码不能重复也不能取空值。实体完整性通过主键实现。
参照完整性:参照完整性是定义主码和外码间的引用规则。
外码要么与父表主码的值相同,要么取空值。参照完整性通过外键实现。
用户定义完整性:用户自定义的约束条件。
非空约束、唯一约束、默认约束、自增约束、检查约束均属于用户自定义完整性约束。
关系的完整性约束仅包括实体完整性、参照完整性、用户定义完整性。
默认约束:DEFAULT约束。每个字段只能定义一个默认约束,不能在设置为自动编号的属性的字段上创建默认约束,默认约束可以为空值。
默认值约束字段,其默认值可以由用户自定义。
唯一约束:UNIQUE约束是列约束或表约束,它定义了将列或列组中的值约束为唯一的规则。定义了该约束的字段,所有记录都不能是重复的。
非空约束:指字段的值不能为空。 对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
非空约束限制是指该字段中的内容不能为空,但可以是空白字符串(NULL)或0。
没有设置非空的唯一性约束字段,可以有零个或者多个NULL数据。
自增约束:当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1。
一个表中只能有一个字段定义自增约束。
定义自增约束的字段的数据类型必须是整数类型,像TINYINT、SMALLINT、INT、BIGINT之类。
定义自增约束的字段必须具有NOT NULL属性。
自增约束的最大值受数据类型限制,达到上限后自增约束失效。
有外键约束的字段不可添加自增约束。
检查约束:检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。
完整性检查和控制的防范对象是非法用户、非法操作和符合语义的数据。

【关系模式、数据模型】
关系模式分为外模式(用户数据库)、模式(概念模式或逻辑模式,用于描述一个数据库的整体逻辑结构和特征)和内模式(描述数据在存储介质上的存储方式和物理结构)。
关系模式是对关系结构的表示。模式的表示方式通常形式是:关系名(属性1,属性2,....,属性n)。关系模式中,属性的顺序可以发生变化。
关系中元组的先后顺序可以颠倒,但是不能出现重复元组。
关系模型中,一个码由一个或多个属性组成,其值能够惟一标识关系中一个元组。
关系模型是一种逻辑模型。
数据库中的数据是不断更新的,但关系模式不变。
数据模型要容易被用户看懂,不必过于专业。
数据模型的特征主要有能比较真实地模拟现实世界、容易为人所理解、便于在计算机上实现。
数据模型的要素有数据结构、数据约束条件和数据操作。
数据结构是对数据类型、数据类型之间的联系的描述。
概念模型是现实世界的第一层抽象,这一类模型中最著名的模型是实体-关系模型。
对于现实世界中事物的特征,在实体-联系模型中属性来描述。
1:1关系模式的转换,直接将一个实体的主键插入到另一实体中作为外键产生联系。
1:n这种关系模式转换,一般是将1的主键插入到n的表中作为外键,以此产生联系。
m:n关系模式转换,一般会因为联系产生新的属性,联系会转化成关系模型,要将两个实体的主键都插入到新的关系模式中。

【数据库】
关系数据库的基本特征是不同列应有不同的列名、与行和列的次序无关。
表中的行称为一个元组,也称一个记录;表的每一列叫做字段或属性;表的每一列的所有取值范围称为域。
关系数据库采用关系模型对数据库的概念模式进行描述。
在一个关系中,记录(元组)不可重复,字段名(属性名)不可重复,属性的顺序可以任意调换,行的顺序也可以任意调换。
使用二维表存储数据的数据库是关系型数据库。