数据库培训课程word版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库
数据库由包含数据的表集合和其它对象(如视图、索引、存储过程和触发器)组成,目的是为执行与数据有关的活动提供支持。存储在数据库中的数据通常与特定的主题或过程(如生产仓库的库存信息)相关。
SQL Server 能够支持许多数据库。每个数据库可以存储来自其它数据库的相关或不相关数据。例如,服务器可以有一个数据库存储职员数据,另一个数据库存储与产品相关的数据。另一种方案是,一个数据库可以存储当前客户的订单数据,而另一个相关的数据库可以存储用于年度报告的历史客户订单。
在创建数据库之前,理解数据库的各组成部分及其设计方法,以确保实现数据库后,数据库能很好地运行是很重要的。
数据库的组成
表
表是包含数据库中所有数据的数据库对象。表定义为列的集合。与电子表格相似,数据在表中是按行和列的格式组织排列的。每行代表唯一的一条记录,而每列代表记录中的一个域。例如,在包含公司雇员数据的表中每一行代表一名雇员,各列分别表示雇员的详细资料,如雇员编号、姓名、地址、职位以及家庭电话号码等
数据库表的特性
在关系数据库设计理论中,规范化规则指出了在设计良好的数据库中必须出现或不出现的某些特性。关于规范化规则的完整讨论不属于本主题的范畴。不过,有几个可帮助获得合理的数据库设计的规则:
表应该有一个标识符。
数据库设计理论的基本原理是:每个表都应有一个唯一的行标识符,可以使用列或列集将任何单个记录同表中的所有其它记录区别开来。每个表都应有一个 ID 列,任何两个记录都不可以共享同一 ID 值。作为表的唯一行标识符的一列或多列是表的主键。
表应只能存储单一类型实体的数据。
试图在表中存储过多的信息会妨碍对表的数据进行有效、可靠的管理。在SQL Server 2000 的pubs 数据库中,书名和出版商的信息存储在两个独立的表内。尽管在titles 表中同时创建书籍及其出版商的信息列是可能的,但是这种设计会导致几个问题。必须为出版商出版的每本书添加并存储出版商信息,而这是没有必要的,并且会占用数据库中的额外存储空间。
如果出版商的地址更改了,则必须对每本书进行更改。出版商的最后一本书从标题表中删除后,该出版商的信息就会丢失。
在pubs数据库中,书和出版商的信息存储在titles和publishers表中,有关出版商的信息只须输入一次,然后即链接到每本书上。当出版商信息更改时,只需要在数据库中的一个地方进行更改,即使该出版商在数据库中没有书,出版商信息仍然存在。
表应避免可为空的列
表中的列可定义为允许空值。空值表示没有值。尽管在个别情况下,允许空值有用,但是最好少用空值,因为空值需要进行特殊的处理,这样会增加数据操作的复杂性。如果某一表中有几个可为空的列,并且列中的几行有空值,则应考虑将这些列置于链接到主表的其它表中。将数据存储在两个独立的表中使主表的设计更为简单,但能够满足存储空值信息的偶尔需要。
表不应有重复的值或列
数据库中某一项目的表不应包含特定信息的值列表。例如,pubs数据库中的书可以是合著的。如果在titles表中有一列是作者的名称,这就会出现问题。一种解决方法是:在列中存储两位作者的姓名,但这样会很难显示单个作者的列表。另一种解决方法:是更改表的结构,为第二位作者的姓名添加另一列,但这只能包含两位作者。当然,如果一本书有三位作者,则必须再添一列。
索引
数据库中的索引与书籍中的索引类似。在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置。可以为表中的单个列建立索引,也可以为一组列建立索引;索引采用 B 树结构。索引包含一个条目,该条目有来自表中每一行
的一个或多个列(搜索关键字)。B 树按搜索关键字排序,可以在搜索关键字的任何子词条集合上进行高效搜索。例如,对于一个
A、B、C 列上的索引,可以在 A 以及A、B和A、B、C 上对其进行高效搜索
数据库索引的特性
计索引时还要考虑的其它准则包括:
•一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能,因为 SQL Server 有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。
•覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列都包含在同一个索引中。例如,如果在一个表的a、b和c列上创建了组合索引,则从该表中检索a 和b列的查询被视为覆盖的查询。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了 I/O 总量。尽管给索引添加列以覆盖查询可以提高性能,但在索引中额外维护更多的列会产生更新和存储成本。
•对小型表进行索引可能不会产生优化效果,因为 SQL Server 在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。
•应使用 SQL 事件探查器和索引优化向导帮助分析查询,确定要创建的索引。为数据库及其工作负荷选择正确的索引是非常复杂的,需要在查询速度和更新成本之间取得平衡。窄索引(搜索关键字中只有很少的列的索引)需要的磁盘空间和维护开销都更少。而另一方面,宽索引可以覆盖更多的查询。确定正确的索引集没有简便的规则。经验丰富的数据库管理员常常能够设计出很好的索引集,但是,即使对于不特别复杂的数据库和工作负荷来说,这项任务也十分复杂、费时和易于出错。可以使用索引优化向导使这项任务自动化。
SQL Server 执行一个语句,在employee表中根据指定的emp_id值查找数据时,它能够识别emp_id列的索引,并使用该索引查找所需数据。如果该索引不存在,它会从表的第一行开始,逐行搜索指定的emp_id值。
SQL Server 为某些类型的约束(如 PRIMARY KEY 和 UNIQUE 约束)自动创建索引。可以通过创建不依赖于约束的索引,进一步对表定义进行自定义。