第1章 数据库设计基础

当今的时代是一个信息化的时代,信息成为一种重要的战略资源,对信息的占有和利用成为衡量一个国家、地区、组织或企业综合实力的一项重要指标。随着社会各行各业信息化的飞速发展,人们的知识也以惊人的速度增长,如何有效地组织和利用如此庞大的知识,以及如何合理地管理和维护如此海量的信息,都要依靠数据库。数据库技术是数据管理的核心技术,主要研究如何科学地组织、存储和管理数据库中的数据,以提供可共享、安全、可靠的数据。

1.1 数据库设计概述

数据库(Database,DB)是“按照某种数据结构对数据进行组织、存储和管理的容器”,简单地说就是用来存储和管理数据的容器。数据库系统(Database System,DBS)是指在计算机中引入数据库后的系统,一般由数据库、数据库管理系统、应用程序和数据库管理员组成。数据库管理系统(Database Management System,DBMS)是一个管理、控制数据库容器中各种数据库对象的系统软件。数据库用户无法直接通过操作系统获取数据库文件中的具体内容,数据库管理系统则可以通过调用操作系统的进程管理、内存管理、设备管理及文件管理等服务,为数据库用户提供管理、控制数据库中各种数据库对象和数据库文件的接口,从而实现对数据库中具体内容的获取。数据库管理系统按照一定的数据模型组织数据,常用的模型包括“层次模型”“网状模型”“关系模型”及“面向对象模型”等,基于“关系模型”的数据库管理系统称为关系数据库管理系统(Relational Database Management System,RDBMS)。

1.1.1 关系数据库概述

关系数据库的概念是由E.F.Codd博士于1976年发表的《关于大型共享数据库数据的关系模型》论文中提出的,论文中阐述了关系数据库模型及其原理,并将其用于数据库系统。

使用关系模型对数据进行组织、存储和管理的数据库称为关系数据库,关系数据库系统是支持关系数据模型的数据库系统。在关系数据库中,所谓的“关系”,实际上是一张二维表,表是逻辑结构而不是物理结构,系统在物理层可以使用任何有效的存储结构来存储数据,如顺序文件、索引、哈希表和指针等,因此,表是对物理存储数据的一种抽象表示,即对许多存储细节的抽象,如存储记录的位置、记录的顺序、数据值的表示,以及记录的访问结构(如索引)等。

关系数据库要求将每个具有相同属性的数据独立存放在一张表中,克服了层次数据库横向关联不足的缺点,也避免了网状数据库关联过于复杂的问题,因此被广泛应用。

1.1.2 结构化查询语言SQL

结构化查询语言(Structured Query Language,SQL)是一种专门用来与数据库通信的语言,其利用一些简单的句子构成基本的语法来存取数据库中的内容,便于用户从数据库中获得和操作所需数据。例如,删除“选课系统”中课程表(course)的所有记录,一条delete from course语句就可以做到。

SQL语言具有以下特点。

1)SQL语言是非过程化语言。

SQL语言允许用户在高层的数据结构上工作,而不对单个记录进行操作,可以操作记录集。SQL语句接受集合作为输入,返回集合作为输出。在SQL语言中,用户只需要在程序中说明“做什么”,无须说明“怎样做”,即无须用户指定对数据存放的方法。

2)SQL语言是统一的语言。

SQL语言适用于所有用户的数据活动类型,即SQL语言可用于所有用户,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员,以及许多其他类型的终端用户对数据库等数据对象的定义、操作和控制活动。

3)SQL语言是关系数据库的公共语言。

用户可将使用SQL的应用从一个关系型数据库管理系统转移到另一系统。

SQL语言由4部分组成。

1)数据定义语言(Data Definition Language,DDL)。

DDL用来定义数据的结构,是对数据的格式和形态进行定义的语言,主要用于创建、修改和删除数据库对象、表、索引、视图及角色等,常用的数据定义语言有CREATE、ALTER和DROP等。

