数据库标准化基础
时 间:2004-11-11 00:00:00
作 者:微软 ID:61 城市:岳阳
摘 要:本文向初学者讲述数据库标准化的术语。在讨论关系型数据库的设计时,对该术语有一个基本了解是很有用的。
正 文:
标准化是在数据库中组织数据的进程。其中包括,根据设计规则创建表并在这些表间建立关系;通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并增加数据的灵活性。
冗余数据会浪费磁盘空间并带来维护问题。如果必须更改同时放在几个位置的一个数据,则必须按同一种方式更改所有位置的数据。如果该数据只保存在 Customers 表中而非数据库中的其它位置,更改客户地址要容易得多。
什么是“不一致相关性”?虽然在 Customers 表中查找部分客户的地址对于用户来说很直观,但是对于在此查找访问该客户的雇员的薪水来说可能没有意义。雇员的薪水与雇员本身有关或者说取决于雇员本身,因此应在“雇员”表中进行查看。由于查找数据的路径有可能丢失或破坏掉,不一致相关性会使得数据难于访问。
有一些规则用于数据库标准化。每个规则称为“常规表单(范式)”。如果遵循了第一条规则,则数据库是“第一常规表单(范式)”。如果遵循了前三条规则,则数据库是“第三常规表单(范式)”。虽然标准化可能有其它等级,但对于大多数应用程序而言,通常认为第三常规表单(范式)是必须的最高等级。
由于有许多常规规则与规范,实际情况并不总是要求完全符合。一般说来,标准化需要其它表,而且一些客户觉得这比较麻烦。如果您决定不遵循标准化前三个规则之一,请确保应用程序会预见可能发生的任何问题,如冗余数据与不一致相关性问题。
下面的说明中包括一些示例。
第一常规表单(第一范式)
1.去掉各个表中的重复组。
2.为每组关联数据创建独立的数据。
3.使用主关键字确定每组关联数据。
请勿在一个表中使用多个字段保存相似数据。例如,要跟踪可能来自两个可能资源的清单项,清单记录可能包含 Vendor Code 1 和 Vendor Code 2 的字段。
添加第三方供应商时会出现什么情况?添加字段并不能解决问题;添加字段需要修改程序和表,而且无法很好地适应供应商个数不断变化的情况。反而,将所有供应商信息放在称为 Vendors 的独立表中,然后使用项目编号关键字将清单链接到供应商,或使用供应商代码关键字将供应商链接到清单。
第二常规表单(第二范式)
1.为应用到多个记录的多组数值创建独立表。
2.使用外部关键字将这些表关联起来。
记录不应取决于表主关键字(如有必要,可以是组合关键字)之外的任何关键字。例如,在计帐系统中考虑使用客户地址。除 Customers 表需要该地址外,Orders、Shipping、Invoices、Accounts Receivable 与 Collections 表也需要该地址。在上述每个表中并不是将客户地址作为独立条目进行保存的,而是将其保存在一个位置,即保存在 Customers 表或独立的 Addresses 表中。
第三常规表单(第三范式)
去掉了不取决于关键字的字段。
在记录中而不是记录的关键字部分的数值并不包含在表中。一般来说,在任何时候,字段组的内容可能适用于表中的多个记录,可以考虑在一个独立表中存放这些字段。
例如,在 Employee Recruitment 表中,可能包括应聘者的大学名称和地址。但是,您需要一个完整的大学列表以便于进行分组邮寄。如果大学信息保存在 Candidates 表中,没有当前的应聘者无论如何无法列出这些大学。创建独立的 Universities 表并使用大学代码关键字将其链接至 Candidates 表。
例外情况:遵循第三常规表单(这在理论上是必要的)不一定总是实际有用的。如果您有一个 Customers 表且要去掉所有可能的字段内相关性,则必须对城市、邮政编码、销售代表、客户类别以及任何其它可能在多个字段中重复的因素创建独立的表。理论上讲,标准化是值得投资的。但是,许多小的表可能会使性能降低或超出打开文件与内存的能力。
仅将第三常规表单应用于不断变化的数据的方法可能更加灵活。如果还保留了一些相关的字段,则需要将应用程序设计为当对一个数据进行更改时,需要用户确认所有的相关字段。
其它标准化表单(范式)
也有第四常规表单(第四范式)(也称为 Boyce Codd 常规表单(范式)(BCNF))与第五常规表单(第五范式)存在,但是在实际设计中很少考虑。忽视这些规则可能使得数据库的设计不太完美,但这不应影响功能。
将示例表标准化
这些步骤说明将一个虚构的学生表进行标准化的步骤。
非标准化的表:
1022 Jones 412 101-07 143-01 159-02 4123 Smith 216 201-01 211-02 214-01 |
第一常规表单(第一范式):无重复组
表应只有两维。由于一个学生有好几个类别,因此这些类别应在一个独立的表中列出。在上述记录中,Class1
Access软件网QQ交流群 (群号:54525238)
Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access系统自带的日期选择器不...(11.08)
- 分享一下Access工程中的acw...(11.07)
- Access快速开发平台--让有权...(11.04)
- Access快速开发平台--审批选...(11.01)
- ACCESS两张表先各自排序,然后...(10.31)
- Access对子窗体数据进行批量+...(10.30)
- SqlServer中如何用SQL命...(10.29)
- Access报表中的分组功能用代码...(10.28)
- 用Access计算库存结余的一个方...(10.26)
- 最精简的组合框行来源数据快速输入(...(10.25)