本帖最后由 myadmin 于 2012-8-5 20:43 编辑
书名 Pro Access 2010 Development
作者 Mark Collins
近日购得,日读数页,随手翻译;不揣浅陋,水平有限,难谈原创,故本帖主题分类曰:讨论。
繁言不叙,从第2章始。
------------------------------------------------------------------------------------------------
2 定义和关联表
设计一数据库应用程序之逻辑起点是:定义将要存储数据的表。表方案是基础,其必须支持整个应用程序,所以设计好表是不可避免的。因为Access使得建立一应用程序如此简单,所以会很轻易地跳过这重要的一步,但不要这样做。 本章,将介绍一些确保一良好数据模型的基本原则。这些技术普遍适用于大多数数据库引擎。将覆盖的内容包括:数据库规范化、定义主键和外键,以及使用约束以确保参照完整性。 将引导完成创建一组此应用程序之基本表的过程。一步步展示如何设计这些表,以及如何使用Access 2010的诸多数据建模功能。到本章结束之时,就有了建立此应用程序其余部分的一坚实结构。
2.1 探究设计实践
在开始此工程具体设计之前,先介绍在任何数据库设计中都应遵循的一些基本原则。
2.1.1 使用主键
尽管非Access所必需,但是,强烈建议为每一表定义一主键。主键唯一定义了表中的一单一记录。当在表之间定义关系之时,就需要主键,关联表是定义一关系型数据库的一关键部分。
有2种设计主键的普遍方法。第1种方法是创建一单一代理之键字段。通常,此字段与此表有相同之名称,并附加一“ID”。例如,“订单项目”表之主键即为“订单项目ID”。“自动编号”字段类型适用于此方法。当插入一条记录之时,数据库引擎将分配下一编号给此字段。这就保证了键之唯一性。
第2种方法是从父表继承键,在表之层次结构中为每一层添加一额外字段。例如,“订单”表的主键是“订单ID”, “订单项目”表主键就是“订单ID”和“订单项目ID”字段之组合。在此情况之下,“订单项目ID”只在特定订单中才是唯一的。从设计者角度看,此做法清楚表明了,“订单项目”表和“订单”表具有一聚合关系。但在实践中,这是较难实现的,因为它要求应用程序生成键值。在此情况下定义外键关系也较棘手,因为需要多个字段。使用这种设计,有些表可能最终有三个或更多主键字段。
对于本书中之工程,将使用第1种方法,赋予每一表一单一主键字段。相信这是比较普遍的做法,尤其是在Microsoft平台中,例如Access 和SQL Server。这也将简化此工程的实现。
2.1.2 规范化数据库
一设计良好的数据库将会有一定程度的规范化。规范化基本上是删除冗余信息的过程。有一系列称为范式的定义,为确定规范化提供了标准的规则。这些范式是逐层更为规范化的。例如,第一范式(1NF)要求,在一表之中没有重复列,并且每一表都具有一主键(一主键可由多列所组成)。 注:此处关于1NF之定义,值得商榷。个人认为,Access帮助文件中之INF定义较为准确。
第二范式(2NF)要求,每一非键字段依赖于整个键,而非仅依赖于其一部分。例如,在之前所描述的“订单项目”表中,其键是“订单ID”和“订单项目ID”的一组合,每一非键字段必须依赖于这两个键字段。例如“客户”和“订单日期”字段仅依赖于“订单ID”,而不依赖于“订单项目ID”。
第三范式(3NF)进一步要求,在一表中之每一列仅依赖于主键。例如,假定有一“客户订单”表,其包含客户的姓名和地址。客户的姓名和地址是客户之属性,而非订单属性。要满足3NF,应移除这些列,将其放置于一独立“客户”表中。于是,“订单”表中将仅包含一外键字段,此为“客户”表之主键。
考虑此规则的另一角度是,若一客户有多个订单,那么其姓名和地址将会在每一订单中重复。减少这种数据重复是规范化之目标。违反3NF的另一常见示例是,包括了一可基于其他列计算所得的列。例如,表中同时包含了“出生日期”和 “年龄”就违反了3NF,因为“年龄”可基于“出生日期”计算得出。
定义这些范式的目标在于,帮助识别存在冗余数据的地方。由于以下三个主要原因,应消除这种冗余性: 1. 冗余数据导致更为庞大的数据库。 2. 冗余数据更难以维护。 3. 冗余数据更易产生错误。
存储成本相对较低,所以,除非使用的是一相当庞大的数据库,否则,由冗余数据所占用的空间可能并非是一个大问题。不过,维护问题可能相当严重。例如,思考“订单”表,它包含了客户姓名和地址。假定客户迁移,就将必须更新每一订单记录来存储其新地址。另外,对于每一新订单,都需输入其姓名和地址,而非简单地在“客户”表中查阅之。除了增加数据输入的负担,还更有可能有人会输入不正确的信息。若需要输入“Mark Collins”50次,将可能至少有一次输错了,最终输入了“Markl” 或 “Marl”。
建议初始数据库设计至少应从3NF开始着手。同时也应意识到,为了处理的效率,有时需要一定程度的反规范化。可能选择违反3NF,例如,除了“出生日期”字段,还添加一“年龄”字段。不过,只在必要之时,才添加这些列。若需要反规范化,建议使用数据宏(第3章中讲述)来填充它们。这会降低反规范化的负面影响。但绝不应违反2NF。取而代之,可使用一查询来创建一或多个表的反规范化视图,将在第4章中阐述之。
|