每个数据库要建立时首先要面对一些问题,例如,数据与哪些表有关、表内有什么栏目主键,以及表与表之间互相参照的关系等,这些都需要在设计开始时就预先规划好,所以,DDL是数据库管理员和数据库拥有者才有权操作的用于生成与改变存储结构的命令语句。

2)数据操纵语言(Data Manipulation Language,DML)。

DML用于读取和操纵数据,数据定义完成后接下来就是对数据的操作。数据的操作主要有插入数据(insert)、查询数据(query)、更改数据(update)和删除数据(delete)4种方式,即数据操纵主要用于数据的更新、插入等操作。

3)数据控制语言(Data Control Language,DCL)。

DCL用于安全性控制,如权限管理、定义数据访问权限、进行完整性规则描述及事务控制等,其主要内容包括以下3方面。

● 用来授予或回收操作数据库的某种特权。

● 控制数据库操纵事务发生的时间及效果。

● 对数据库实行监视。

4)嵌入式SQL语言的使用规定。

嵌入式SQL语言(Embed SQL)主要涉及SQL语句嵌入在宿主语言程序中的规则。SQL通常有两种使用方式:练级交互使用方式(命令方式)和嵌入某种高级程序设计语言的程序中(嵌入方式),两种使用方法虽然不同,但是SQL语言的语法结构一致。

根据SQL语言的4个组成部分可以得到SQL的数据定义、数据查询、数据操纵及数据控制的4个基本功能,表1-1列出了实现其功能的主要动词。

1-1 SQL功能及包含的主要动词

978-7-111-56699-1-Chapter01-1.jpg

经过多年发展,SQL成为一种应用最广泛的关系数据库语言,并定义了操作关系数据库的标准语法。为了实现更强大的功能,各关系数据库管理系统通过增加语句或指令的方式对SQL标准进行了各自的扩展,如Oracle的PL/SQL、SQL Server的T-SQL等。MySQL也对SQL标准进行了扩展,如MySQL命令“show database;”用于查询当前MySQL服务实例所有的数据库名。

为了区分SQL扩展与SQL标准,本书将符合SQL标准的代码称为“SQL语句”,如delete from course,把MySQL对SQL标准进行的扩展代码称为“MySQL命令”,如“show database;”。

1.1.3 数据库设计的基本步骤

按照规范设计的方法,同时考虑数据库及其应用系统开发的全过程,可以将数据库设计分为以下6个阶段。

1.需求分析阶段

需求分析是数据库设计的第一步,也是整个设计过程的基础,本阶段的主要任务是对现实世界要处理的对象(公司、部门及企业)进行详细调查,在了解现行系统的概况、确定新系统功能的过程中,收集支持系统目标的基础数据及其处理方法。

需求分析是在用户调查的基础上,通过分析,逐步明确用户对系统的需求,包括数据需求和围绕这些数据的业务处理需求。用户调查的重点是“数据”和“处理”。通过调查要从用户处获得对数据库的下列要求。

● 信息需求。定义所设计数据库系统用到的所有信息,明确用户将向数据库中输入什么样的数据,从数据库中要求获得什么样的内容,将要输出什么信息。即明确在数据库中需要存储什么数据,对这些数据将做什么处理等,同时还需要描述数据之间的联系。

● 处理需求。定义系统数据处理的操作功能,描述操作的优先次序,包括操作的执行频率和场合,操作与数据间的联系。要明确用户需要完成哪些处理功能,每种处理的执行频度,用户需求的响应时间,以及处理方式等。

● 安全性与完整性要求。安全性要求描述系统中不同用户对数据库的使用和操作情况,完整性要求描述数据之间的管理关系及数据的取值范围要求。

在数据分析阶段不必确定数据的具体存储方式,这些问题留待进行物理结构设计时再考虑。需求分析是整个数据库设计中最重要的一步,为后续的各个阶段提供充足的信息,如果把整个数据库设计看做一个系统工程,那么需求分析就是该系统工程最原始的输入信息,需求分析不充分,会导致整个数据库重新返工。

2.概念结构设计阶段

概念结构设计阶段是整个数据库设计的关键。通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。

