第二部分:从关系角度理解SQL

feilniu 2010-08-26 06:27:21
第二部分:从关系角度理解SQL


6. 从关系角度理解SQL

6.1. 关系和表

众所周知,我们目前所用的数据库,通常都是关系数据库。关系自然在其中处于关键位置。初学数据库原理的人可能会很困惑关系和表是什么联系,如果没有清楚的理解,很可能会认为关系这个概念没有实际意义,只会引起混淆。
其实这两组概念只是由于理论界与技术界的着重点不同。前者需要用一个专业的、没有歧义的概念来进行理论探讨,后者则希望在实际应用中能够使用一个直观的、容易理解的词汇。通常情况下,可以认为关系和表是一回事。

就定义来说:关系是元组(即表的记录,或行)的集合。此外,关系还有以下特征:
- 关系含有一组属性(即表的字段,或列),含有N个属性的关系可称为N元关系。
- 一个关系的元组含有与关系相同的属性,N元关系的元组都是N元组,一个元组中对应每个属性有一个值。
- 一个属性的域(即字段的数据类型,但域的要求更严格,详见下文“数据类型”),即该属性所有可能的值的集合。

从这里可以看出关系和表的区别:关系作为一种集合,不会包含重复元组;而表则可以包含重复记录。这是SQL面对的诸多指责之一,但有其技术合理性。这里的区别在理解上影响不大,不妨把表理解为“可能(但通常不应该)重复的集合”。注意到这点区别,以下我们便可以对关系和表不加区别的使用了。

另外,这里的关系和表,指的是所有表值的东西,包含物理表、虚拟表(视图)、派生表(一个用在FROM子句的子查询)、表变量、表值函数、等等。它们在物理上有区别,但在逻辑上是等价的。

6.2. 关系模型

数据库建模(即表结构设计)的过程,是根据现实世界的业务需求,设计一个表示和存储业务数据的关系数据模型。在设计过程中可以借助E-R模型来简化问题,因为E-R模型可以更直观地对应于现实世界,也可以很容易地转化为关系模型。对于熟练的设计者,可以省略E-R模型,直接构建关系模型。

而关系模型在关系数据库中基本上可以直接表示,所以关系模型与物理模型差别不大。物理模型通常只是根据需要添加必要的索引,或是将概念上的表在物理上映射为分区视图或分区表。

以上几个模型的关系见下图:


简单总结一下关系模型设计中的两个要点:

1. 完整性约束(Integrity constraint)

完整性约束保证数据的一致性(符合基本条件),包含以下3种类型:
- 实体完整性(主键约束):一个表的主键不能为空。
- 参照完整性(外键约束):一个表的外键必须存在于所参照的表中。
- 自定义完整性(CHECK约束,UNIQUE约束):即表中的数据不能违反约束定义的条件(不能使CHECK的表达式为False,不能使UNIQUE约束的字段或字段组合出现重复值)。

完整性约束定义了系统概念模型的边界,很大程度上防止了脏数据进入系统,这是非常重要的,因为脏数据往往比没有数据还要讨厌(这与“错误的观点胜过没有观点”恰恰相反)。

在设计表结构时,外键、CHECK、UNIQUE约束或许可以适当省略(出于运行性能和开发效率的考虑,并且相信表数据只有统一存储过程修改,不会出现脏数据),但主键通常是一定需要的。主键不仅意味着可以高效查询(因为目前DBMS的主键通常都是通过B+树聚集索引实现的),更重要的是清楚地说明了表中数据的唯一标识是什么。(目前我只发现一种不需要主键的情况:日志表——同一时刻可能有多笔记录,所以datetime不能作为主键;而一个递增的LogID也没有太大实际意义,参看关于聚集索引选择方案的疑问一帖。)

关于主键的选择方案,详见一个基础问题一帖。

