第3章 设计和创建数据库
数据库是所有数据库对象的承载,也是SQL Server 2008相关知识学习的起点。本章将重点学习使用SQL Server 2008进行设计和创建的方法。首先介绍数据库设计的相关内容:模型结构、关系与范式;接下来讲述SQL Server 2008中的系统数据库,以及它们在SQL Server 2008中的使用和所提供的管理作用;最后讲述如何创建用户数据库和有关数据库的管理。
在本章中,将重点学习以下内容:
● 数据模型的分类与概念。
● 使用ER模型的关系数据库设计。
● 第一范式、第二范式与第三范式。
● SQL Server 2008的预设数据库。
● 使用SQL Server 2008创建数据库。
● 使用SQL Server 2008管理数据库。
3.1 数据库设计——模型与结构
现实世界中,个体间总存在着某些联系。反映到信息世界中,就是实体的联系,由此构成实体模型。反映到数据库系统中,是记录间的联系。将实体模型数据化,转化成数据模型,这个过程就是我们抽象实际数据和设计数据库的过程。
3.1.1 数据模型的基本概念
在数据库中,用数据模型(Data Model)这个工具来抽象、表示和处理现实世界中的数据和信息。通俗地讲,数据模型就是现实世界的模拟。根据应用目的,模型分为两个层次。
● 概念模型(信息模型):从用户角度看到的模型。该模型要求概念简单,表达清晰,易于理解。
● 数据模型:从计算机角度看到的模型。要求使用有严格语法和语义的语言对数据进行严格形式化定义、限制和规定,使模型能转变为计算机可以理解的格式。主要包括网状模型、层次模型、关系模型等。
数据库中的数据是高度结构化的。也就是说,数据库不仅要考虑记录内的各个数据项之间的关系,还要考虑记录与记录之间的关系。
数据模型主要是指描述这种联系的数据结构形式。在数据库的开发过程中主要有下面3种数据模型:层次模型、网状模型和关系模型。其中层次模型和网状模型统称为非关系模型,在数据库发展的历史中曾经占据很重要的地位,但现在基本上被关系模型所替代了。以SQL Server、Oracle等为代表的数据库管理系统针对的都是关系型数据库的管理,因此在现有数据库的设计中,我们首先要关注的就是关系的建立和管理问题。
3.1.2 层次模型
层次模型用树形结构来表示各类实体及实体间的联系。每个节点表示一个记录类型,节点之间的连线表示记录类型间的联系,这种联系只能是父子联系。每个记录类型可包含若干个字段。在这个模型里,记录类型描述的是实体,字段描述实体的属性。任何一个给定的记录值只有按其路径查看时,才能显示出它的全部意义,没有一个子记录值能够脱离双亲记录值而独立存在。如图3-1所示是一个简单的层次模型示意图。
图3.1 层次模型示意图
层次数据模型的操作主要有查询、插入、删除和更新。进行插入、删除、更新操作时要满足层次模型的完整性约束条件:
● 进行插入操作时,如果没有相应的双亲节点值就不能插入子女节点值。
● 进行删除操作时,如果删除双亲节点值,则相应的子女节点值也被同时删除。
● 进行更新操作时,应更新所有相应记录,以保证数据的一致性。
层次数据模型的优点:数据模型比较简单,操作方便;对于实体间联系是固定的,且预先定义好应用系统,性能较高;提供良好的完整性支持。层次数据模型的缺点:不适合于表示非层次性的联系;对插入和删除操作的限制比较多;查询子女节点必须通过双亲节点;由于结构严密,层次命令趋于程序化。
3.1.3 网状模型
网状数据模型是一种比层次模型更具普遍性的结构。它去掉了层次模型的两个限制,允许多个节点没有双亲节点,允许节点有多个双亲节点。此外,它允许两个节点之间有多种联系(复合联系)。
● 网状数据模型的优点:能够更为直接地描述现实世界;具有良好的性能,存取效率较高。
● 网状数据模型的缺点:其数据定义语言极其复杂;数据独立性较差。由于实体间的联系本质上是通过存取路径指示的,因此应用程序在访问数据时要指定存取路径。
3.1.4 关系模型
一个关系模型的逻辑结构是一张二维表,它由行和列组成。在关系模型中,实体及实体间的联系都用关系来表示。关系模型要求关系必须是规范化的,最基本的条件就是关系的每一个分量必须是一个不可分的数据项,即不允许表中还有表。例如,表3.1所示的学生信息表就是一个关系模型。
表3.1 2008级学生信息表
该表涉及如下一些概念:
● 关系:对应通常所说的表,如表3.1所示的这张基本信息表。
● 记录:图中的一行即为一个记录,如果表3.1中有20行,即有20个记录。
● 属性:图中的一列即为一个属性,如表3.1中有5列,对应5个属性(编号、姓名、年龄、籍贯、专业)。
● 键(关键字):在关系型数据库的表中,键是标识记录的一种方式。因为键涉及的是全部的记录,所以可以使用键来建立表之间的关系。例如,当要用到不同表中的同名列进行工作时,可以利用这种特性。以键作为一种捷径,能够很容易地在两个表之间建立链接。当唯一地标识表中的记录是数据库设计中的重要部分时,键也能被使用。当单独一个列足以标识记录时,可以将键定义在单一的列上,否则,将键定义在多个列上。
主关键字:表3.1中的某个属性组,它可以唯一确定一个记录。例如,表3.1中的编号是按照学生学号的编排方法,每个学生的学号都是不同的,所以它可唯一确定一名学生,也就成为本关系的主关键字。主键是最重要的一种键的类型。定义主键的列必须只包含唯一的值。为此,不可能在任何允许NULL值的列上定义主键。关于主键的另一个限制是,一个表只能有一个主键。可以利用主键把一个表中的数据与另一个表中的数据相关联。
候选关键字:那些可以用做关键字的属性或属性的组合。例如,在表3.1中编号和(编号,姓名),它们都能唯一标识下面中的每一行,编号和(编号,姓名)均是候选关键字。可以指定编号也可以指定(编号,姓名),被指定的就是主关键字。
公共关键字:连接两个表的公共属性。例如,表3.1和表3.2是通过编号进行联系的,它是两个表的公共属性,也就是两个表的公共关键字。
表3.2 2008级学生课程成绩表
外关键字:也称为外键或外码,它是由一个表中的一个属性或多个属性所组成的。外关键字能表示另一个表的主关键字,实际上外关键字本身只是主关键字的备份,它是公共关键字。使用外关键字来描述表和表之间的联系。一个表不一定有外关键字,而且外关键字的值也不一定是唯一的。它允许有重复值,也允许为空值(NULL)。
● 替代主键的唯一约束:通过定义这种约束,将确保唯一值只能输入到在约束中定义的一个或几个列中。尽管很像前面讲过的主键定义,但二者是不同的。唯一约束不是主键,但在唯一约束中定义的一个或几个列也可能成为主键。此外,唯一约束能够包含NULL值,但主键不能。不过,由于NULL被视为与列中任何其他值一样,因此,当准备插入或更新数据时,必须使构成唯一约束的列保持唯一,从而只允许有一个NULL值。最后,一个表可以有多个唯一约束,但只能有一个主键。
1.关系模型的操作与完整性约束
关系数据模型的操作主要包括查询、插入、删除和更新数据。这些操作必须满足关系的完整性约束条件。关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性。关系模型中的数据操作是集合操作,操作对象和操作结果都是关系,即若干记录的集合。关系模型把存取路径向用户隐藏起来,用户只要指出“干什么”,不必详细说明“怎么干”,从而大大提高了数据的独立性,提高了用户的工作效率。关系数据库标准语言是SQL语言。
2.关系模型的优、缺点
关系数据模型的优点如下:
● 关系模型是建立在严格的数学概念基础上的,无论实体还是实体之间的联系都用关系来表示,数据的查询结果也是关系(表),因此,概念单一,数据结构简单、清晰。
● 关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库的开发工作。
关系数据模型的缺点:由于存取路径对用户透明,查询效率往往不如非关系数据模型。因此,为了提高性能,必须对用户的查询请求进行优化,从而增加了另外开发数据库管理系统的负担。
3.2 关系数据库设计——实体与关系
在上一节中我们学习了数据库设计中数据模型的发展过程和关系数据模型的基本概念、特点。对于关系型数据库来说,它就是立足于关系数据模型,描述实体之间的关系。因此本节将针对关系型数据模型讨论实体与关系的联系。
3.2.1 实体
客观存在并可相互区别的事物称为实体。例如,图书、教师等都是实体。常常将实体具有的某种特性称为实体的属性。例如,可以用若干个属性(图书编号、ISBN号、定价、出版社)来描述图书实体,属性的具体取值称为属性值。
实体表示的是一类事物,其中的一个具体事物称为该实体的一个实例。例如“ABC11700 4”,“史记(3册)”,“72.00”,“中国长安”则具体表示了一本书,它是图书实体的一个实例。如果某个属性或属性的组合能唯一地标识出实体中的每一行,则可以选择该属性或属性的组合作为实体标识符。
例如,图书实体中的“ISBN号”可以作为实体标识符,因为“ISBN号”的值是唯一的,它能唯一地标识出实体中的每一行。而“书名”不可以作为图书实体的实体标识符,因为“书名”有重名的现象存在,它所标识的行会出现不唯一的情况。
3.2.2 实体间的联系
实体不是孤立的,实体与实体之间有着密切的联系。实体间的联系分为1对1、1对多和多对多3种。例如,学校实体和学生实体之间是1对多的联系,学生实体和课程实体之间是多对多的联系。可以使用实体关系图(E-R图)描述实体与实体间的联系。如图3.2所示,两个实体之间有3种联系(1:1、1:n和m:n)。
图3.2 E-R图
3.2.3 E-R模型
数据库设计就是将现实世界的数据组织成数据库管理系统所需的数据模型。实体联系方法简单、实用,通常使用它的工具——E-R图来描述现实世界的信息结构,并将所描述的结果称为E-R模型。E-R模型可以转换为DBMS所支持的数据模型。如图3.2所示,E-R图有以下3个要素。
● 实体:使用矩形框表示,框内标注实体名称。
● 属性:使用椭圆形框表示,并用连线与实体连接起来。如果属性较多,为使图形更加简明,有时也将实体与其属性单独用列表表示。
● 实体之间的联系:使用菱形框表示,框内注明联系名称,并用连线将菱形框分别与有关实体相连,并在连线上注明联系类型。
3.3 关系数据库设计——范式与规范化
通过E-R模型能够对实体与关系之间进行基本的映射,开始关系型数据库的设计。但是,还有一个很重要的问题,关系模型要求关系必须是规范化的,即要求关系模型必须满足一定的规范条件,即本节中将要学习到的范式。
3.3.1 规范化与范式
数据库的规范化是减少表中数据重复的一种技巧。规范化过程针对已经发现的实体和属性,将它们改造得更适合关系数据库系统。该过程减掉冗余,并且将数据改造成有利于关系型引擎发挥作用的形式,大量消除重复数据后将得到更小、更紧凑的数据库。这样将减小出现混乱的几率,并且将减少实时更新多列数据的开销。
一旦完成了规范化过程,使用基于集的SQL语言来操作数据会更方便。对数据库定义来说,其终极目标就是将自己识别出来的很多数据分解为原子值(原子值是指就用于关系数据库而言,一个值已经没必要被进一步分解了)。也就是说,分解到需要用T-SQL(Transact SQL)代码访问的最底层形式上。
规范化过程基于一系列级别,其中每个级别都达到一定水平的正确性,或遵守着一系列特定“规则”,这些规则通常称为“范式”。设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。
关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就行了。
3.3.2 第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体。新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于员工信息,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列,如图3.3所示。
图3.3 第一范式
3.3.3 第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分,通常需要为表加上一个列,以存储各个实例的唯一标识。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。简而言之,第二范式就是非主属性非部分依赖于主关键字。
假定设计学生管理数据库,其中包含选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系:
(学号,课程名称)→(姓名,年龄,成绩,学分)
所以,这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称)→(学分) (学号)→(姓名,年龄)
即存在组合关键字中的字段决定非关键字的情况。由于不符合2NF,所以这个关系表会存在如下问题:
1.数据冗余
同一门课程由n个学生选修,“学分”就重复n-1次;同一个学生选修了m门课程,“姓名”和“年龄”就重复了m-1次。
2.更新异常
若调整了某门课程的学分,数据表中所有行的“学分”值都要更新,否则会出现同一门课程学分不同的情况。
3.插入异常
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有“学号”关键字,课程名称和学分也无法记入数据库。
4.删除异常
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下3个表:
学生:Student(学号,姓名,年龄); 课程:Course(课程名称,学分); 选课关系:SelectCourse(学号,课程名称,成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
3.3.4 第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。简而言之,第三范式就是属性不依赖于其他非主属性。在第二范式的基础上,如果数据表中不存在非关键字段对任一候选关键字段的传递函数依赖,则符合第三范式。所谓传递函数依赖,指的是如果存在“A→B→C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
关键字段→非关键字段x→非关键字段y
假定学生管理数据库中学生关系表为Student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字为单一关键字“学号”,因为存在如下决定关系:
(学号)→(姓名,年龄,所在学院,学院地点,学院电话)
所以,这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号)→(所在学院)→(学院地点,学院电话)
即存在非关键字段“学院地点”、“学院电话”对关键字段“学号”的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况。把学生关系表分为如下两个表:
学生:(学号,姓名,年龄,所在学院); 学院:(学院,地点,电话)。
这样的数据库表是符合第三范式的,它消除了数据冗余、更新异常、插入异常和删除异常。
3.3.5 其他范式与规范化的好处
除了最常用的第一范式、第二范式和第三范式外,还有不太常用的如下几种范式:
● BCNF范式,指非主键字段必须依赖于整个主键字。在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BCNF。
● 第四范式,用于处理由复杂的复合主键所导致的问题。如果将两个相互独立的属性与第三个属性一起组合为一个主键,并且如果没有第三个属性,仅靠这两个属性不能在实体中真正地起到唯一标识的作用,那么它就违反了第四范式。
● 第五范式,要求能从由原始表分解和转换而得的新表中精确重建出原始表。利用第五范式可以确定在分解和转换过程中是否有数据丢失。
每个级别的规范化都表明在更高程度上遵守了被广泛认可的数据库设计标准。当提高了自己数据的规范化程度时,你将逐渐很自然地创建出越来越多的宽度更窄的表(列更少)。通过这些规范化措施,能够在数据库的设计中达到如下目的。
1.消灭重复数据
任何一个数据,只要在数据库中出现了一次以上,就随时都有可能出错。毫无疑问,以姓名为例,对于任何搬到一个新地址的人来说,存储冗余数据的问题都显而易见。各个政府机关分别要求搬到新地址的市民修改地址信息,如税单、驾照、机动车登记等,没有一个统一的、修改一次就行的地方。搬一次家简单,但更新这些数据却是个复杂的过程。
2.避免编写不必要的代码
如果数据结构糟糕,则可能需要在触发器、存储过程中,甚至是在业务逻辑层中进行多余的编程,而这又会进一步严重地损害性能。由于需要错综复杂的代码来维护冗余数据,多余的代码增加了引入新缺陷的可能性。
3.给表瘦身
更瘦的表就意味着在数据库一个给定的页上可以放入更多的数据,比起更胖的表来,在一次单独的读取操作中,数据库服务器就可以从表中获取更多的行。但这所有的一切意味着当结束规范化过程时,系统中会有更多的表。
4.最大化聚集索引的使用
在SQL Server 2008中,对表排序是聚集索引的内生特性。聚集索引是一类特殊的索引,因为数据的物理存储与索引数据的顺序一致,这就使得用索引进行查询有更好的性能。通常情况下,用聚集索引来将表排序成方便使用的形式,从而增强性能。每张表只能有唯一一个聚集索引。数据库中的聚集索引越多,就越不需要进行排序操作,然后就可以非常快地连接大量的数据集。
5.降低每张表中索引的数量
每张表中的索引越少,维护索引所需要做的工作就越少。在SQL Server中,数据和索引分开存放在8KB的页上。通常情况下,任何时候SQL Server都无法在RAM中保持整个数据库。数据库保持最近被看过的东西的“快照”。为了造成整个数据库都在内存中的印象,当需要时,SQL Server在高速访问存储空间内对数据页进行搬入、搬出操作。但是,这个空间在任意一个时间点上包含的页数量都有限。
因此,SQL Server对数据进行搬入、搬出该空间的操作时,其原则是最常访问到的数据在空间中保持不动。所以,为了尽可能保持高性能,我们的目标是要最小化需传输的物理页。规范化要做的就是给表瘦身,让表针对特定问题,而不是让表去处理很多列。因此,它有助于将列数量保持在一个最低水平上。
3.3.6 非规范化
需要注意的是,规范化也可能会影响数据库及数据检索的速度,因此数据库设计者不可能无度地规范化。对数据库进行合理而有益的规范化,重复数据的消除将带来更快的数据排序速度,查询也将运行得更快,从而改善性能。但是,也可能会由于创建了太多的关系和太多狭小的表,导致过分规范化数据,以致检索一条信息需要访问许多的表并在这些表之间产生许多连接。
非规范化与规范化完全相反,此时要在表中引入数据冗余,以减少表连接的数目,潜在地加速数据访问。尽管使数据规范化会带来更高的效率,但是,有时使数据非规范化反而是更好的选择。不要只因为别人认为数据应该彻底规范化就这样去做,具体如何应该根据需要而定。
尽管使数据非规范化的缺点很多,它将会带来重复和多余的信息(这些信息可以通过规范化放置在另一个表中,然后在查询时连接表即可)。这既会产生性能问题,又要占用较大的数据存储空间。然而,如果查询运行速度提高了,那么进行使数据非规范化所付出的代价也算是合理的。但当系统中最重要的是数据完整性时,使数据非规范化将毫无意义,因为这样会导致数据重复,进而当需要对数据做修改时,一个地方的数据已经更新,而另一个地方的数据尚未更新。
3.4 SQ L Server 2008的预设数据库
每个SQL Server都包含两种类型的数据库:系统数据库和用户数据库。系统数据库存储有关SQL Server的信息,SQL Server使用系统数据库来管理系统,例如,下面将要介绍的master数据库、model数据库、msdb数据库和tempdb数据库等;而用户数据库由用户来建立,如图书管理信息数据库,SQL Server可以包含一个或多个用户数据库。
3.4.1 master数据库
如图3.4所示,master(控制)数据库是SQL Server 2008中的总控数据库。它是最重要的系统数据库,记录系统中所有系统级的信息。它对其他的数据库实施管理和控制的功能,同时该数据库还保存了用于SQL Server 2008管理的许多系统级信息。master数据库记录所有的登录账户和系统配置,它始终有一个可用的最新master数据库备份。
图3.4 master数据库
由此可知,如果在计算机上安装了一个SQL Server系统,那么系统首先会建立一个master数据库来记录系统的有关登录账户、系统配置、数据库文件等初始化信息。如果用户在这个SQL Server系统中建立一个用户数据库(如图书管理系统数据库),系统马上将用户数据库的有关用户管理、文件配置、数据库属性等信息写入master数据库。系统正是根据master数据库中的信息来管理系统和其他数据库的。因此,如果master数据库信息被破坏,整个SQL Server系统将受到影响,用户数据库将不能被使用。
3.4.2 tempdb数据库
使用SQL Server 2008系统时,经常会产生一些临时表和临时数据库对象等。例如,用户在数据库中修改表的某一行数据时,在修改数据库这一事务没有被提交的情况下,系统内就会有该数据的新、旧版本之分,往往修改后的数据表构成了临时表。所以系统要提供一个空间来存储这些临时对象。如图3.5所示,tempdb数据库保存所有的临时表和临时存储过程。tempdb数据库是全局资源,所有连接到系统的用户的临时表和存储过程都被存储在该数据库中。
tempdb数据库是临时数据库,在SQL Server 2008每次启动时都被重新创建,因此该数据库在系统启动时总是空的,上一次的临时数据库都被清除掉了。临时表和存储过程在连接断开时自动清除,而且当系统关闭后将没有任何连接处于活动状态,因此tempdb数据库中没有任何内容会从SQL Server的一个启动工作保存到另一个启动工作之中。默认情况下,在SQL Server 2008运行时,tempdb数据库会根据需要自动增长。不过,与其他数据库不同,每次启动数据库引擎时,它会重置初始大小。
图3.5 tempdb数据库
3.4.3 model数据库
model(模板)数据库为用户新创建的数据库提供模板和原型,它包含了用户数据库中应该包含的所有系统表的结构。当用户创建数据库时,系统会自动把model数据库中的内容复制到新建的用户数据库中。熟悉Microsoft Word的用户都会有这样的体会,当修改了文档的页面设置,并把该设置作为默认设置保存起来时,在此次之后新建的任何文档的格式都会默认为该设置格式。也就是说,在把被修改过的页面设置作为默认保存的同时,也就修改了Microsoft Word中基于所有新建文档的Normal模板,用户在系统中新创建的所有数据库的内容,最初都与该模板数据库具有完全相同的内容。
3.4.4 msdb数据库
msdb数据库供SQL Server 2008代理程序调度警报作业及记录操作时使用。当很多用户在使用一个数据库时,经常会出现多个用户对同一个数据的修改而造成数据不一致的现象,或是用户对某些数据和对象的非法操作等。为了防止上述现象的发生,SQL Server中有一套代理程序能够按照系统管理员的设定监控上述现象的发生,及时向系统管理员发出警报。那么当代理程序调度警报作业、记录操作时,系统要用到或实时产生许多相关信息,这些信息一般存储在msdb数据库中。
3.4.5 AdventureW orks和AdventureWorksDW示例数据库
AdventureWorks和AdventureWorksDW是SQL Server 2008中的示例数据库(需要在安装过程中选择安装)。这些数据库基于一个自行车生产公司,以一种简单的、易于理解的方式来展示SQL Server 2008的新功能,如Reporting Services、CLR(公共语言运行时)特性及许多其他特性。
AdventureWorks示例数据库虚构了Adventure Works Cycles公司,该公司是一家大型跨国生产公司。公司生产金属和复合材料的自行车,产品销往北美、欧洲和亚洲市场。公司总部位于华盛顿州的伯瑟尔市,有290名雇员,公司还拥有一些遍及其销售市场的地区性销售团队。尽管示例数据库不是为SQL Server 2008新手准备的,但在学习完SQL Server 2008基础知识后,使用它们也不会有困难。
3.5 使用SQL Server 2008创建数据库
在一个SQL Server 20 08系统中,有多种方法可以创建用户数据库。一种是使用第2章中介绍的SQL Server Management Studio对象资源管理器创建数据库;另一种是使用Transact-SQL命令创建数据库,它可以把创建数据库的脚本保存下来,在其他计算机上运行以创建相同的数据库。
此外,利用系统提供的创建数据库向导也可以创建数据库。创建用户数据库之前,必须先确定数据库的名称、数据库所有者、初始大小、数据库文件增长方式、数据库文件的最大允许增长的大小,以及用于存储数据库的文件路径和属性等。下面分别介绍这两种创建数据库的方法。
3.5.1 使用SQL Server Management Studio对象资源管理器创建数据库
使用SQL Server Management Studio对象资源管理器创建数据库步骤如下:
(1)在【开始】菜单中选择【所有程序】|【Microsoft SQL Server 2008】|【SQL Server Management Studio】命令,打开SSMS,如图3.6所示。
图3.6 SSMS初始状态
(2)在SSMS左侧的【对象资源管理器】窗口的【数据库】分支上单击鼠标右键,从弹出的快捷菜单中选择【新建数据库】命令,弹出【新建数据库】窗口,如图3.7所示。
图3.7 【新建数据库】窗口
(3)在【数据库名称】文本框中输入创建的数据库名称“wj”。此时,系统会以数据库名称做为前缀创建主数据库文件和事务日志文件,如wj和wj_log。主数据库文件和事务日志文件的初始大小与model系统数据库指定的默认大小相同,选择默认值,其中数据库文件的增量为1MB,不限制增长的总量,日志文件每次增长10%,也不限制增长的总量。也可以进行自定义,单击【自动增长】旁的按钮,弹出如图3.8所示的对话框。
图3.8 【更改自动增长设置】对话框
对文件增长设置,如图3.8所示,其中文件增长有两种自动增长方式。
● 【按百分比】:指定每次增长的百分比。
● 【按MB】:指定每次增长的兆字节数。
用户也可以指定最大文件大小,如果选中【不限制文件增长】单选按钮,那么数据文件的容量可以无限地增大;如果选中【限制文件增长】单选按钮,可以将数据文件限制在某一特定的数量范围以内,一般,有经验的数据库管理员会预先估计数据库的大小,当然这样做需要一定的技巧,需要不断地积累经验。同样可以对数据库文件和数据库逻辑文件的存放路径进行修改。默认情况下,SQL Server 2008将存放路径设为安装目录下的data目录下。用户可以根据管理需要进行修改,单击【路径】旁的按钮,弹出窗口,此时可以修改路径,如图3.9所示。
图3.9 存放路径选择
如果需要为该数据库添加所有者,则单击【添加】按钮,弹出【选择数据库所有者】对话框,如图3.10所示。在该对话框中,可以单击【浏览】按钮选择浏览数据库所在计算机上的用户名,并添加为数据库的所有者。
图3.10 【选择数据库所有者】对话框
在【选项】界面可以设置数据库的一些选项,如图3.11所示。在各属性的下拉列表框中可以做出选择。
图3.11 【选项】界面
完成所有设置后,在如图3.8所示的窗口中单击【确定】按钮,完成数据库创建,如图3.12所示。
图3.12 完成数据库创建的对象资源管理器窗口
3.5.2 使用SQL Server Management Studio查询窗口创建用户数据库
使用SQL查询分析器创建数据库,其实就是在查询窗口的编辑面板中使用DATABASE等Transact-SQL命令来创建用户数据库。
【范例3-1】下面学习一个创建用户数据库test的简单例子。
CREATE DATABASE test --创建名为test的数据库,数据库的命名规则按照标识符的使用规则 ON PRIMARY ( NAME= 'test', --指定建立数据库对应的逻辑名字 FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test.mdf', --指定用于存放数据库部分的磁盘文件,路径必须指定为SQL Server所安装服务器上的某个文件夹 SIZE=10240KB, --指定数据库文件的初始大小,用户可以以MB为单位指定大小,也可以使用单位KB来指定大小 --当添加数据或日志文件时,其默认大小是1 MB MAXSIZE = UNLIMITED, FILEGROWTH = 10%) LOG ON --指定建立数据库对应的日志文件 ( NAME='test_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test_log.ldf', --指定用于存放数据库日志部分的磁盘文件,路径必须指定为SQL Server所安装服务器上的某个文件夹 SIZE=1024KB, --指定数据库日志文件的初始大小,用户可以以MB为单位指定大小,也可以使用单位KB来指定大小 --当添加数据或日志文件时,其默认大小是1 MB MAXSIZE = 5120KB, FILEGROWTH = 1024KB ) GO
【代码解析】
● PRIMARY参数用来在主文件组中指定文件。主文件组中包含所有数据库的系统表,还包含所有未指派给用户文件组的对象。主文件组的第一个logical_file_name称为主文件,该文件包含数据库的逻辑起点及其系统表。一个数据库只能有一个主文件。如果指定PRIMARY,那么CREATE DA TABASE语句中有一个主文件。如果没有指定PRIMARY,那么CREATE DATABASE语句中列出的第一个文件将成为主文件。
● MAXSIZE参数指定文件能够增长到的最大长度。默认单位为KB,用户也可以以MB来指定该长度。如果没有指定长度或设定为UNLIMITED时,文件将一直增长,直到磁盘满为止。要建立的数据库大小单位为MB。
● FILEGROWTH参数指定文件的增长增量。该参数设置不能超过MAXSIZE参数。指定值的默认单位为MB,用户也可以以KB为单位进行指定,此外还可以使用百分比设定。如果该参数没有指定,则默认为10%,最小值为64KB。在查询编辑器窗口中输入上述代码,单击【执行】按钮完成查询,即完成test用户数据库的新建工作。
注意:使用CREATE DATABASE语句即可创建数据库及存储该数据库的文件。SQL Server 2008分两步来实现CREATE DATAB ASE语句。首先,SQL Server 2008使用model数据库的副本初始化数据库及其源数据;然后SQL Server 2008使用空页填充数据库的剩余部分,每个新数据库都从model数据库中继承数据库选项设置。
【运行结果】
执行结果如图3.13所示。
图3.13 使用T-SQL代码新建数据库
3.5.3 查看和修改数据库属性
对于已有的数据库,可以分别利用对象资源管理器和Transact-SQL语句来查看数据库信息。
1.使用SQL Server Management Studio窗口中的对象资源管理器查看数据库信息
在完成数据库创建后,可以对数据库的属性进行进一步设置。在对象资源管理器窗口中选择新建的wj数据库的【wj】分支,在其上单击鼠标右键,从弹出的快捷菜单中选择【属性】命令,弹出【数据库属性】窗口,如图3.14所示。在该窗口中可以对数据库属性进行修改。例如,设置数据库文件所属的文件组时,在【数据库属性】窗口左侧的分支中单击【文件组】选项,如图3.15所示。单击【添加】按钮,可以增加自定义名称的文件组。
图3.14 【数据库属性】窗口
图3.15 设置数据库文件所属的文件组
在属性页窗口中列出了数据库、备份和维护,以及空间配置等信息。数据库本身的信息包括数据库的所有者、创建日期、大小、可用空间、用户数。
2.使用Transact-SQL命令查看数据库信息
在Transact-SQL语句格式中,有许多查看数据库信息的语句,例如,可以使用存储过程sp_helpdb来显示有关数据库和数据库参数的信息。如图3.16所示的是使用存储过程sp_helpdb对数据库test进行属性查询,图中显示了该数据库的所有者、状态、创建时间、文件尺寸、文件增长属性等数据库信息,其命令格式为:sp_helpdb 'test'。
图3.16 使用sp_helpdb存储过程查看test数据库属性
3.6 使用SQL Server 2008管理数据库
本节学习使用SQL Server 2008完成数据库打开、修改、增加和缩减等管理工作。
3.6.1 打开数据库
当用户登录SQL Server 2008服务器,连接SQL Server 2008后,用户需要连接SQL Server 2008服务器中的某个数据库,才能使用该数据库中的数据。如果用户没有预先指定连接哪个数据库,SQL Server 2008会自动连接上master系统数据库。一般地,用户需要指定连接SQL Server 2008服务器中的哪个数据库,或者从一个数据库切换至另一个数据库,可以在查询分析器的【编辑】面板中利用use命令来打开或切换至不同的数据库。
打开或切换数据库的命令如下:
USE database name
其中,database name表示需要打开或切换的数据库名称。
3.6.2 修改、增加和缩减数据库容量
当数据库的数据增长到要超过它的使用空间时,必须加大数据库的容量。增加数据库容量就是给它提供额外的设备空间。同时,如果在新建数据库时指定给某数据库过多的设备空间,可以通过缩减数据库容量来减少设备空间的浪费。增加和缩减数据库容量的方法一般有两种,即用Transact-SQL命令和利用SQL Server Management Studio查询窗口中的【对象资源管理器】面板来增缩数据库容量。
1.在SQL Server Management Studio查询窗口中使用Transact-SQL语句增缩数据库容量
扩增数据库语句格式如下:
USE database name --需要修改的数据库名 Go ALTER DATABASE database name -- database name是需要调整大小的数据库的名称 MODIFY FILE ( NAME=file name, --需要增加容量的数据库的物理文件的路径 SIZE=newsize --为数据库文件指定新的容量尺寸,该容量必须大于现有数据库的空间 )
【范例3-2】将新创建的test数据库的大小调整为20MB。
修改大小的示例代码如下:
USE test Go ALTER DATABASE test MODIFY FILE ( NAME='C:\Program Files\Microsoft SQL Server\MSSQL\data\test.mdf', SIZE=20 )
缩减数据库一般通过执行DBCC SHRINKDATABASE命令来完成,其语句格式如下:
DBCC SHRINKDATABASE (database_name[,new_size[,'MASTEROVERRIDE']])
其中,
● database_name:想缩减的数据库名称。
● new_size:缩减数据库后剩余多少容量。假如不指定,那么数据库将缩减至最小的容量。
如下所示为缩减数据库的示例代码,将test数据库缩减至最小容量。
USE test GO DBCC SHRINKDATABASE ('test')
【运行结果】
执行结果如图3.17所示。
图3.17 缩减test数据库容量
2.在SQL Server Management Studio对象资源管理器中修改数据库
进入SQL Server Management Studio窗口,在要修改的数据库【wj】分支项单击鼠标右键,在弹出的快捷菜单中选择【属性】命令,进入属性窗口,在这些选项的展开页面中可以管理文件增长、扩展数据库、缩小数据库、修改文件(组)设置和增加新数据库等。如图3.18所示,将wj数据库的大小修改为8MB。
图3.18 修改wj数据库容量
修改成功后,单击【确定】按钮,修改数据生效。
3.6.3 查看目前数据库选项设定及修改
设定数据库选项可以控制数据库是单用户使用模式还是db_owner模式,以及此数据库是否仅可读取等,可以设置此数据库是否自动关闭、自动收缩和数据库的兼容级别等选项。
如果想查看目前数据库选项,如前两节中已经讨论的使用属性窗口的方式,也可以在查询分析器中使用Transact-SQL命令来查看和更改数据库选项。一般使用sp_dboption存储过程来查看数据库选项,如下所示将数据库test的属性设置为只读:
EXEC sp_dboption 'test', 'read only', True
如图3.19所示是执行属性设置后的结果。
图3.19 将test数据库属性设置为只读
下面简单介绍部分选项参数。
1.trunc log on chkpt选项参数
trunc log on chkpt选项参数表示每当checkpoint检查进程执行时(通常每分钟12次以上),事务日志被载截,即将已提交的事务日志删除。但是,该选项设置成true以后,人工执行checkpoint操作时都不载截事务日志。在开发数据库应用时,为防止日志增长太快,可以将该选项设置成true,所以它很有用。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'trunc. log on chkpt.', True
2.dbo use only
dbo use only选项设置为true时,只有数据库拥有者才能使用该数据库。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'dbo use only',True
3.read only
read only选项使得用户可以从数据库中检索数据,但不能修改数据。
该参数的设置代码如下:
EXEC sp_dboption 'wj', 'read only', True
4.single user
single user选项设置为true时,每次只能有一个用户访问该数据库。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'single user', True
5.offline
offline选项设置为true时,设定数据库为离线,反之为在线。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'offline', True
6.autoshrink
autoshrink选项设置为true时,数据库将自动地周期性收缩大小。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'autoshrink', True
7.ANSI warnings
ANSI warnings选项设置为true时,将提示“除0”之类的标准错误和警告。
该参数的设置代码如下:
EXEC sp_dboption 'test', 'ANSI warnings', True
3.6.4 数据库更名
通常情况下,在一个应用程序的开发过程中,往往需要改变数据库的名称,但是在SQL Server 200 8中更改数据库名称并不像在Windows中那样简单,要改变名称的那个数据库很可能正被其他用户使用,所以变更数据库名称的操作必须在单用户模式下方可进行,然后使用系统存储过程sp_renamedb或直接更改来更改数据库的名称。首先将数据库更改为单用户模式,如图3.20所示。
图3.20 将test数据库设置为单用户模式
完成单用户设置后,可以在对象资源管理器中直接对数据库的名称进行修改,如图3.21所示,将test数据库的名称修改为test1。
下面再通过执行sp_renamedb存储过程来进行更名操作。打开SQL查询窗口,输入如下语句:
EXEC sp_renamedb 'test1','test'
执行完成后,如图3.22所示。
图3.21 修改test数据库的名称
图3.22 修改test1数据库的名称
3.6.5 删除数据库
删除数据库比较简单,但是应该注意的是,如果某个数据库正在使用时,则无法对该数据库进行删除。可以使用对象资源管理器和DROP DA TAHASE语句来删除某个数据库。首先直接使用对象资源管理器来进行数据库的删除,在对象资源管理器的【数据库】分支中选择要删除的数据库选项【test】选项。在该选项上单击鼠标右键,在弹出的快捷菜单中选择【删除】命令,弹出如图3.23所示的窗口,单击【确定】按钮,完成数据库删除。
图3.23 使用对象资源管理器删除test数据库
也可以直接使用T-SQL代码来完成数据库的删除,如图3.24所示。
图3.24 使用T-SQL代码删除test数据库
DROP DATABASE test
在SQL Server Management Studio查询分析器窗口中运行代码,执行完毕后,SQL Server 2008将返回该数据库的数据文件和日志文件均被删除的提示信息。
如图3.24,test数据库已被删除。
3.7 小结
本章学习了数据模型的概念和数据库的创建与管理。本章的重点是掌握系统数据库的分类和作用、学会使用对象资源管理器创建用户数据库、学会使用查询分析器创建用户数据库、学会压缩和扩充数据库、学会查看和修改数据库选项、学会给数据库改名和删除数据库。难点是使用E-R模型设计数据库和不同范式的理解。下一章将在此基础上全面介绍Transact-SQL语言。
3.8 习题
【题目1】创建一个Test数据库,该数据库的主数据文件逻辑名称为Test_data,物理文件名为Test.mdf,初始大小为10MB,最大尺寸为无限大,增长速度为10%;数据库的日志文件逻辑名称为Test_log,物理文件名为Test.ldf,初始大小为1MB,最大尺寸为5MB,增长速度为1MB,数据库文件大小使用KB表示。
【分析】该试题是考查对于数据库创建的理解,按照示例完成即可,要注意题目中对于所创建的数据库的具体参数的要求。首先,在没有指出文件创建位置时,在SQL的安装文件夹创 建,例 如SQL Server 2008的 安 装 路 径 为“C:\Program Files\ Microsoft SQL Server\MSSQL.1\MSSQL\”,则创建于对应的data文件夹下。其次,注意数据库文件的大小以KB表示,因此要正确使用换算关系。最大尺寸和增长速度采用和例子类似的方式即可。
【核心代码】按照以上分析,构建以下核心代码:
CREATE DATABASE Test ON PRIMARY ( NAME = 'Test', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\test.mdf', SIZE=10240KB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) LOG ON ( NAME='Test_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\test_log.ldf', SIZE=1024KB, MAXSIZE = 5120KB, FILEGROWTH = 1024KB ) GO
【题目2】创建一个名为“user”的用户数据库,其主文件大小为120MB,初始大小为55MB,文件增长增量为3MB;日志文件大小为30MB,初始大小为12MB,文件增长增量为3MB;其中文件均存储在D盘根目录下,数据库文件大小使用KB表示。
【分析】与题目1相比,首先,要选择不同的存放位置,例如可以直接存放在D盘的data文件夹中。其次,注意增长方式的变化,在本题中增长方式为一个固定值。
【核心代码】按照以上分析,构建以下核心代码:
CREATE DATABASE user ON PRIMARY ( NAME = 'user', FILENAME='D:\ \data\user.mdf', SIZE=56320KB, MAXSIZE =122880KB, FILEGROWTH = 30720KB, ) LOG ON ( NAME='user_log', FILENAME='D:\ user_log.ldf', SIZE=12288KB, MAXSIZE = 30720KB, FILEGROWTH = 3072KB ) GO
【题目3】使用3个100MB的数据文件和两个100MB的事务日志文件创建名为Archive的数据库。主文件是列表中的第一个文件,并使用PRIMARY关键字显式指定。事务日志文件在LOG ON关键字后指定。注意FILENAME选项中所用的文件扩展名:主要数据文件使用.mdf,次要数据文件使用.ndf,事务日志文件使用.ldf,存放位置和其他参数自行指定,数据库文件大小使用MB表示。
【分析】该试题是考查对于数据库创建的理解。参数的指定和前两题相同,区别在于本题使用的数据文件和事务日志文件为多个,因此要逐一进行列举。
【核心代码】按照以上分析,构建以下核心代码:
CREATE DATABASE Archive ON PRIMARY ( NAME=Arch1, FILENAME='c:\program files\microsoft sql server\mssql.1\mssql\data\archdat1.mdf', SIZE= 100MB, MAXSIZE = 200, FILEGROWTH = 20 ), ( NAME= Arch2, FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat2.ndf', SIZE= 100MB, MAXSIZE = 200, FILEGROWTH = 20 ), ( NAME= Arch3, FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archdat3.ndf', SIZE= 100MB, MAXSIZE = 200, FILEGROWTH = 20 ) LOG ON ( NAME= Archlog1, FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archlog1.ldf', SIZE= 100MB, MAXSIZE = 200, FILEGROWTH = 20 ), ( NAME=Archlog2, FILENAME = 'c:\program files\microsoft sql server\mssql.1\mssql\data\archlog2.ldf', SIZE= 100MB, MAXSIZE = 200, FILEGROWTH = 20 ) GO
【题目4】将两个数据文件和一个事务日志文件添加到Test数据库中。
【分析】该试题是考查对于数据库修改方法的理解。数据文件和事务文件的使用和上几题类似,区别在于本题中是对现有数据库的修改,因此需要使用ALTER DATABASE修改数据库。
【核心代码】按照以上分析,构建以下核心代码:
ALTER DATABASE Test ADD FILE ( NAME= Test1, FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test1.ndf', SIZE= 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB ), ( NAME= Test2, FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\test2.ndf', SIZE= 3MB, MAXSIZE = 10MB, FILEGROWTH = 1MB ) GO ALTER DATABASE Test ADD LOG FILE ( NAME= testlog1, FILENAME='c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\testlog1.ldf', SIZE= 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB ) GO
【题目5】使用T-SQL代码将“user”用户数据库的大小分别扩展到300MB,并缩减到原始状态。
【分析】该试题是考查对于数据库修改方法的理解。与上题不同的是,本题中不是向数据库中新增,而是对已有的数据库进行修改,因此需使用MODIFY关键字。
【核心代码】按照以上分析,构建以下核心代码:
USE user Go ALTER DATABASE user MODIFY FILE ( NAME=' D:\ \data\user.mdf', SIZE=300MB )
【题目6】使用SSMS完成第5题的步骤。
【分析】该试题是考查对于SSMS修改数据库属性的方法的熟悉,参考前文内容进行。注意,正确打开SSMS,并选择对应的数据库,通过修改【属性】对话框中的值来完成修改。
【题目7】使用T-SQL代码将“user”用户数据库的大小缩减到50MB。
【分析】该试题是考查对于数据库修改方法的理解。对于数据库文件的缩减,关键就在于DBCC关键字的使用,然后要正确设定缩减后的数据库大小。
【核心代码】按照以上分析,构建以下核心代码:
USE user GO DBCC SHRINKDATABASE ('user') 50MB
【题目8】使用SSMS完成第7题的步骤。
【分析】该试题是考查对于SSMS修改数据库属性的方法的熟悉,参考前文内容进行。注意,正确打开SSMS,并选择对应的数据库,通过修改【属性】对话框中的值来完成修改。
【题目9】使用T-SQL代码将“user”用户数据库设为单用户。
【分析】该试题是考查对于数据库修改方法的理解。注意使用sp_dboption系统过程完成设置工作。
【核心代码】按照以上分析,构建以下核心代码:
EXEC sp_dboption 'user', 'single user', True
【题目10】使用SSMS完成第9题的步骤。
【分析】该试题是考查对于SSMS修改数据库属性的方法的熟悉,参考前文内容进行。注意,正确打开SSMS,并选择对应的数据库,通过修改【属性】对话框中的值来完成修改。
【题目11】使用T-SQL代码修改“user”用户数据库的名称。
【分析】该试题是考查对于数据库名称变更方法的理解。注意使用sp_renamedb系统过程完成设置工作。
【核心代码】按照以上分析,构建以下核心代码:
EXEC sp_renamedb 'user','user1'
【题目12】使用SSMS完成第11题的步骤。
【分析】该试题是考查对于数据库名称变更方法的理解,参考前文内容进行。注意,正确打开SSMS,并选择对应的数据库,通过修改【属性】对话框中的值来完成修改。
【题目13】使用T-SQL代码删除“user”用户数据库。
【分析】该试题是考查对于数据库删除方法的理解。注意使用DROP关键字。
【核心代码】按照以上分析,构建以下核心代码:
DROP DATABASE user
【题目14】使用SSMS完成第13题的步骤。
【分析】该试题是考查对于数据库删除方法的理解,参考前文内容进行。注意,正确打开SSMS,并选择对应的数据库,通过修改【属性】对话框中的值来完成修改。
【题目15】使用向导创建一个数据库学生成绩数据库Stu_Score。要求数据库增量为3MB,不限制增长总量,按照百分比增长。
【分析】该试题是进一步考查对于数据库创建的理解,同时为后面的进一步应用提供数据库基础。按照示例完成即可,要注意题目中对于所创建的数据库的具体参数的要求。
【核心代码】参照前面的习题。
【题目16】在题目15的基础上,使用T-SQL命令修改数据库容量为30MB。
【分析】该试题是考查对于数据库创建的理解,按照示例完成即可,要注意题目中对于所创建的数据库的具体参数的要求。
【核心代码】参照前面的习题。
【题目17】在题目1的基础上,使用向导修改数据库容量为20MB。
【分析】该试题是考查对于数据库修改方法的理解,参考前文内容进行。
【题目18】将题目15中创建的数据库名称改为Score。
【分析】该试题是考查对于数据库名称变更的理解。
【核心代码】参照前面的习题。
【题目19】使用向导删除学生成绩数据库Score。
【分析】该试题是考查对于数据库删除方法的理解,参考前文内容进行。
【题目20】假设某公司的业务规则如下:
(1)公司下设几个部门,如技术部、财务部、市场部等。
(2)每个部门承担多个工程项目,每个工程项目属于一个部门。
(3)每个部门有多名职工,每一名职工只能属于一个部门。
(4)一个部门可能参与多个工程项目,且每个工程项目有多名职工参与施工。根据职工在工程项目中完成的情况发放酬金。
(5)工程项目有工程号、工程名两个属性;部门有部门号、部门名称两个属性;职工有职工号、姓名、性别属性。
要求回答以下问题:
● 根据上述规则设计E-R模型。
● 将E-R模型转换成关系数据模型,并指出每个关系的主键和外键。
【分析】对于E-R模型的设计,首先要确定实体是什么。对于本题来说,根据题面(5)的描述,实体包括部门、工程项目和职工。接下来要确定实体的属性,这些在题面(5)中也给出得非常清楚。最后要判定模型中的关系,也就是所谓的R,那么从题面(2)到题面(4)可以看出来,部门和职工间是1到N的对应关系,同时部门和工程项目之间也是1到N的对应关系。
(1)E-R模型如下:
(2)对应的关系数据模型如下:
● 部门(部门号,部门名称),其中部门号是主键。
● 职工(职工号,姓名,性别),其中职工号是主键。
● 工程项目(工程号,工程名),其中工程号是主键。
● 隶属(部门号,职工号,职位),其中部门号和职工号既是它的主键也是它的外键。
● 承担(部门号,工程号,起始时间),其中部门号和工程号既是它的主键也是它的外键。
【题目21】学生运动会模型:
(1)有若干班级,每个班级包括:班级号、班级名、专业、人数。
(2)每个班级有若干运动员,运动员只能属于一个班,包括:运动员号、姓名、性别、年龄。
(3)有若干比赛项目,包括:项目号、名称、比赛地点。
(4)每名运动员可参加多项比赛,每个项目可有多人参加。
(5)要求能够公布每个比赛项目的运动员名次与成绩。
(6)要求能够公布各个班级团体总分的名次和成绩。
要求回答以下问题:
● 画出每个实体及其属性关系、实体间实体联系的E-R图。
● 根据试题中的处理要求:完成数据库逻辑模型,包括各个表的名称和属性,并指出每个表的主键和外键。
【分析】对于E-R模型的设计,首先要确定实体是什么。对于本题来说,根据题面(1)~(3)的描述,实体包括班级、运动员和项目。接下来要确定实体的属性,这些在题面中也给出得非常清楚。最后要判定模型中的关系,也就是所谓的R,那么从题面(2)~(4)可以看出,班级和运动员间是1到N的对应关系,同时运动员和项目之间是多到多的对应关系。
(1)E-R模型如下:
(2)逻辑模型如下:
● 班级(班级号,班级名,专业,人数)主键:班级号
● 运动员(运动员号,姓名,性别,年龄,班级号)主键:运动员号外键: 班级号
● 项目(项目号,项目名,比赛地点)主键:项目号
● 比赛(运动员号,项目号,成绩,名次,得分)主键:运动员号,项目号外键:运动员号,项目号