概念结构设计的策略主要有以下几种。

● 自底向上。先定义每个局部应用的概念结构,然后按一定的规则把它们集成起来,从而得到全局概念结构。

● 自顶向下。先定义全局概念结构,然后逐步细化。

● 自内向外。先定义最重要的核心结构,然后逐步向往扩展。

● 混合策略。先用自顶向下的方法设计一个概念结构的框架,然后以它为框架再用自底向上策略设计局部概念结构,最后集成。

3.逻辑结构设计阶段

逻辑结构设计阶段将概念结构转换为某个DBMS所支持的数据模型,并将其性能进行优化。

逻辑结构设计一般包含两步。

● 将概念结构转换为某种组织层数据模型。

● 对组织层数据模型进行优化。

4.数据库物理结构设计阶段

数据库物理结构设计阶段是利用数据库管理系统提供的方法和技术,对已经确定的数据库逻辑结构,以较优的存储结构、数据存取路径、合理的数据存储位置及存储分配,设计出一个高效的、可实现的物理数据库结构。

数据库物理结构设计通常分两步。

● 确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构。

● 对物理结构进行评价,评价的重点是时间和空间效率。

如果评价的结果满足原设计要求,则可以进入数据库实施阶段,否则,需要重新设计或修改物理结构,有时甚至需要返回到逻辑设计阶段修改数据模式。

若物理数据库设计得合理,可以使事务的响应时间短,存储空间利用率高,事务吞吐量大。在设计数据库时,首先要对经常用到的查询和对数据进行更新的事务进行详细的分析,获得物理结构设计所需的各种参数。其次,要充分了解所使用的DBMS的内部特征,特别是系统提供的存取方法和存储结构。

通常关系数据库的物理结构设计主要包括以下内容。

● 确定数据的存取方法。

● 确定数据的存储结构。

5.数据库实施阶段