给我看表的数据样本,以及(可能)过时的数据字典和程序文档,我仍然迷惑不解。如果给我看完整的表的定义(要包括各种完整性约束,特别是主键),通常就不需要查看表中的数据样本了,甚至连文档也可以省去。(这两句话借鉴了Brooks在《人月神话》一书中的话。参见《UNIX编程艺术》1.6节脚注。)

2. 范式(Normal Form, NF)

范式是一组关系(表)设计的原则,通过避免冗余防止出现数据的更新异常(即DRY原则的体现)。在实践上常用的是以下3个层次的范式:
- 1NF:表中的字段都是原子的。
- 2NF:表中的所有字段都可以由主键唯一决定(函数依赖)。
- 3NF:除完整主键以外,其它字段(包括部分主键)之间不存在决定关系(函数依赖)。

首先说明一下1NF的“原子的”。这个“原子的”是指业务需求不需要对这个值进行拆分(没有前提条件,“拆分”一词是有多种解释的,如字符串可以拆分成字符,整数可以拆分成二进制的位串或素因子的乘积)。例如,城区、街道、门牌号是地址的三部分,如果地址只是作为一个记录,不需要更细粒度的处理,则可以将三部分存在一个字段;如果需要根据城区进行查询和分组统计,则至少需要把城区作为一个单独的字段。所以,一个字段是不是“原子的”必须根据业务需求这个条件来定义。实践中业务需求是会变化的,因而系统设计还需要一定的前瞻性。目前一个原子的字段可能随着需求变化而不再是原子的。

范式给出了一组表应该怎样设计的原则,但没有说明如何把表设计成这样。数据库理论上的关系范式分解过于抽象,以下是一点实用性的思路:
- 1NF:让表中的每个字段都不需要拆分处理(至少不需要太复杂的拆分处理)。如姓名的结构很简单,通常不需要设计成姓和名两个字段,但如果是一个国际化的系统,不同文化中姓名的结构可以不同,这时则最好把LastName和FirstName分开存放,比如Facebook、Twitter等网站的设计。
- 2NF:给表定义主键。参看上文关于实体完整性的讨论。
- 3NF:不要在同一个表中存放相关数据或派生数据,只存放主要数据,其它数据通过联接查询或计算获得。如不要在员工表中同时存放部门ID和部门名称(相关数据)或同时存放出生年月和年龄(派生数据),其中部门ID或出生年月是主要数据,部门名称可以通过联接查询获得,年龄可以通过计算获得。

有些情况下出于结构的直观或查询性能的考虑,可能会需要反范式的设计。如在一个字符串字段中存放逗号分隔的多个值(形如'1,2,3,5,8',违反1NF),或是在一个表中同时存放相关数据或派生数据来避免联接或计算开销(比如同时存放部门ID和部门信息来避免联接部门表,或同时存放员工各项薪酬福利和总薪资来避免复杂的薪资计算,违反3NF)。反范式的设计会带来复杂的查询处理或冗余,更好的方案是基本数据用符合范式的表存储,通过统一的过程来计算和刷新缓冲表来提高查询时的性能,参看《程序员修炼之道》第7节关于DRY原则的讨论。

6.3. 关系运算

表的查询,与关系代数(Relational Algebra)定义的关系运算是等价的。理解关系运算,或许可以简化对查询的认识。

常用的基本关系运算只有4类(够简单吧):

1. 基本的集合运算(双目运算)

关系是元组的集合,所以关系也支持基本的集合运算:
- 并(union):对应SQL关键字UNION
- 交(intersection):对应SQL关键字INTERSECT
- 差(difference):对应SQL关键字EXCEPT

不同的是,关系的集合运算,要求参与运算的两个关系必须含有相同属性集(属性的个数和类型都一样)。
由于表允许重复记录,在SQL中以上三种操作还可以是UNION ALL/INTERSECT ALL/EXCEPT ALL的形式,结果不去除重复记录。

2. 提取关系的一部分的运算(单目运算)

