Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8409
  • 博文数量: 6
  • 博客积分: 390
  • 博客等级: 一等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-22 11:29
文章分类

全部博文(6)

文章存档

2010年(6)

我的朋友
最近访客

分类: 数据库开发技术

2010-11-11 23:49:31

创建和维护数据库概述

客户端/服务器型数据库系统由程序和数据结构两部分组成:

  • 程序为基于客户端的用户数据访问提供界面。
  • 数据库结构管理和存储服务器上的数据。

例如,如果使用 Microsoft® SQL Server™ 2000 创建支票帐户应用程序,则必须建立一个数据库结构来管理帐户交易数据,还要建立一个应用程序充当数据库的用户界面,从而使用户得以访问支票帐户的信息。

要创建能够满足业务需要的数据库,要求对如何设计、创建和维护各个组件有深刻的理解,这样才能确保数据库最佳地运行。

主题 描述
描述怎样使用数据库表示、管理和访问数据。
描述怎样使用表存储数据行和定义多个表之间的关系。
描述怎样使用索引提高访问表中数据的速度。
描述各种视图及其作用,它们的作用在于为查看一个或多个表中的数据提供变通方式。
描述这些 Transact-SQL 程序是怎样将业务规则、任务和进程集中在服务器内的。
描述作为特殊类型存储过程的触发器的功能,只有修改表中的数据时才执行这类存储过程。
描述全文索引是如何提高对存储在基于字符的列中数据(如 varchartext)的查询功能的。

数据库

在 Microsoft® SQL Server™ 2000 中,数据库由包含数据的表集合和其它对象(如)组成,目的是为执行与数据有关的活动提供支持。存储在数据库中的数据通常与特定的主题或过程(如生产仓库的库存信息)相关。

SQL Server 能够支持许多数据库。每个数据库可以存储来自其它数据库的相关或不相关数据。例如,服务器可以有一个数据库存储职员数据,另一个数据库存储与产品相关的数据。另一种方案是,一个数据库可以存储当前客户的订单数据,而另一个相关的数据库可以存储用于年度报告的历史客户订单。

在创建数据库之前,理解数据库的各组成部分及其设计方法,以确保实现数据库后,数据库能很好地运行是很重要的。

表是包含数据库中所有数据的数据库对象。表定义为列的集合。与电子表格相似,数据在表中是按行和列的格式组织排列的。每行代表唯一的一条记录,而每列代表记录中的一个域。例如,在包含公司雇员数据的表中每一行代表一名雇员,各列分别表示雇员的详细资料,如雇员编号、姓名、地址、职位以及家庭电话号码等。

索引

数据库中的索引与书籍中的索引类似。在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置。可以为表中的单个列建立索引,也可以为一组列建立索引;索引采用 B 树结构。索引包含一个条目,该条目有来自表中每一行的一个或多个列(搜索关键字)。B 树按搜索关键字排序,可以在搜索关键字的任何子词条集合上进行高效搜索。例如,对于一个 ABC 列上的索引,可以在 A 以及 ABABC 上对其进行高效搜索。

大多数书中包含一个关于词汇、名称、地点等等的总索引。数据库则包含分别关于所选类型或数据列的索引:这好比在一本书中分别为人名和地名建立索引。当创建数据库并优化其性能时,应该为数据查询所使用的列创建索引。

在随 Microsoft® SQL Server™ 2000 提供的 pubs 示例数据库中,employee 表在 emp_id 列上有一个索引。下面的示意图显示索引如何存储每个 emp_id 值并指向表中包含各个值的数据行。

当 SQL Server 执行一个语句,在 employee 表中根据指定的 emp_id 值查找数据时,它能够识别 emp_id 列的索引,并使用该索引查找所需数据。如果该索引不存在,它会从表的第一行开始,逐行搜索指定的 emp_id 值。

SQL Server 为某些类型的约束(如 PRIMARY KEY 和 UNIQUE 约束)自动创建索引。可以通过创建不依赖于约束的索引,进一步对表定义进行自定义。

不过,索引为性能所带来的好处却是有代价的。带索引的表在数据库中会占据更多的空间。另外,为了维护索引,对数据进行插入、更新、删除操作的命令所花费的时间会更长。在设计和创建索引时,应确保对性能的提高程度大于在存储空间和处理资源方面的代价。

视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。

通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

下图显示了在两个表上建立的视图。

存储过程

在使用 Microsoft® SQL Server™ 2000 创建应用程序时,Transact-SQL 编程语言是应用程序和 SQL Server 数据库之间的主要编程接口。使用 Transact-SQL 程序时,可用两种方法存储和执行程序。可以在本地存储程序,并创建向 SQL Server 发送命令并处理结果的应用程序;也可以将程序在 SQL Server 中存储为,并创建执行存储过程并处理结果的应用程序。

SQL Server 中的存储过程与其它编程语言中的过程类似,原因是存储过程可以:

  • 接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理。
  • 包含执行数据库操作(包括调用其它过程)的编程语句。
  • 向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因)。

可使用 Transact-SQL EXECUTE 语句运行存储过程。存储过程与不同,因为存储过程不返回取代其名称的值,也不能直接用在表达式中。

使用 SQL Server 中的存储过程而不使用存储在客户计算机本地的 Transact-SQL 程序的优势有:

  • 允许模块化程序设计。

    只需创建过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改。

  • 允许更快执行。

    如果某操作需要大量 Transact-SQL 代码或需重复执行,存储过程将比 Transact-SQL 批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。每次运行 Transact-SQL 语句时,都要从客户端重复发送,并且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。

  • 减少网络流量。

    一个需要数百行 Transact-SQL 代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。

  • 可作为安全机制使用。

    即使对于没有直接执行存储过程中语句的权限的用户,也可授予他们执行该存储过程的权限。

SQL Server 存储过程是用 Transact-SQL 语句 CREATE PROCEDURE 创建的,并可用 ALTER PROCEDURE 语句进行修改。存储过程定义包含两个主要组成部分:过程名称及其参数的说明,以及过程的主体(其中包含执行过程操作的 Transact-SQL 语句)。

请参见

用触发器强制执行业务规则

Microsoft® SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。

触发器的优点如下:

  • 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
  • 触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。

    与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

  • 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
  • 一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
比较触发器与约束

约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。

总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,应通过 CHECK 约束进行强制,而则应通过 FOREIGN KEY 约束进行强制。

在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:

  • 除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。
  • CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。
  • 约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。

触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。

  • 触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。
  • 如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果约束破坏,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。

重要   强烈建议不要在 master 数据库中创建任何用户对象(如表、视图、存储过程或触发器)。master 数据库包含系统表,这些系统表存储 SQL Server 所用的系统信息(如配置选项设置

阅读(361) | 评论(0) | 转发(0) |
0

上一篇:MySQL 备份和恢复

下一篇:没有了

给主人留下些什么吧!~~