在数据库实施阶段运用DBMS提供的数据语言(如SQL)及宿主语言(如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。

6.数据库运行与维护阶段

数据库应用系统经过试运行后即可投入正式运行,在运行过程中需要不断对其进行调整、修改与完善。

图1-1给出了各阶段的设计内容及各阶段的设计描述。

978-7-111-56699-1-Chapter01-2.jpg

图1-1 数据库设计阶段及内容描述

设计一个完善的数据库应用系统需要上述6个阶段的不断反复。在设计过程中,应把数据库的结构设计和数据处理的操作紧密结合起来,这两个方面的需求分析、数据抽象、系统设计及实现等各阶段应同时进行,互相参照和互相补充。

1.2 关系模型

关系模型是目前最重要的也是应用最广泛的数据模型。简而言之,关系就是一张二维表,由行和列组成。关系模型将数据模型组织成表格的形式,这种表格在数学上称为关系。

1.2.1 数据库和表

关系数据库是由多个表和其他数据库对象组成的,表是一种最基本的数据库对象,由行和列组成,类似电子表格。一个关系数据库通常包含多个二维表(称为数据库表或表),从而实现所设计的应用中各类信息的存储和维护。在关系数据库中,如果存在多个表,则表与表之间也会因为字段的关系产生关联,关联性由主键和外键所体现的参照关系实现。关系数据库不仅包含表,还包含其他数据库对象,如关系图、试图、存储过程和索引等,所以,通常提到的关系数据库就是指一些相关的表和其他数据库对象的集合。例如,表1-2所示的课程表中收集了教师申报课程的相关信息,包括课程名、课程编号、人数上限、授课教师、课程性质及课程状态信息,构成了一张二维表。

1-2 课程表(二维表实例)

978-7-111-56699-1-Chapter01-3.jpg

1.2.2 列和行

数据表中的列也称为字段,用一个列名(也称为字段名)标记。除了字段名行,表中每一行都称为一条记录。例如,表1-2中共有4个字段、4条记录。如果想查找“MySQL数据库设计”这门课程的授课教师,则可以查找“MySQL数据库设计”所在的行与字段“授课教师”所在的列关联相交处获得。初看上去,关系数据库中的一个数据表与一个不存在“合并单元”的Excel相似,但是同一个数据表的字段名不允许重复,而且为了优化存储空间,便于数据排序,数据库表的每一列要求指定数据类型。

1.2.3 主键与外键

关系型数据库中的一个表由行和列组成,并且要求表中的每行记录必须唯一。在设计表时,可以通过定义主键(primary key)来保证记录(实体)的唯一性。一个表的主键由一个或多个字段组成,值具有唯一性,且不允许去控制,主键的作用是唯一地标识表中的每一条记录。例如,在表1-3中,可以用“学号”字段作为主键,但是不能使用“姓名”字段作为主键,因为存在同名现象,无法保证唯一性,有时候表中也有可能没有一个字段具有唯一性,即没有任何字段可以作为主键,这时可以考虑使用两个或两个以上字段的组合作为主键。

1-3 主键外键关系

978-7-111-56699-1-Chapter01-4.jpg

为表定义主键时需要注意以下几点。

● 以取值简单的关键字作为主键。例如,如果学生表存在“学号”和“身份证号”两个字段,建议选取“学号”作为主键,对于开发人员来说“学号”的取值比“身份证号”取值简单。

● 不建议使用复合主键。在设计数据库表时,复合主键会给表的维护带来不便,因此不建议使用,对应存在复合主键的表,建议向表中添加一个没有实际意义的字段作为该表的主键。

● 以添加一个没有实际意义的字段作为表的主键的方式来解决无法从已有字段选择主键或者存在复合主键的问题。例如,在课程表中如果没有包含“课程编号”这个字段,此时因为“课程名”可能重复,课程表就没有关键字,开发人员可以在课程表中添加一个没有实际意义的字段,如“课程号”作为该表的主键。

● 当数据库开发人员向数据库中添加一个没有实际意义的字段作为表的主键时,建议该主键的值由数据库管理系统或者应用程序自动生成,既方便、又避免了人工录入人为操作引入错误的几率。

一个关系型数据库可能包含多个表,可以通过外键(foreignkey)使这些表关联起来。如果在表A中有一个字段对应表B中的主键,那么该字段称为表A的外键。该字段出现在表A中,但由它所标识的主题的详细信息存储在表B中,对表A来说这些信息是存储在表的外部的,因此称为外键。

如表1-3中所示的学生成绩表中有两个外键,一个是“学号”,其详细信息存储在“学生表”中;一个是“课程编号”,其详细信息存储在“课程表”中。“成绩表”和“学生表”中各有一个“学号”字段,该字段在“成绩表”中是外键,在“学生表”中则是主键,但这两个字段的数据类型及字段宽度必须保持一致,字段的名称可以相同,也可以不同。

1.2.4 约束

设计表时,可对表中的一个字段或多个字段的组合设置约束条件,由数据库管理系统(如MySQL)自动检测输入的数据是否满足约束条件,不满足约束条件的数据将被数据库管理系统拒绝录入。约束分为表级约束和字段级约束,表级约束是对表中几个字段的约束,字段级约束是对表中一个字段的约束。几种常见的约束形式如下。

1.主键约束

主键用来保证表中每条记录的唯一性,因此在设计数据库表时,建议为所有的数据库表都定义一个主键,用于保证数据库表中记录的唯一性。一张表只允许设置一个主键,这个主键可以是一个字段,也可以是一个字段组合(不建议使用复合主键)。单个字段作为主键时,使用字段级约束;用字段组合作为主键时,则使用表级约束。在录入数据的过程中,必须在所有主键字段中输入数据,即任何主键字段的值不允许为null。如果不在主键字段中输入数据,或输入的数据在前面已经输入过,则这条记录将被拒绝。可以在创建表时创建主键,也可以对表已有的主键进行修改或者增加新的主键。

2.外键约束

外键约束主要用于定义表与表之间的某种关系,对于表A来说,外键字段的取值是null,或者是来自于表B的主键字段的取值,表A和表B必须存放在同一关系型数据库中。外键字段所在的表称为子表,主键字段所在的表称为父表,父表与子表之间通过外健字段建立起了外键约束关系,即表A称为表B的子表,表B称为表A的父表。

创建表时建议先创建父表,然后再创建子表,并且建议子表的外键字段与父表的主键字段的数据类型数据长度相似或者可以相互转换(最好相同)。子表与父表之间的外键约束关系如下。

● 如果子表的记录“参照”了父表的某条记录,则父表中该记录的删除(delete)或修改(update)操作可能以失败告终。

● 如果试图直接插入(insert)或者修改(update)子表的“外键值”,子表中的“外键值”必须是父表中的“主键值”或者null,否则插入(insert)或者修改(update)操作失败。

MySQL的InnoDB存储引擎支持外键约束,而MySQL的MyISAM存储引擎暂时不支持外键约束。对于MyISAM存储引擎的表而言,数据库开发人员可以使用触发器“间接地”实现外键约束。

3.非空约束

如果在一个字段中允许不输入数据,可以将该字段定义为null,如果在一个字段中必须输入数据,则应当将该字段定义为not null。如果设置某个字段的非空约束,直接在该字段的数据类型后面加上not null关键字即可。当一个字段中出现null值时,意味着用户还没有为该字段输入值,非空约束限制该字段的内容不能为空,但可以是空白,所以null值既不等价于数值型数据中的0,也不等价于字符型数据中的空字符串。

4.唯一性约束

如果一个字段值不允许重复,则应当对该字段添加唯一性(unique)约束。与主键约束不同,一张表中可以存在多个唯一性约束,满足唯一性约束的字段可以取null值。如果设置某个字段为唯一性约束,直接在该字段的数据类型后面加上unique关键字即可。

5.默认约束

默认值字段用于指定一个字段的默认值,当尚未在该字段中输入数据时,该字段中将自动填入这个默认值。例如,可以为课程表(course)中的人数上限(up_limit)字段设置默认值90,则当尚未在该字段中输入数据时,该字段会自动填入默认值。如果设置某个字段的默认值约束,直接在该字段的数据类型后面加上“default默认值”即可。如果对一个字段添加了notnull约束,但又没有设置默认约束,则必须在该字段中输入一个非null值,否则会出现错误。

6.检查约束

检查(check)约束用于检查字段的输入值是否满足指定的条件,在表中输入或者修改记录时,如果不符合检查约束指定的条件,则数据不能写入该字段。例如,课程的人数上限必须在(90,100,120)整数集合中取值;一个人的性别必须在(‘男’,‘女’)字符串集合中取值;成绩表中的成绩字段需要满足大于等于0、并且小于等于100的约束条件等。这些约束条件都属于检查约束。MySQL暂时不支持检查(check)约束,数据库开发人员可以使用MySQL复合数据类型或者触发器“间接地”实现检查约束。

7.自增约束

自增(AUTO_INCREMENT)约束是MySQL唯一扩展的完整性约束,当向数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置自增约束时,一个数据库表中只能有一个字段使用该约束,该字段数据类型必须是整型类型。由于设置自增约束后的字段会生成唯一的ID,所以该字段也经常会被设置为主键。MySQL中通过SQL语句的AUTO_INCREMENT来实现。

8.删除约束

在MySQL数据库中,一个字段的所有约束都可以用altertable命令删除。

1.3 E-R图

关系数据库设计一般要从数据模型E-R图(Entity-RelationshipDiagram,E-R图)设计开始。E-R图既可以表示现实世界中的事物,又可以表示事物之间的关系,它描述了软件系统的数据存储需求,其中E表示实体,R表示关系,所以E-R图由实体、属性和关系3个要素构成,通过一组与实体、属性和关系相关的概念可以很好地描述信息世界。

1.3.1 实体和属性

1.实体

E-R图中的实体表示现实世界具有相同属性描述的事物的集合,它不是某一个具体事物,而是一类事物的统称。E-R图中的实体通常用矩形表示,如图1-2所示,把实体名写在矩形框内,实体中的每一个具体的记录值称为该实体的一个实例。在设计E-R图时,一个E-R图中通常包含多个实体,每个实体由实体名唯一标记。开发数据库时每个实体对应于数据库中的一张数据库表,每个实体的具体取值对应于数据库表中的一条记录。例如,在“选课系统”中,“课程”是一个实体,“课程”实体对应于“课程”数据库表,而“课程名”为MySQL数据库设计,“人数上限”为90的课程是课程实体的具体取值,对应于“课程”数据库表中的一条记录。

978-7-111-56699-1-Chapter01-5.jpg

图1-2 课程实体及属性

2.属性

E-R图中的属性通常表示实体的某种特征,也可以使用属性表示实体间关系的特征。一个实体通常包含多个属性,每个属性由属性名唯一标记,画在椭圆内,如图1-2所示,“课程”实体包含“课程名”“人数上限”“课程描述”“状态”4个属性。再如图1-3所示,“学生实体”可以由“学号”“姓名”“性别”“出生年月”“专业”和“联系方式”等属性组成,而(14180070,李天,男,1990-08,计算机科学与技术,2014)具体描述了一个名叫李天的学生对应的实例。E-R图中的实体的属性对应于数据库表的字段,例如图1-2中,“课程”实体具有“课程名”“人数上限”等属性,对应于课程数据库表的“课程名”字段及“人数上限”字段。在E-R图中,通常来说属性是一个不可再分的最小单元,如果属性能够再分,建议将该属性进行细分,或者将其“升格”为另一实体。例如,在图1-3所示的“学生”实体的“联系方式”属性中,如果细分为E-mail、QQ、固定电话和手机等联系方式,那么可以将“联系方式”属性进一步拆分为E-mail、QQ、固定电话和手机4个属性。

978-7-111-56699-1-Chapter01-6.jpg

图1-3 学生实体及属性

1.3.2 实体与属性之间的关系

在现实世界中,任何事物都不是孤立存在的,事物之间或事物内部是有联系的。这些联系在信息世界反映为实体间的关系和实体内部的关系。实体内部的关系是指组成实体的各属性之间存在的联系;实体之间的关系是指不同实体之间的联系。

E-R图中的关系主要用来讨论实体间存在的联系,在E-R图中,联系用菱形表示,菱形框内写明联系的名称,并且用连线将联系框与它所关联的实体连接起来,并且在连线旁边标明关系的类型,如图1-4所示。E-R图中实体间的关系类型一般有3种:一对一关系(1:1)、一对多关系(1:n)和多对多关系(m:n)。下面以两个实体间的关系为例来进一步说明这3种类型的关系。

1.一对一关系(1:1)

对于实体集A中的每一个实体,实体集B中至多有一个(可以没有)实体与之联系,反之亦然,则实体集A与实体集B具有一对一关系(1:1)。如图1-4a所示,对于初高中学校而言,每个班级只有一名班主任,而一名班主任只负责一个班级,则班级和班主任实体之间具有一对一关系。

2.对多关系(1:n)

对于实体集A中的每一个实体,实体集B中有n个实体(n≥0)与之联系,而对于实体级B中的每个实体,实体级A中至多只有一个实体与之联系,则称实体集A与实体集B具有一对多关系。如图1-4b所示,一般情况下,在高校里,每个专业有若干名学生,而每个学生只能选择一个专业学习,则专业和学生实体间存在着一对多关系。

3.多对多关系(m:n)

对于实体集A中的每个实体,实体集B中有n个实体(n≥0)与之联系,反之,对于实体集B中的每个实体,实体集A中有m个实体(m≥0)与之联系,则称实体A与实体B具有多对多关系。如图1-4c所示,在学校里,每个学生可以选修多门课程,而一门课程也可以由不同的学生选修,则学生和课程实体间具有多对多关系。

978-7-111-56699-1-Chapter01-7.jpg

图1-4 两个实体之间的关系类型

a)1:1关系 b)1:n关系 c)m:n关系