- 选择(selection):根据条件过滤出指定的元组(行),对应SQL查询的WHERE子句
- 投影(projection):根据列表过滤出指定的属性(列),对应SQL查询的SELECT子句

由于表允许重复记录,关系的投影运算事实上等价于SELECT DISTINCT的效果。而SELECT的默认效果是不去除重复记录。

3. 两个关系的联接(双目运算)

- 笛卡尔积(Cartesian product):对应SQL关键字CROSS JOIN(与FROM后的多个表直接用逗号分隔效果相同)
- 内联接(Inner Join):对应SQL关键字INNER JOIN
- 外联接(Outer Join):对应SQL关键字{LEFT | RIGHT | FULL} OUTER JOIN

4. 聚合运算(单目运算)

根据指定属性(列)分组,同时可以使用聚合函数。对应SQL查询的GROUP BY子句。

以上4类关系运算,不管是单目运算还是双目运算,其结果依然是一个关系,因而可以继续进行运算。

通常情况下的SQL查询,除一些特殊的语言特性外(如TOP、排序函数等),主要的查询逻辑都是这4类关系运算的组合。

6.4. 数据查询

1. 查询的逻辑处理过程

以T-SQL为例,一个查询(完整SELECT语句)的逻辑处理过程如下(其中括号中的数字表示处理顺序):

(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list> (6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>

说明:
+ 有些子句是可选的。比如JOIN可能出现0到多次,GROUP BY和HAVING可能出现0到1次。
+ 从以上顺序可以看出,为何在WHERE子句不能使用SELECT的计算结果,但在ORDER BY子句却可以。
+ 查询的逻辑处理过程与物理处理过程可能并不相同。但对于SQL的学习来说,先理解逻辑处理过程是必须的。先要知道怎样计算出正确的结果,才谈得上怎样更高效地计算出正确的结果。

该内容详见《Microsoft SQL Server 2005技术内幕:T-SQL查询》第1章。

2. 查询条件

在SQL Server联机丛书中,查询条件的BNF语法图如下:

Search Condition
< search_condition > ::=
{ [ NOT ] <predicate> | ( <search_condition> ) }
[ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ]
[ ,...n ]
<predicate> ::=
{ expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
| string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ]
| expression [ NOT ] BETWEEN expression AND expression
| expression IS [ NOT ] NULL
| expression [ NOT ] IN ( subquery | expression [ ,...n ] )
| expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery ) }
| CONTAINS ( { column | * } , '< contains_search_condition >' )
| FREETEXT ( { column | * } , 'freetext_string' )

其中:predicate为断言,expression为标量表达式,subquery为子查询。查询语句返回使查询条件为True的结果。

3. 子查询

一个查询如果作为一个语句的一部分,则称为子查询。

a. 按结果分类:
- scalar subquery:如果查询结果是标量值,即只有一行一列,则为标量子查询(标量表达式)。
- table-valued subquery:反之则是表值子查询(表值表达式)。

b. 按查询是否涉及外层表分类:
- self-contained subquery:不涉及外层表的子查询是不相关子查询,如SELECT a.* FROM a WHERE a.id IN (SELECT b.id FROM b)。
- correlated subquery:反之则是相关子查询,如SELECT a.* FROM a WHERE EXISTS (SELECT * FROM b WHERE b.id = a.id)。

c. 按子查询所在的位置分类:
- In search_condition:在查询条件中的子查询,比如上文语法图中的所有subquery。
- In FROM clause:在FROM子句中的子查询,又称派生表,如SELECT * FROM (SELECT * FROM a) tmp,派生表一定要指定表别名。(SQL Server 2005之后支持Common Table Expressions,可视为派生表的变形,但可以在一个查询中多次使用,而且支持Recursive CTE这种高级功能,详见联机丛书。)
- In SELECT clause:在SELECT子句中的子查询,如SELECT d.DepID, ManagerName = (SELECT e.EmpName FROM Employee e WHERE e.EmpID = d.ManagerID) FROM Department d WHERE ...,这种子查询性能较差,通常可以用JOIN代替。如果可能,尽量避免使用SELECT子句中的子查询。

