Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9903956
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: Mysql/postgreSQL

2009-10-02 14:03:04

第3学时关系型数据库介绍
在讲解你需要知道的有关SQL Server的知识前,你需要先了解关系型数据库以及它怎样
工作。关于关系型数据库有很多东西。除了逻辑和物理结构外,数据库中还包含很多对象。
这些对象可以是从表到存储过程的任何东西。在本学时内,你将学到这些对象中的许多。在
后面的章节里,你还将学到它们如何工作以及如何创建它们。
本学时的要点包括:
• 关于关系型数据库
• 数据库结构
• 数据库对象
3.1 关于关系型数据库
关于数据库和数据库中所包含的对象的理论浩如烟海。本学时将包含两个层次。第一层
是实际的数据库本身。然后,我们再看看数据库中的对象以及它们的作用。
3.2 数据库结构
在SQL Server中,数据库存储所有的东西。这些数据库都由物理和逻辑组件两部分组成。
逻辑组件是用户在使用数据库时实际看到的。数据库的物理组件用户不能直接看到,它是
SQL Server与之交互来形成逻辑组件的那部分。
3.2.1 物理数据库组件
SQL Server中的每个数据库都至少包括两部分物理组件。这些组件以文件形式存储在服
务器的硬盘上。这两个文件包含了所有用户输入服务器的内容和SQL Server用来维护自身正
常运行所需的信息。用户很少和这些文件打交道。而数据库管理员正是管理这些文件的人。
这些文件有两种类型:数据文件和日志文件。
数据文件是SQL Server用于存储用户输入数据库的所有信息和在数据库中建立的所有对
象。稍后,你将学习更多有关对象的知识。这些文件可以按所设置的格式,随需要变长或缩
短。
数据库中的日志文件是SQL Server用来存储数据库事务日志的。事务日志用来维护数据
库的一致性并藉此来保证对数据库的所有修改要么被完整地执行,要么被取消。如果服务器
在意外事件中被破坏了, SQL Server将检查事务日志来保证用户所有的数据修改都是完整的。
在第4学时“数据库结构基础”中,你将接触到许多关于事务日志的内容。
3.2.2 逻辑数据库组件
数据库与数据文件的相似之处在于它们都是用来存储数据的。用户可以输入数据到数据
库中,然后再从数据库中找到数据。也像数据文件一样,用户很少直接访问存储在数据库的
数据。通常他们运行一个应用程序来从数据库或数据文件中找到数据,用一种可读的和能理
解的格式表示出来。
数据库和数据文件主要的不同是数据库中的数据是高度组织的,检索起来更容易。在设
计正确的数据库中,很少有冗余的数据存储。这使数据库开发员的工作非常容易,因为如果
他们需要修改一组数据的话,比如地址,他们只要到一个地方便可全部修改。关系型数据库
就是这样的。
关系型数据库是最有效的管理数据的方式之一。关系型数据库管理系统是关于数据怎样
才能高效存储的数学理论的应用。在所有的关系型数据库管理系统中,所有的数据都存储在
按表分组的数据库中。一个表,作为数据库理论中的一种关系,是某些批量数据的代表,它
对组织收集来的数据是非常重要的。例如:许多公司要在一个数据库中跟踪公司雇员的情况。
数据库的每个表都包含了对于跟踪雇员情况非常重要的信息。这些表包含列(也称为属性)和行
(也称为组或记录)。回到雇员跟踪数据库中,你可能有一个表跟踪雇员的基本情况,如雇员的
号码、姓名、地址、电话号码和部门。数据库中另一个表可能包含雇员目前被分配的工作。
雇员同时可能有多份工作任务。关系型数据库设计中最重要的部分之一是表中的重复数据非
常少。例如:如果在数据库中不只一列包含有雇员的电话号码,这个数据库就设计得不好。
由于每个雇员可能被分配了许多项目,你需要通过一个唯一的I D (如雇员号)来连接雇员到这
些项目。图3 - 1概要地表示了这一方式。
3.3 数据库对象
现在你对关系型数据库到底是什么有了一些了解,我们需要学习存在于数据库中的东西。
这些东西叫作对象,它们可以是从表到在数据库中用来执行应用程序功能的一小段代码的任
何东西。在本节中,我们将学习并定义这些数据库对象,在后面的课程中,我们将学习创建
这些对象中的大部分。
3.3.1 表
表是由列和行组成的一种简单的数据库对象,它可用来存储数据。在数据库中可以有多
2 2 SQL Server 7 24学时教程
下载
图3-1 关系型数据库的一个
例子
达2 0亿个表,每个表可以有1 0 2 4列。唯一限制数据库中行数的因素是你用来放置数据库的磁
盘的空间。在SQL Server的表中每行的长度最多是8 0 6 0字节。表中每列只能包含一种数据类
型。SQL Server支持两种类型的表:永久表和临时表。
永久表在数据库中建立后一直存在,直到被删除。通常,这些表用来存储永久数据,诸
如你的用户创建的任何东西。这些表建立在指定的数据库中。
另一类表是临时表。这些表通常由用户应用程序创建用来存储临时数据。有两种类型的
临时表。第一类是局部临时表。该表由一个用户建立并且只能供这位用户访问。另一类临时
表是全局临时表。这类表由一名用户建立而本系统中的每个用户都可访问。这些表建在
t e m p d b数据库里。局部临时表在创建它的用户退出系统时被清除。全局临时表在创建它的用
户退出系统时被删除,而那些正引用它的用户也将退出引用。临时表创建时用前缀#表示局部
临时表,用# #表示全局临时表。
3.3.2 视图
视图本质上是与表相关的,因为视图本质上就是虚拟表。视图用另一种方式来代表一个
或多个表中的数据。视图只能建立在你当前正在使用的数据库中。下面是使用视图的一些理
由:
• 集中到特定的数据上—使用视图的最好理由之一是把用户的注意力集中到数据库工作
中要用的特定的数据上。这对用户来说非常有用,这样他就可以只得到需要的数据而没
有别的。例如,你可以建立一个基于雇员姓名和电话号码的视图来生成一张电话号码
表。
• 简化查询—视图是基于那些通常非常复杂的查询而建立的。那些查询要跨许多表,建
立一个列组合,并执行子查询。因为可以代替执行复杂的查询,所以视图可以使之简化,
这样用户只需要查询视图。例如可以建立一个视图从几个表中找到数据来告诉管理员哪
个雇员在哪个项目管理员管理下干哪个项目。
• 定制数据—视图允许用户根据他们的需要,用不同的技巧和功能,以不同的方式来查
阅相同的数据。例如可以建立一个只含某个经理领导下的雇员的数据的视图。
• 安全性—视图在你处理高密级的数据时很有用。可以建立一个视图只允许用户看一个
表中一部分特定的数据,而不允许看到表本身。换句话说,你的用户可以通过视图访问
这些数据,但是如果用户试图访问表本身时,访问将失败。例如工资单信息。你可以建
立一个视图允许人们查阅一些基本情况,如姓名和部门,但是当用户要查阅那些人工资
的数额时,就会受到阻止。
• 导出数据—可以建立一个基于多个表的视图,然后用SQL Server Bulk Copy Program
(批拷贝程序, B C P )拷贝视图引用的行到一个平面文件中。这个文件可以加载到E x c e l或
类似的程序中供分析用。
• 简化对切分数据的访问—许多时候,对于那些很活跃的数据库,你要把其中的大表按
某个标准(比如日期)切分成小表。这样在某种程度上会增加查询难度。为了简化,你可
以建立一个视图,然后简单地查询这个视图即可。
对你来说非常重要的是,要认识到在视图中没有存储任何数据。视图仅仅是一种较简单
的访问数据库里其他表中数据的方式。
第3学时关系型数据库介绍2 3
下载
3.3.3 索引
索引是一种特殊类型的数据库对象,它与表直接相关。索引用来提高访问表中数据的速
度,并能使一些数据完整性问题得到强制,如表中行的唯一性。索引包含了由表中至少一列
所构成的键值。这些键值使得SQL Server能很快地指向表中的行而无需扫描全表。如果你创
建一个没有建立索引的表, SQL Server在存储数据到表中时不会有什么特别的顺序。
如下所述, SQL Server中可以建立两种类型的索引:
• 簇索引( c l u s t e r e d )—在簇索引中,SQL Server按它被索引的顺序来存储数据。例如:在
一个包含姓氏的表中,如果按姓氏索引, SQL Server就会依字母顺序来存储姓名。如果
这个键值是基于数值类型列建立的, SQL Server将按数值大小顺序来存储数据。这类索
引对查找指定行或指定范围的行是非常有用的。只有当表中有了簇索引后,表中的数据
才可以按某种顺序来存储。在每个表中你只能建立一个簇索引,因为数据不可能同时按
不同的顺序存储。
• 非簇索引( n o n c l u s t e r e d )—非簇索引与簇索引按完全不同的结构对数据排序。非簇索引
有一个索引键值与行中的值相关联,这样就有一个指针可指向该行在数据库中的实际位
置。表中的数据并没有按非簇索引指定的顺序存储。你可以经常看到这种类型的索引在
表中使用,如在一组列中有一个簇索引,而表却要经常搜索另一组列,所以在这些值上
建一个索引是很重要的。
使用索引时,一定要记住经常用来查找的那些列(如雇员的I D号或姓氏)应该用作索引。这
样会大大加速查找数据的进程。
3.3.4 数据类型
数据类型用来定义你要放进表中的数据或变量的类型。通常有几种目的。第一,它将告
诉SQL Server将有什么类型的数据,这样可为该数据类型优化存储空间分配。第二,它可让
开发人员去决定采集哪种类型的数据—例如,数值型或字符型—并强制用户输入相同类型
的数据。任何输入不同于该类型的数据的尝试都会出错。最后,数据类型确保了表中所有行
的一致性。
SQL Server中有许多不同的数据类型可选用。如果这些数据类型对你来说不够用,你也
可以创建自己的数据类型,但必须要基于SQL Server所提供的原始数据类型。本学时中,我
们不详细讲述数据类型,在第7学时“创建表”中我们将深入讨论。
3.3.5 约束
约束是确保数据库中的数据按你所需的形式存在的一种方法。约束可用来定义数据格式
的规则、在一个表中确保唯一性、保证数据能实际填入一列、保证多表间的列的完整性。如
下所述,SQL Server用到五种类型的约束:
• 非空(NOT NULL)—这种类型的约束用来迫使用户一定要在表中指定列中输入一个值。
每个表中你可以有多个非空约束。例如:在一个电子电话号码簿应用程序中,你想要保
证每一个新名字增加时,都要有一个名字和一个电话号码。你可以注明这些列的约束条
件是数据为非空。这样,如果用户试图向表中输入这些列包含空值( N U L L )的行时,都
将失败。
2 4 SQL Server 7 24学时教程
下载
• 检查( C H E C K )—检查约束用来指定一个布尔操作,它让SQL Server限制可输入到表中
的值。如果布尔表达式值为假,则该行被拒绝并产生一个错误。例如:检查约束可以用
来告诉SQL Server奖金列的值必须限制在2%到1 5%之间。这样,不管什么时候,只要
有值输入该列,都会用该约束来检查以保证数据有效。在每个表和每个列中你都可以建
立多个检查约束。
• 唯一性( U N I Q U E )—唯一性( U N I Q U E )约束用来迫使用户的应用程序都必须向列输入一
个唯一的值。如果用户试图输入一个该列中已经存在的值,此行将被拒绝并产生一个错
误。如果该列有允许空值的约束,唯一性( U N I Q U E )约束也允许空值。
• 主键( P R I M A RY KEY)—主键约束用来建立一列或多列的组合供SQL Server在表中来
识别每行。主键用来强制所谓的实体完整性,这意味着主键的列必须具有唯一性。每张
表中只能有一个主键,并且构成主键的每一列不能允许空值。如果主键由几列定义,一
定要记住这些列的组合值必须是唯一的。
• 外键(FOREIGN KEY)—外键约束用来在两张表中建立一个链接。当在一个表中作为
主键的一列被增加到另一个表中,链接就建立了。外键约束的主要功能是阻止用户键入
在另一个表中没有相关行的数据到表中。例如:在一个订货处理环境中,你可能有两张
表分别为客户表和订单表。订单表有一个引用客户表的外键约束。其中的原因是你总希
望订单表中每条记录在客户表中都有对应行。否则,你的运输部门有一批货要运,但是
却不知道往哪里运。
如果能正确使用,约束将是一个非常强大的工具。
3.3.6 存储过程
存储过程是一组已被编辑在一起的执行某种功能的S Q L语句。它们可以用来向用户返回
数据并且可以获得对应用逻辑的统一执行。如下所述,使用存储过程大有益处:
• 人们可以把用于完成相同任务的S Q L语句和逻辑在一个地方进行设计、编码、测试。然
后,需要用到该功能的应用程序都可以执行该存储过程。
• 存储过程可以节省因执行大块S Q L脚本而增大的网络通信量,从而提高服务器效率。这
样,所有的客户机只需要执行这个单独的存储过程就行了。
• 存储过程能使你的用户不必去了解有关表结构的每件事。他们只需要知道去执行一个存
储过程来得到明确的结果。
你可以用存储过程来做大量的事情。在第2 1学时“ SQL Server编程”中,你将学会怎样
使用存储过程。
3.3.7 触发器
最后但也很重要的是,你需要学习触发器。触发器与存储过程相似,因为事实上它们都
是一组S Q L语句。主要区别在于触发器是怎样执行的。当表中的一行被插入、修改或删除时,
触发器被执行,这要依赖于触发器是怎样创建的。当数据被修改时,触发器是保证业务规则
的非常强大的方法。一个表可以有最多三个不同的触发器。你可以有一个在修改发生时进行
触发的触发器,一个由插入来触发的触发器,一个由删除来触发的触发器。触发器可以是
SQL Server自动执行业务处理的一种方式。例如:当一名作者的书已经卖掉足够多已达到预
第3学时关系型数据库介绍2 5
下载
付版税款对应的数量时,触发器可以用来自动开始计算版税报酬。触发器可以在表中记录被
成功地修改后才开始触发。如果因语法错误或违反约束导致修改失败,则触发器不启动。
处理触发器时,你要小心一点。尽管触发器功能很强大,但是常常会大大降低服务器的
效率。注意不要试图在触发器上放太多的功能,这样会减慢响应而使你的用户着急。
3.4 课时小结
在本学时中,我们学了关于数据库的许多概念。这些概念在你更深入地了解数据库以前
应该先搞清楚。首先,我们一般性地介绍了数据库。然后我们讲解了数据库中的所有对象以
及它们能做什么。
3.5 专家答疑
问题:什么情况下我不应考虑一个涉及多个表的视图?
解答:当你和视图打交道时,主要问题之一是什么时候执行插入、修改、删除操作。在
一个涉及几个表的视图中,你不能执行任何这些数据修改操作。
问题:如果我创建一个有太多功能的触发器,我有可能会遇到哪类性能上的问题?
解答:最大的问题是导致触发器的运行要花费大量时间。如果触发器有太多的功能,它
将导致其他用户等待。一个用户在执行任何数据修改后,都会引起触发器启动,触发器影响
到的行将会被持有,直到触发器运行结束。例如:如果触发器要花1 0秒钟运行,其他用户必
须要在最初访问的用户运行后再过1 0秒,才能访问这些行。
3.6 课外作业
这些思考题和练习题是供你加深理解用的。答案可以在附录“答案”中找到。
3.6.1 思考题
1) 在物理上,数据库是怎样实现的?
2) 什么是表?
3) 视图能为你做什么?
4) 什么类型的约束能保证表中的每行彼此不同?
5) 什么类型的约束能保证一个表中的每行在另一个表中有匹配的一行?
6) 什么是存储过程?
7) 触发器可以执行什么功能?
3.6.2 练习题
看看你注册的服务器中的数据库,查看其中有哪些对象?
阅读(1286) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~