关系也可以具有属性,如图1-4c所示,由于每个学生选修一门课程将有唯一的一个成绩,因此“成绩”只能作为选修关系的属性,而不能单独作为“学生”实体或“课程”实体的属性,否则将不知道某个成绩是哪个学生或哪门课程的。

E-R不仅能够描述两个实体之间的关系,也可以描述两个以上实体或者一个实体内的关系。图1-5所示为3个实体之间的关系,对于供应商、项目和零件3个实体,一个供应商可以供给多个项目、多种零件;一个项目可以使用不同供应商的多种零件;一个零件可以由多个供应商供给多个项目。

图1-6所示是一个单个实体内的关系,在高等学校,教师通常是按照学院或者系进行管理的,每位教师由一个院长或者主任直接领导,而院长或系主任领导本院或者本系的多名教师,由于院长或者系主任都是教师中的一员,因此教师实体内部存在着领导与被领导的一对多的关系。

978-7-111-56699-1-Chapter01-8.jpg

图1-53 个实体间的关系

978-7-111-56699-1-Chapter01-9.jpg

图1-6 单个实体内的关系

1.3.3 E-R图的设计原则

数据库设计通常采用“一事一地”原则,可以从实体与属性方面体现。

1)属性应该存在且仅存在于某一个地方(实体或者关联)。