6.5. 数据修改

在SQL Server中,修改数据(增、删、改)的语句支持以下格式:

1. 增(INSERT)

INSERT INTO <table>(<column_list>) VALUES(<values>)
INSERT INTO <table>(<column_list>) SELECT <values> FROM ...
INSERT INTO <table>(<column_list>) EXEC <usp>
SELECT <values> INTO <table> FROM ...

以上4个语句:
第1个是SQL标准的插入语句(SQL Server 2008还支持在VALUES子句指定多个元组);
第2个和第3个是T-SQL扩展的插入语句,但要求SELECT语句和EXEC存储过程的结果集与目标表的指定插入列字段个数一致且数据类型一一对应(或可以隐式转换);
第4个不是插入语句,而是根据SELECT语句的结果集创建一个表并将结果数据插入其中,注意与第2个语句的区别。

2. 删(DELETE)

DELETE FROM <table> [WHERE <where_condition>] !!!
DELETE FROM <table> FROM <table> JOIN <another_table> ON <join_condition> WHERE <where_condition>
TRUNCATE TABLE <table>

以上3个语句:
第1个是SQL标准的删除语句(WHERE子句省略的结果是删除全部数据,注意!);
第2个是T-SQL扩展的删除语句,效果是将符合联接查询条件的目标表数据删除(将DELETE FROM <table>改为SELECT DISTINCT <table>.*可以看到删除哪些数据);
第3个实际上是DDL而不是DML,需要的权限和运行条件都与DELETE不同,但效果却是清除表中所有数据,而且比DELETE高效。

3. 改(UPDATE)

UPDATE <table> SET <col> = <new_value> [WHERE <where_condition>] !!!
UPDATE <table> SET <col> = <new_value> FROM <table> JOIN <another_table> ON <join_condition> WHERE <where_condition>

以上2个语句:
第1个是SQL标准的更新语句(WHERE子句省略的结果是更新全部数据,注意!);
第2个是T-SQL扩展的更新语句,效果是将符合联接查询条件的目标表数据更新为指定结果(将UPDATE <table> SET <col> = <new_value>改为SELECT <table>.<col>, <new_value>可以看到把哪些数据更新为哪些新值,其中<new_value>可以是联接查询的计算值,但如果联接查询结果使得目标表的<col>和新值<new_value>成为一对多的关系,则<col>会更新为哪个<new_value>是不确定的,这种情况可能导致意想不到的bug)。

该内容详见《Microsoft SQL Server 2005技术内幕:T-SQL查询》第8章。

6.6. 表的逻辑含义

很多使用数据库的人,不了解数据库原理,不能从逻辑上理解表的含义,从而只能把表看作一种数据结构,看作一种类似二维数组的东西,于是写出低效的循环语句就不难理解了,数据一致性更是难以保证。

可以从以下两个层面来理解表:

