1、关系规范化规 范 化 理 论 是 数 据 库 逻 辑 设 计 的 指 南 和 工 具 , 具 体 步 骤 如 下 : ( 1) 考 察 关 系 模 型 的 函 数 依 赖 关 系 , 确 定 范 式 等 级 。 逐 一 分 析 各 关 系模 式 , 考 察 是 否 存 在 部 分 函 数 依 赖 、 传 递 函 数 依 赖 等 , 确 定 它 们 分 别 属 于 第几 范 式 。 ( 2) 对 关 系 模 式 进 行 合 并 或 分 解 。 根 据 应 用 要 求 , 考 察 这 些 关 系 模 式是 否 合 乎 要 求 , 从 而 确 定 是 否 要 对 这 些 模 式 进 行 合 并 或
2、分 解 , 例 如 , 对 于 具有 相 同 主 码 的 关 系 模 式 一 般 可 以 合 并 ; 对 于 非 BCNF 的 关 系 模 式 , 要 考 察“异 常 弊 病 ”是 否 在 实 际 应 用 中 产 生 影 响 , 对 于 那 些 只 是 查 询 , 不 执 行 更 新操 作 , 则 不 必 对 模 式 进 行 规 范 化 ( 分 解 ) , 实 际 应 用 中 并 不 是 规 范 化 程 度 越高 越 好 , 有 时 分 解 带 来 的 消 除 更 新 异 常 的 好 处 与 经 常 查 询 需 要 频 繁 进 行 自 然连 接 所 带 来 的 效 率 低 相 比 会 得 不
3、偿 失 。 对 于 那 些 需 要 分 解 的 关 系 模 式 , 可 以用 规 范 化 方 法 和 理 论 进 行 模 式 分 解 。 最 后 , 对 产 生 的 各 关 系 模 式 进 行 评 价 、调 整 , 确 定 出 较 合 适 的 一 组 关 系 模 式 。 关 系 规 范 化 理 论 提 供 了 判 断 关 系 逻 辑 模 式 优 劣 的 理 论 标 准 , 帮 助 预 测 模式 可 能 出 现 的 问 题 , 是 产 生 各 种 模 式 的 算 法 工 具 , 因 此 是 设 计 人 员 的 有 力 工具 。 扩展阅读: 1 数据库设计解决方案1.3 关系规范化http:/ 2
4、007-04-07 13:31 史创明、王俊伟 清华大学出版社 我要评论(0) 摘要:在数据库中,数据之间存在着密切的联系。关系数据库由相互联系的一组关系所组成,每个关系包括关系模式和关系值两个方面。关系模式是对关系的抽象定义,给出关系的具体结构;关系的值是关系的具体内容,反映关系在某一时刻的状态。 标签:SQL SQL2000 微软 数据库 在数据库中,数据之间存在着密切的联系。关系数据库由相互联系的一组关系所组成,每个关系包括关系模式和关系值两个方面。关系模式是对关系的抽象定义,给出关系的具体结构;关系的值是关系的具体内容,反映关系在某一时刻的状态。一个关系包含许多元组,每个元组都是符合关
5、系模式结构的一个具体值,并且都分属于相应的属性。在关系数据库中的每个关系都需要进行规范化,使之达到一定的规范化程度,从而提高数据的结构化、共享性、一致性和可操作性。关系模型原理的核心内容就是规范化概念,规范化是把数据库组织成在保持存储数据完整性的同时最小化冗余数据的结构的过程。规范化的数据库必须符合关系模型的范式规则。范式可以防止在使用数据库时出现不一致的数据,并防止数据丢失。关系模型的范式有第一范式、第二范式、第三范式和 BCNF 范式等多种。在这些定义中,高级范式根据定义属于所有低级的范式。第三范式中的关系属于第二范式,第二范式中的关系属于第一范式。下面我们介绍规范化的过程。1第一范式第一
6、范式是第二和第三范式的基础,是最基本的范式。第一范式包括下列指导原则: 数据组的每个属性只可以包含一个值关系中的每个数组必须包含相同数量的值 关系中的每个数组一定不能相同如果关系模式 R 中的所有属性值都是不可再分解的原子值,那么就称此关系 R 是第一范式(First Normal Form,简称 1NF)的关系模式。在关系型数据库管理系统中,涉及到的研究对象都是满足 1NF 的规范化关系,不是 1NF 的关系称为非规范化的关系。 原始数据例如,在本书示例数据库经销商中的关系,如图 1-3 所示。其中的第四和第五行的 2、3 数组违反了第一范式,因为“商品编号”和“ 商品名称”属性每个都包含两
7、 个值。如果要将这些数据规范化,就必须创建允许分离数据的附加表,这样才能使每个属性只包含一个值,每个数组包含相同数量的值,并且每个数组各不相同,如图 1-4 所示。这时的数据才符合第一范式。 符合 1NF 的数据2第二范式第二范式(2NF)规定关系必须在第一范式中,并且关系中的所有属性依赖于整个候选键。候选键是一个或多个唯一标识每个数据组的属性集合。设置候选键后的数据例如,在图 1-5 所示的关系中,可以将 “商品名称”和“供应商”名称指定为候选键。这些值共同唯一标识每个数组。在该图中,“库存编号”属性只依赖于“商品名称”,而不依赖于“ 供应商名称”属性。3第三范式第三范式(3NF)同 2NF
8、 一样依赖于关系的候选键。为了遵循 3NF 的指导原则,关系必须在 2NF 中,非键属性相互之间必须无关,并且必须依赖于键。 理想的 3NF 数据例如,在图 1-6 所示的关系中,候选键 “供应商代号”是属性。 “商品名称”和“供应商名称”的属性都依赖于主键“库存编号”,并且相互之间进行关联。“供应商代号”属性依赖于“ 商品编号”,而不依赖于主键“ 库存编号” 。对于关系设计,理想的设计目标是按照规范化规则存储数据。但是,在数据库实现的现实世界中,将数据解规范化却是通用的惯例,也就是要专门违反规范化规则,尤其是违反第二范式和第三范式。当过于规范化的结构使实现方式复杂化时,解规范化主要用于提高性
9、能或减少复杂性。尽管如此,规范化的目标仍然是确保数据的完整性,在解规范化时应该注意。5.1 数据库表的创建、修改和删除2007-04-07 13:53 史创明、王俊伟 清华大学出版社 我要评论(0) 字号:T | T综合评级:想读(6) 在读(0) 已读(2) 品书斋鉴(0) 已有 8 人发表书评 一个数据库中包含一个或多个的表。表是数据的集合,按行和列排列。每个表都有一个特定的主题,例如,“图书管理系统”数据库中包含有“作者表”、“图书明细表”以及“出版社表”等。本章介绍表的管理。AD: 建立完数据库后,就可以创建数据库表。表属于数据库对象中的一种,是数据存储的基本单位,它包含了所有的数据内
10、容。在 SQL Server 中,一个数据库中可以创建多个表,而且每一个表内可以包含多达 1 024 个列。列的数目及表的总大小仅受限于可用的硬盘存储容量。另外,每一个列最多可以有 8 092 字节(不包括 image、text 或者 ntext 数据)。下面我们开始创建表。5.1.1 表表是 SQL Server 中最主要的数据库对象,它是用来存储和操作数据的一种逻辑结构。表由行和列组成,因此也称之为二维表。1表结构表是我们在工作和生活中经常使用的一种表示数据及其关系的形式,如表 5-1 所示。 示意图每个表都有一个名字,以标识该表。例如,表 5-1 的名称为“作者表”,该表共有六列,每一列
11、都有一个列名来描述该列的特性。每个表由若干行组成,表的第一行为各列标题,即“栏目信息”,其余各行都是数据。例如,表 5-1 中有四行数据,分别描述了四位作者的基本情况。用户可以根据日常工作经验,结合集合理论,创建关系数据库使用表(即关系)来表示实体及其联系。“ 表结构 每个数据库包含了若干个表。每个表具有一定的结构,称之为“表型”。所谓表型是指组成表的各列的名称及数据类型,也就是日常表格的“栏目信息”。“ 记录 每个表包含了若干行数据,它们是表的“值”。表中的一行称为一条记录(record),因此,表是记录的有限集合。“ 字段(列) 每条记录由若干个数据项构成,将构成记录的每个数据项称为字段(
12、field)或者列。例如在“作者表”中,表结构为(作者编号、作者姓名、性别、电话、家庭住址、籍贯),该表有四条记录,每条记录包括六个字段。“ 关键字 在“作者表”中,若不加以限制,每个记录的“作者姓名”、“性别”、“电话”、“家庭住址”和“籍贯”字段的值有可能相同。但是“作者编号”字段的值对表中所有记录来说一定不同,“作者编号”字段可将表中的不同记录区分开来,也就是我们所说的侯选关键字(candidate key)。2设计表在为一个数据库设计表之前,应考虑该数据库中要存放的数据以及数据如何划分到表中。例如,“图书管理系统”数据库需要存储图书信息、工作人员信息、学生信息等,而在“图书信息表”中将
13、存储图书的详细信息(即“图书明细表”)、借出信息(即“借出信息表”)、图书类型信息(即“图书类别表”)、出版社信息(即“出版社信息表”)、作者信息(即“作者表”)。具体对于某一个表,在创建之前,最好先在纸上画出其轮廓。此时要考虑每个表中的内容有: “ 表中要存储的数据类型“ 表中需要的列以及每一列的类型“ 列是否可以为空“ 列的长度“ 是否需要在列上使用约束、默认值和规则“ 需要使用什么样的索引“ 哪些列作为主键5.1.2 创建表在纸上设计好表以后就可以开始创建表了。用户可以使用 T-SQL 中的 CREATE TABLE 语句或者使用企业管理器来创建表。默认状态下,只有系统管理员和数据库拥有
14、者(DBO)可以创建新表,但系统管理员和数据库拥有者可以授权其他人来完成这一任务。在开始创建表之前,我们先来了解一下字段的属性。1字段的属性表的字段名字在同一个表中具有唯一性,同一字段的数据属于同一种数据类型。除了用字段名和数据类型来指定字段的属性外,还可以定义其他属性,如 NULL 或 NOT NULL 属性和 IDENTITY 属性。“ NULL 或 NOT NULL 属性NULL 即空值,通常表示未知、不可用或将在以后添加的数据。如果表的某一字段被指定具有 NULL 属性,那么就允许在输入数据时省略该字段的值。反之,如果表的某一字段被指定具有 NOT NULL 属性,那么输入时必须给出具
15、体值。“ IDENTITY 属性IDTENTITY 即字段的标识属性。对任何表都可创建包含系统自动生成序号值的一个标识字段,该序号值唯一标识表中的一行。每个表只能有一个字段设置为标识属性,且该字段只能是decimal、int、numeric,bigint 或 tinyint 数据类型。指定了 IDENTITY 属性的字段称为 IDENTITY 字段。当用 IDENTITY 属性定义一个字段时,可以指定一个初始值和一个增量,输入数据到含有 IDENTITY 字段的表时,初始值在输入第一行数据时使用,以后就由 SQL Server 根据上一次使用的 IDENTITY 值加上增量得到新的 IDENT
16、ITY 值。如果不指定初始值和增量值,则其默认值均为 1。 示意图2使用企业管理器创建表在“图书管理系统”数据库中创建一个数据表,其表名为“图书明细表”,表结构如表 5-2 所示。 示意图操作步骤:启动 SQL Server 企业管理器,依次打开树型目录选项,并在【图书管理系统】目录中右击【表】项,选择【新建表】命令,如图 5-1 所示。弹出【“图书管理系统”中的新表】(即表设计器)对话框。在该对话框中,用户可以将自己所设计的表结构输入到【列名】文本框中,并设置该列的【数据类型】、【长度】以及【允许空】等信息,如图 5-2所示。 示意图加 示意图在【表设计器】对话框中,选择【列名】中的第一个文
17、本框,并输入“图书编号”文字,将鼠标指针右移到【数据类型】列中,将显示出【数据类型】为 char,【长度】为 10,【允许空】为允许,如图 5-3 所示。单击【数据类型】列的下拉列表,选择 int 项。此时,【长度】将改为 4。单击【允许空】中的“”符号,将其改为不允许为空,如图 5-4 所示。 示意图选择【列名】中的第二行文本框,在该文本框中输入列名为“类别编号”。设置【数据类型】为smallint,【长度】为 2,并且允许为空,如图 5-5 所示。用户可以根据表结构图,将其余字段填写完整,并设置其字段的类型,如图 5-6 所示。 示意图右击图书名称的行选择器,选择【设置主键】命令,如图 5
18、-7 所示。此时,将在行选择器中显示出主键标识 ,如图 5-8 所示。单击工具栏上的【保存】按钮,在弹出的【选择名称】对话框的【输入表名】文本框中,输入表名称为“图书明细表”,单击【确定】按钮将其保存。 示意图3使用 T-SQL 语句创建表在创建数据库时,已经运用 T-SQL 语句创建过数据库,同样也可以运用 T-SQL 语句创建表。在使用 T-SQL创建表之前,先了解一下 T-SQL 语句的语法结构。通过 T-SQL 语句来创建表,其核心语句是 CREATE TABLE,该语句的语法格式如下所示: CREATE TABLE database_name.owner.owner.table_na
19、me /*指定表名*/(column_definition /*字段的定义*/column_name AS computed_column_expression /*定义计算字段*/table_constrain /*指定表的约束*/)ONfilegroupDEFAULT /*指定存储表的文件组*/TEXTIMAGE_ONfilegroupDEFAULT /*指定存储 text,ntext 和 image 类型数据的文件组*/下面说明主要参数与子句的含义。“ database_name 用来创建表所在的数据库的名称。当然,此数据库必须存在,不能将一个不存在的数据库名称作为指定的数据库名称,否则
20、会发生错误提示。“ owner 用来指定所创建的新表的所有者名。“ table_name 用来指定添加表的名称。表名必须遵循 T-SQL 标识符命名规则。“ column_name 用来指定在新表中的字段名称。“ computed_column_expression 用来定义计算字段值的表达式。表达式可以是字段名、常量、变量、函数等或它们的组合。所谓计算字段是一个虚拟的字段,它的值并不实际存储在表中,而是通过对同一个表中其他字段进行某种计算而得到的结果。“ ONfilegroupDEFAULT 用来指定存储此新表的文件组名称。当指定 filegroup 时,此新表将存储在所指定的文件组中,并且
21、此文件组必须存在于数据库中。如果是指定 DEFAULT 或没有指定时,则此新表将会存储在默认的文件组中。“ TEXTIMAGE_ON 用来指定 text、ntext 和 image 字段的数据存储的文件组。如果无此子句或指定了DEFAULT,这些类型的数据就和表一起存储在相同的文件组中。接下来我们通过使用 CREATE TABLE 语句来创建“图书管理系统”数据库中的“图书明细表”。在“图书明细表”中,各字段类型分别为:【图书编号】类型为 int;【类别编号】类型为 smallint;【图书名称】类型为 nvarchar(50);【作者编号】类型为 char;【出版社编号】类型为 char;【
22、出版日期】类型为smalldatetime;【定价】类型为 money;【是否借出】类型为 bit;【封面】类型为 image,其应用方法如下: USE 图书管理系统CREATE TABLE 图书明细表( 图书编号 int not null,类别编号 smallint null,图书名称 nvarchar(50) null,作者编号 char(10) null,出版社编号 char null,出版日期 smalldatetime null,定价 money null是否借出 bit not null,封面 image null,)5.1.3 修改表的结构用户在创建好表后,可能在使用一段时间后,
23、需要对所创建的表结构、约束或其他列的属性进行修改,以符合目前使用的实际状况。在 SQL Server 2000 中,创建表与修改表同样简单。一般我们可以使用 SQL Server 2000 企业管理器和T-SQL 语言两种方法来修改表。对一个已存在的表可以进行的修改操作包括:更改表名、增加列、删除列、修改已有列的属性(列名、数据类型、是否为空值)。1使用企业管理器修改表(1)更改表名SQL Server 中允许改变一个表的名字,但当表名改变后,与此相关的某些对象,以及通过表名与表相关的存储过程将无效。因此,一般不要更改一个已有的表名,特别是该表已定义了视图或建立了表关系。下面将前面所创建的“图
24、书明细表”的表名改为“图书详情表”。操作步骤:在 SQL Server 企业管理器中,展开所要更改表名的数据库,右击所要修改的表,选择【重命名】命令。例如,重命名“图书明细表”表,如图 5-9 所示。此时,“图书明细表”变成可更改状态,用户可以输入新的表名。例如,输入“图书详情表”,如图 5-10 所示,然后按回车键。系统将弹出一个【重命名】对话框,在该对话框中,提示用户如果更改了表名,将引起该表的存储过程、视图或触发器无效,要求用户对该操作予以确认。单击【是】按钮确认此操作。操作完成后,系统将提示“已成功重命名该对象”信息框,单击【确定】按钮,完成对表名的修改操作。 示意图加 示意图(2)增
25、加列在日常工作中,我们经常需要添加或者删除某一项目,这样我们需要为当前所使用的表增加列。例如,以向“图书明细表”中添加一个“作者”列为例,来说明在企业管理器中向表中添加新列的操作过程,“作者”列为 Unicode 字符型,允许为空。 示意图操作步骤:在 SQL Server 企业管理器中展开需进行操作的“图书明细表”,右击“图书明细表”,选择【设计表】命令,如图 5-11 所示。在弹出的【表设计器】对话框中,单击第一个空白行,输入新添加的列名“作者”,并选择数据类型为nvarchar,长度为 20,该列允许空,如图 5-12 所示。当要向表中添加的列均输入完毕后,单击工具栏上的【保存】按钮对新
26、添加的列进行保存。(3)删除列在 SQL Server 中,被删除的列是不可恢复的,所以在删除列之前需要慎重考虑。并且,在删除一个列之前,必须保证基于该列的所有索引和约束都已被删除。例如,我们将所创建的“作者”列删除,其具体操作步骤如下:在 SQL Server 企业管理器中展开需要删除列的表,右击该表,选择【设计表】命令,例如删除“图书明细表”中的列。在【表设计器】对话框中,右击要删除的列,选择【删除列】命令,例如删除“图书明细表”中名为“作者”的列,如图 5-13 所示,该列即被删除。单击工具栏上的【保存】按钮,对修改的表进行保存。 示意图(4)修改已有列的属性在表中尚未有记录时,可以修改
27、表结构,如更改列名、列的数据类型、列的长度和是否允许空值等属性。但当表中有了记录时,建议不要轻易改变表结构,特别不要改变数据类型,以免产生错误造成数据丢失。用户不能对以下特性的列进行修改: 具有 text、ntext、image 或 timestamp 数据类型的列 计算列 全局标识符列 复制列 用于索引的列(但若用于索引的列为 varchar、nvarchar 或varbinary 数据类型时,可以增加列的长度) 用于由 CREATE STATISTICS 生成统计的列,若需修改这样的列,必须先用 DROP STATISTICS 语句删除统计 用于主键或外键约束的列 用于 check 或 u
28、nique 约束的列 关联有默认值的列但改变列的数据类型时,有下列要求: 原数据类型必须能够转换为新数据类型 新类型不能为 timestamp 类型 如果被修改的是 identity 列,则新数据类型必须是有效的 identity数据类型。现在来看如何修改已有列的属性。在创建的“图书明细表”中,因尚未输入记录值,所以可以改变表的结构。下面我们在企业管理器中,将“图书名称”改为 BOOK-NAME,数据长度由 50 改为 60;将“日期”改为 DATE,数据类型由 smalldatetime 改为 datetime。 示意图操作步骤:在 SQL Server 企业管理器中,双击【图书管理系统】选
29、项中的【表】项,右击【图书明细表】表,选择【设计表】命令。在【表设计器】对话框中,修改其字段的名称,并设置相应的属性,如图 5-14 所示。对列的修改操作完毕后,单击【保存】按钮,对修改后的表进行确认并保存。2使用 ALTER TABLE 语句修改表前面我们学习了使用企业管理器来修改表,下面使用 T-SQL 中的 ALTER TABLE 语句来修改表。ALTER TABLE 语句的语法格式如下所示: ALTER TABLE table_nameALTER COLUMN column_name /*修改已有列的属性*/new_data_type(precision,scale)NULL NOT
30、NULLADD column_definition,n /*增加新列*/DROPCONSTRATINTconstraint_nameCOLUMN,n /*删除列*/ 下面说明主要参数与子句的含义:“ table_name 用来指定要修改的表的名称。“ ALTER COLUMN 子句 用来指定要进行修改的表中的字段的属性,要修改的字段名由 column_name 给出。“ new_data_type 用来指定被修改字段的新数据类型。“ Precision 用来指定新数据类型的有效位数。“ Scale 用来指定新数据类型的小数位数。“ NULLNOT NULL 用来指定其字段是否可接受 NULL。
31、“ ADD 子句 用来向表中增加新字段。新字段的定义方法与 CREATE TABLE 语句中定义字段的方法相同。“ DROP 子句 用来从表中删除字段或约束。COLUMN 参数中指定的是被删除的字段名,constraint_name是被删除的约束名。下面通过实例说明 ALTER TABLE 语句的使用方法。例如,在用户信息表中修改“图书明细表”的属性。将字段名为“图书名称”的列长度由原来的 50 改为 60,将名为“日期”的列的数据类型由原来的smalldatetime 改为 datetime。 USE 图书管理系统ALTER TABLE 图书明细表ALTER COLUMN 图书名称 nvar
32、char(60)GOALTER TABLE 图书明细表ALTER COLUMN 日期 datetimeGO下面通过 T-SQL 语句向“图书明细表”表中添加一个“作者”字段,其语法如下: USE 图书管理系统ALTER TABLE 图书明细表ADD作者 NVARCHAR(30) NULLGO下面我们使用 T-SQL 中的 DROP 语句来删除添加在“图书明细表”表中的“作者”字段。在删除该字段时,首先,我们打开“图书管理系统”数据库,然后明确所要修改的表名为“图书明细表”,再删除表中的“作者”字段。具体语句如下:USE 图书管理系统 ALTER TABLE 图书明细表DROP COLUMN 作
33、者GO5.1.4 删除表当一个表不再使用时,可以将该表删除。删除一个表同样有两种方法:一种是利用企业管理器,另一种是利用 T-SQL 语言。1利用企业管理器实现对表的删除在前面我们创建了“图书明细表”表,下面我们使用企业管理器来删除该表。具体操作步骤如下: 示意图在 SQL Server 2000 企业管理器中,展开所要删除的表所在的数据库,并右击所要删除的表,选择【删除】命令,如图 5-15 所示。在弹出的【除去对象】对话框中,单击【全部除去】按钮即可完成对表的删除,如图 5-16 所示。2使用 DROP TABLE 删除表下面通过 T-SQL 语言中的 DROP TABLE 命令来删除表。首先,我们来了解一下 DROP TABLE 语句的语法格式:DROP TABLE table_name在了解了 DROP TABLE 语句在语法后,下面我们以删除“图书明细表”为例,学习 DROP TABLE 语句的使用方法: 示意图DROP TABLE 图书明细表GO