该原则确保了数据库中的某个数据仅存储于某个数据库表中,避免了同一数据存储于多个数据库表中,避免了数据冗余。

2)实体是一个单独的个体,不能存在于另一个实体中成为其属性。

该原则确保了一个数据库表中不能包含另一个数据库表,即不能出现“表中套表”的现象。

例如,在“选课系统”中,学生选课时需要提供学号、姓名、班级名、所属院校名及联系方式等信息。学号、姓名及联系方式需要作为学生实体的属性出现,而班级名和院系名则无法作为学生实体的属性出现。如果将班级名和院系名也作为学生实体的属性,那么学生实体存在(学号、姓名、联系方式、班级名、院系名)5个属性,学生实体中出现了“表中套表”的现象,违背了“一事一地”原则。这是由于,班级名和院系名联系紧密,班级属于院系,院系通常包含多个班级,应该将“班级名”属性与“院系名”属性抽取出来,放入“班级”实体中,将一个“大”的“实体”分解成两个“小”的实体,并且建立班级实体与学生实体之间的一对多关系,从而得到“选课系统”中的部分E-R图,如图1-7所示。

3)同一个实体在同一个E-R图中仅出现一次。

当同一个E-R图中两个实体间存在多种关系时,为了表示实体间的多种关系,建议不要让同一个实体出现多次。例如,中国移动提供的10086人工服务中,客服人员为手机用户提供服务后,手机用户可以对该客服人员进行评价,客户人员与手机用户之间存在服务与被服务、评价与被评价等多种关系,本着“一事一地”原则,客服人员与手机用户之间的关系可以用如图1-8所示的E-R图表示,客服人员实体与手机用户实体在E-R图中仅出现一次。