1. 一个表是一类事物(物件object和事实fact的统称)的集合,其中表的每行记录表示一个该类事物,主键是一个事物的唯一标识。
如:学生表(#学号,姓名,专业,……)是学生(物件)的集合,一个学号可以唯一标识一个学生;学生选课表(#学号,#课程ID,选课时间)是学生选课(事实)的集合,联合主键学号和课程ID可以唯一标识某个学生选了某门课的事实。

数据库建模就是根据业务需求设计一组表,用来表示业务系统中的所有事物。

2. 一个表的表结构定义了一个谓词,表中的每行记录都是对该谓词的一个真值量化。由于量化后的谓词是一个命题,所以,一个表是一组真命题的集合
(关于谓词和量化的概念,可参看《离散数学及其应用(第5版)》一书中关于数据逻辑的部分。)
如:学生选课表(#学号,#课程ID,选课时间)定义了这样一个谓词——“学生{#学号},在{选课时间},选了课程{#课程ID}。”,其中{}中的部分是一个变量。谓词不是命题,只有对其量化(或称实例化)之后才是命题。该表的一行记录('S001','C0001','2010-08-24 17:16:58')表示一个真值量化,量化后的命题是“学生S001,在2010-08-24 17:16:58,选了课程C0001。”。

一个数据库系统包含了很多表,每个表是一组真命题的集合,所有这些真命题则表示了系统中可信的知识。
设计一个表,就是设计一个谓词。只要表结构文档把这个谓词的含义说明清楚了,则表中记录的含义也自然清楚了;反之,如果一个表的谓词存在模糊或歧义,则表中的记录也是没有意义的。

从这个角度理解完整性约束:
- 实体完整性(主键约束):如果一个表包含了完全相同的两条记录,则把一个真命题重复一遍并不能增加知识;如果一个表的两条不同记录有着相同主键,则说明这两个命题是冲突的。实体完整性保证了每个命题的唯一和无冲突。
- 参照完整性(外键约束):参照完整性保证了每个命题涉及的事物都是有意义的(在该事物的表中有定义)。
- 域完整性(CHECK约束):域完整性保证每个命题都是一致的(不违反CHECK约束)。“每个命题都是一致的”是“每个命题都是正确的”的必要非充分条件,所以约束只是一种最小保证。
...全文
6761 94 打赏 收藏 转发到动态 举报
写回复
用AI写文章
94 条回复
切换为时间正序
请发表友善的回复…
发表回复
sz9804 2013-03-25
  • 打赏
  • 举报
回复
好东西,学习了,谢谢楼主!
andy052374 2013-01-26
  • 打赏
  • 举报
回复
以前走马观花地学习了数据库,好多知识都不是很懂,LZ的贴子让我受益匪浅,持续关注~~~
k5416005 2012-08-27
  • 打赏
  • 举报
回复
老大,我崇拜你~~
love灵灵 2012-08-08
  • 打赏
  • 举报
回复
楼主辛苦了
sdny007 2012-03-21
  • 打赏
  • 举报
回复
好东西,谢谢楼主
MEN05063021 2012-02-20
  • 打赏
  • 举报
回复
学习了
zhangfeiay 2012-02-14
  • 打赏
  • 举报
回复
是需要好好学习啊。
加油啊。
vvv3449860 2011-11-15
  • 打赏
  • 举报
回复
深入浅出 很好理解 谢谢楼主 威武~~~~~
icbc_atm 2011-11-09
  • 打赏
  • 举报
回复
留名 楼主是新手的福星
xiaosun830910 2011-09-15
  • 打赏
  • 举报
回复
hao yang de
yishuren 2011-05-28
  • 打赏
  • 举报
回复
还好吧
cd731107 2011-05-12
  • 打赏
  • 举报
回复
蛮好的
nevergu 2011-05-12
  • 打赏
  • 举报
回复
依旧经典
Mr。Lili 2011-05-12
  • 打赏
  • 举报
回复
好东西,谢谢分享
xuexiaopi 2011-05-09
  • 打赏
  • 举报
回复
继续学习!
jopch 2011-04-25
  • 打赏
  • 举报
回复
继续下单
LOOKMIIT 2010-12-22
  • 打赏
  • 举报
回复
学习了,不过还不是很多懂这些。。。呼呼
canyuechunhui 2010-12-01
  • 打赏
  • 举报
回复
不错啊,好好学习下
xin003 2010-11-29
  • 打赏
  • 举报
回复
继续学习..
flying100 2010-11-08
  • 打赏
  • 举报
回复
打基础,不错的文章
加载更多回复(55)
本版的新内容 这一版中的新内容和特色将使学生和本书的其他读者受益,其中包括: ● 使用Microsoft Access 2010演示和强调数据库的创建和使用原则。本书把对Microsoft Access和其他Microsoft Office产品(如Excel)的所有引用都修订为最新发布的Microsoft Office 2010版本。 ● 本书的更新表现为使用Microsoft SQL Server 2008/2008 R2 Express版本。尽管书中大多数主题都向后兼容Microsoft SQL Server 2005 Express版本,但均专门使用SQL Server 2008和Office 2010。 ● 本书中的更新还表现为使用MySQL Workbench作为MySQL 5.1的唯一数据库开发工具。本书第4版使用的MySQL GUI工具被MySQL在2009年12月18日宣布停止使用。目前的MySQL Workbench 5.2.x集成了MySQL GUI工具的功能,这一版就使用它。 ● 使用Microsoft Windows 7操作系统作为本书的工作站操作系统。上一版使用的是Windows XP和Windows Vista操作系统,而这一版更新为最新的Microsoft工作站操作系统。 ● 添加了附录C“系统分析和设计入门”。这个新附录为没有学习过这方面课程的学生或读者介绍了系统分析和设计概念,论述了收集数据建模所需输入信息的基本方法(参见第4章),并在应用程序开发的过程中融入了数据库开发。此附录包含在本书配书光盘中。 ● 添加了附录D“Microsoft Visio 2010入门”。这个新附录介绍了如何使用Microsoft Visio 2010进行数据建模(参见第4章)和数据库设计(参见第5章)。此附录包含在本书配书光盘中。 ● 添加了附录E“Web服务器、PHP和Eclipse PDT入门”。这个新附录介绍了如何安装和使用Microsoft IIS Web服务器、PHP和用于Web数据库应用程序开发的Eclipse PDT IDE(参见第7章)。此附录包含在本书配书光盘中。 必要的基本概念 如果不学习基本概念,只靠现有的技术就不可能成功使用DBMS。凭借多年来为商业用户开发数据库的经验,我们认为下面的数据库概念非常重要: ● 关系模型的基本概念 ● 结构化查询语言(SQL) ● 数据建模 ● 数据库设计 ● 数据库管理 由于当前Internet、World Wide Web和分析工具的广泛使用,因此另外增加两个基本概念: ● Web数据库处理 ● 商业智能(BI)系统 像Colin这样的用户(或将来从事类似工作的学生)不需要像信息系统专家那样深入地了解这些主题。因此,本书只介绍最基本的概念,足以帮助Colin这样的用户创建和使用小型数据库了。本书的许多内容在David M.Kroenke和David J.Auer的Database Processing: Fundamentals, Designs, and Implementation1一书的基础上进行了重写和简化。不过在本书内容上我们也力求讨论准确,不会产生误导。即使学生已学习过更高级的数据库课程,也可从中获益。 独立于DBMS产品的概念 本书假设学生没有使用过任何特殊的DBMS产品,我们通过Microsoft Access、SQL Server Express版和MySQL来演示数据库概念,使学生可以将这些产品作为工具真正试验书中的内容,而这些概念都是以DBMS无关的方式出现。通过这种方式学习,学生可以掌握适用于任意数据库的基本原则,包括小型的Microsoft Access数据库到大型的Oracle或DB2数据库。而且这一方法也避免了一个常见的问题:在同时介绍概念和产品时,学生容易混淆概念与产品特性和功能。例如,在讲授参照完整性约束时,如果从概念的角度讲授会说明这时一个表中的列值必须总是由另一个表中的列值提供,并解释这一约束出现在关系定义的上下文中的方式,以及DBMS或应用程序如何强制执行这一约束。如果结合具体的DBMS讲授如Microsoft Access,学生就只知道:在某些情况下选取复选框,而在其他情况下不选取。这很容易导致学生在学习产品特性时,会淡忘数据库的基本概念。 这并不是说教学中不应使用DBMS。相反,学生们可以通过使用商业DBMS产品来更好掌握这些概念。本书的这一版包括Microsoft Access、SQL Server Express版和MySQL的足够多的基础信息,使您无需其他书籍或资料就可以在课堂上使用这些产品。本书还深入介绍了Microsoft Access,因为它是一个非常流行的个人数据库产品,并且包括在Microsoft Office Professional应用程序套件中。但如果希望深入理解特定的DBMS或使用本书没有介绍的DBMS产品,则需要额外的书籍或资料。Prentice Hall提供了Microsoft Access 2010和其他DBMS产品的大量图书,可以结合本书一起学习。 Access工作台 本书的这一版继续使用首次在第3版引入的特征—— “Access工作台”。由于Microsoft Access广泛用于初级数据库课程,因此介绍使用Microsoft Access的特定信息比较重要。每一章都带有一个“Access工作台”部分,其中使用Microsoft Access来演示本章的概念和技术。“Access工作台”部分在第1章中介绍了如何创建数据库和单个表,逐渐转移到不同主题,到最后第7章介绍相对于Microsoft Access数据库的Web数据库处理,和第8章介绍使用Microsoft Access和Microsoft Excel生成PivotTable OLAP报表。本书并非试图全面论述Microsoft Access,而是介绍所有必要的基本Access主题,使学生可以有效地构建并使用Microsoft Access数据库。 重要术语、复习题、练习题和项目 学生能否运用所学的知识非常重要,因此每章都提供了重要术语表(本版新增)、复习题、练习题(包括针对“Access工作台”的练习题)和三个贯穿本书始终的项目。如果学生阅读并理解了每一章的内容,就应能掌握每个重要术语的含义、能完成复习题。练习题要求学生将每章所讲的概念应用到具体的小问题或任务中。 第一个项目Garden Glory是有关一个向个人或企业提供园艺服务的合伙公司的数据库开发和使用。第二个项目James River珠宝行分析了为一家零售店实施常客计划的数据库需求。第三个项目Queen Anne Curiosity商店关注的是零售业的销售和库存需求。本书的所有章节都包括这三个项目。在每个实例中,都要求学生将各章的知识运用到项目中。教师会在教师手册中找到使用这些项目的更多信息,还可以从本书网站(www.pearsonhighered.com/kroenke)中受密码保护的教师部分获得数据库和数据。 本书使用的软件 与之前我们使用与DBMS无关的方式进行讨论一样,本书将尽可能选择独立于操作系统的软件,目前网络上有非常多的杰出软件可以使用,许多大的DBMS厂商都提供了其主要产品的免费版本(如Microsoft 的SQL Server Express版,Oracle公司的Oracle数据库和MySQL),Web编辑器和集成开发环境(IDE)也很常用,例如Eclipse、NetBeans和Visual Studio Express版。PHP被认为是第四个最常用的编程语言,可以下载用于许多操作系统和Web服务器。 所以尽管本书的示例是用Microsoft操作系统、SQL Server 2008/2008 R2 Express版、Microsoft Access 2010、Microsoft Excel 2010和IIS Web服务器创建的,但它们大都很容易用Linux、MySQL Server Community版、OpenOffice.org Base、OpenOffice.org Calc和Apache Web服务器创建。本书使用的一些软件产品,如PHP和Eclipse都可用于多种操作系统。 在过去30多年中,我们已经发现数据库和数据库应用程序的开发是一项愉快且有回报的活动。我们相信:在将来数据库的数量、大小和重要性会不断增加,而该领域也越来越重要。希望本书介绍的概念、知识和技术帮助学生成功地参与到现在和多年后的数据库项目中。 对第4版的改进 本版最重要的改进是在全文和“Access工作台”每个部分都使用了Access 2010。由于推出了Microsoft Office 2010,本书做了更新以反映该产品中的变化。当然,我们还更新了本书所有其他产品的信息,尤其是本版使用Windows 7操作系统来演示本书中的应用程序,MySQL工作台现在是MySQL数据库开发的GUI。 我们继续保持并改进了本书前几版引入的几个特性: ● 在每章中使用“Access工作台”介绍Microsoft Access的基础知识。 ● 介绍SQL Server 2008 R2 Express版(附录A)和Oracle MySQL Community Server 5.1(附录B)的用法。附录A和附录B包含在本书配书光盘中。 ● 使用示例数据集充分开发了在本书各个部分中使用的三个示例数据库:Wedgewood Pacific Corporation、Heather Sweeney Designs和Wallingford Motors。 ● 在Web数据库处理主题中使用PHP脚本语言和Eclipse IDE。 ● 扩充介绍了XML。 ● 扩充介绍了商业智能(BI)系统。 ● 介绍了多维数据库模型 本版继续使用之前版本增加的较为有效的规范化讨论,使用一个四步过程来演示规范化关系的规定步骤。这种方法不仅简化了规范化任务,而且使规范化原理更易于理解,因此当前版本仍沿用了这一方法。教师如需更多了解范式,可参考第5章中介绍的大多数范式的简短定义。 本书概要 本书包括8章和5个附录(附录内容包含在本书配书光盘中)。第1章解释了使用数据库的原因、数据库各个组件和开发方法。学生将学习数据库及其应用程序的用途、数据库相对于电子表格列表的差别和优势。第2章介绍了关系模型,定义了基本的关系术语,还介绍了规范化原则的基本概念,并描述了规范化过程。 第3章讲述了基本的SQL语句,介绍了定义数据的基本SQL语句,如SQL SELECT语句和数据修改语句。本书并不介绍高级的SQL语句,只讲述基本语句。 接下来的两章讨论了数据库设计。第4章使用实体-关系(E-R)模型解决数据建模问题,其中包括对数据建模的需求、基本的E-R术语和概念,并提供了一个简短的E-R建模示例应用程序(Heather Sweeney Designs)。第5章讲述了数据库设计,解释了规范化的基本概念。第4章示例中的数据模型在第5章中则被转换为关系设计。 最后三章讨论了数据库管理,以及数据库在应用程序中的使用。第6章概述了数据库管理,构建了一个作为功能数据库的示例数据库,并用作讨论数据库管理需求的示例。本章探讨了并发控制、安全性、备份及恢复技术。数据库管理主题很重要,因为它适用于所有数据库,即使是个人或单用户数据库也是如此。事实上,在某些方面这些主题对于小型数据库更重要,因为它们没有专业的数据库管理员来确保关键任务的执行。第6章也讨论了分布式数据库和面向对象的数据库。 第7章介绍了使用基于Web的数据库处理,包括开放数据库连接(ODBC)和PHP脚本语言的使用。本章也讨论了可扩展标记语言(XML)的出现和基本概念。 第8章介绍了商业智能(BI)系统和支持它们的数据仓库体系结构,还讨论了多维数据库,解释了如何为Heather Sweeney Designs建立多维数据库,并使用它生成PivotTable OLAP报表。 附录A提供了SQL Server 2008 R2 Express版的简介,附录B则提供了MySQL 5.1的类似介绍。在每章的“Access工作台”中都包括了对Microsoft Access的介绍。附录C介绍了系统分析与设计,可以为第4章(数据建模)和第5章(数据库设计)提供参考。附录D简要介绍了Microsoft Visio 2010,可用作数据建模(第4章)和数据库设计(第5章)的工具。另一个有效的数据库设计工具是MySQL工作台,其用法参见附录B。最后,附录E给出了启动和运转Microsoft IIS Web服务器、PHP和Eclipse PHP开发工具(PDT)的详细指导,这些将有助于我们更好地学习第7章。 在快速变化的环境下保持最新 为使数据库的概念在各版中保持最新,我们将根据需要在本书的网站(www.pearsonhighered .com/kroenke)上贴出更新表。例如,发布Office 2007后,我们就贴上了Access 2007的内容,在课堂上使用Access 2007的教师就会有“Access工作台”部分和PowerPoint幻灯片的所需版本。教师资源和学生资料也可以从网站上获得,所以应时常浏览本书的网站。

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