本着“一事一地”原则对“选课系统”进行设计,得到所有的“部分”E-R图,并将其合并成为“选课系统”E-R图,如图1-9所示,其中共有4个实体,分别为教师、课程、学生和班级,每个实体包含的属性实体间的关系如图1-9所示。

978-7-111-56699-1-Chapter01-10.jpg

图1-7 选课系统中的部分E-R图

978-7-111-56699-1-Chapter01-11.jpg

图1-8 客服人员与手机用户之间关系

978-7-111-56699-1-Chapter01-12.jpg

图1-9 选课系统E-R图

本章总结

本章首先介绍了数据库设计的基本概念,简述了关系数据库、结构化查询语言SQL的组成与特点,并进一步阐述了数据库设计的基本步骤及注意事项。接着对关系模型进行了介绍,描述了数据库和表、列和行,以及主要约束。在E-R图内容的阐述中,介绍了实体、属性和关系,并给出了E-R图的设计原则与方法。

实践与练习

1.选择题

(1)数据库系统的核心是( )。

A.数据模型 B.数据库管理系统 C.数据库 D.数据库管理员

(2)E-R图中提供了表示信息世界中实体、属性和( )的方法。

A.数据 B.关系 C.表 D.模式

(3)E-R图是数据库设计的工具之一,它一般适用于建立数据库的( )。

A.概念模型 B.结构模型 C.物理模型 D.逻辑模型

(4)SQL语言又称( )。

A.结构化定义语言 B.结构化控制语言

C.结构化查询语言 D.结构化操纵语言

(5)可用于从表中检索数据的SQL语句是( )。

A.SELECT语句 B.INSETR语句

C.UPDATE语句 D.DELETE语句

2.概念题

(1)简述什么是数据库、数据库系统和数据库管理系统?

(2)简述什么是关系型数据库?

(3)简述SQL功能及包含的主要动词。

(4)数据库设计包含哪几个阶段,请分别简要阐述。

(5)什么是E-R图中的实体和属性,以及它们的表示方法?

3.操作题

现有班级信息管理系统需要设计,希望数据库能够管理班级与学生信息,其中学生信息包括学号、姓名、年龄、性别和班级名;班级信息包括班级名、班主任和班级人数。

(1)确定班级实体和学生实体的属性。

(2)确定班级和学生之间的关系,给关系命名并指出关系的类型。

(3)确定关系本身的属性。

(4)画出班级与学生关系的E-R图。

实验指导:E-R图的设计与画法

实验目的和要求

● 了解E-R图的构成要素。

● 掌握E-R图的设计原则。

● 掌握E-R图的绘制方法。

● 掌握概念模型向逻辑模型的转换原则和步骤。

题目1

1.任务描述

请为电冰箱经销商设计一套存储生产厂商和产品信息的数据库,要求生产厂商的信息包括产商名称、地址和电话;产品的信息包括品牌、型号和价格;生产厂商生产某种产品的数量和日期。

2.任务要求

(1)确定产品实体与生产厂商实体的属性。

(2)确定产品和生产厂商之间的关系,为关系命名并指出关系的类型。

(3)确定关系本身的属性。

(4)画出产品与生产厂商关系的E-R图。

(5)将E-R图转换为关系模式,写出表的关系模式并标明各自的主键。

3.知识点提示

本任务主要用到以下知识点。

(1)E-R图中的实体概念特点及表示方法。

(2)E-R图中的属性概念特点及表示方法。

(3)实体之间关系的种类。

(4)E-R图到关系模式转换的方法及主键确定。

题目2

1.任务描述

现有学生选课系统需要设计,希望数据库能够管理学生选课与课程的数据库,其中学生信息包括学号、姓名、性别、所在院系和联系方式;课程信息包括课程编号、课程名、人数上限、课程描述、学分、学期及状态。

2.任务要求

(1)确定学生实体与课程实体的属性。

(2)确定学生和课程之间的关系,为关系命名并指出关系的类型。

(3)确定关系本身的属性。

(4)画出学生与课程的E-R图。

(5)将E-R图转换为关系模式,写出表的关系模式并标明各自的主键。

3.知识点提示

本任务主要用到以下知识点。

(1)E-R图中的实体概念特点及表示方法。

(2)E-R图中的属性概念特点及表示方法。

(3)实体之间关系的种类。

(4)E-R图到关系模式转换的方法及主键确定。

题目3

1.任务描述

在题目2的基础上,完善选课系统,要求所设计的系统中共有4个实体,分别为教师、课程、学生和班级。本着“一事一地”原则对“选课系统”进行设计。

2.任务要求

(1)确定选课系统中出现的实体的属性。

(2)确定各实体之间的关系,为关系命名并指出关系的类型。

(3)确定关系本身的属性。

(4)画出选课系统的E-R图。

3.知识点提示

本任务主要用到以下知识点。

(1)E-R图中的实体概念特点及表示方法。

(2)E-R图中的属性概念特点及表示方法。

(3)实体之间关系的种类。

(4)E-R图设计方法。