数据库规范化技巧

数据库规范化技巧
Luke Chung
FMS 总裁
2002年9月
适用于:

Microsoft® Access

摘要:本文为开发人员提供了片艺,使用这些技能可以规划 Access
表时避免某些问题。本文适用于 Microsoft Access 数据库 (.mdb) 和 Microsoft
Access 项目 (.adp)。

目录

简介
喻你的数码
而得怎么样的数额?
汝打算怎么处理这些多少?
数据里面如何相互关系?
趁日的推迟数据会发生怎样的扭转?
学怎么样使用查询
数据库规范化概念
将唯一信息囤积在一个地方
笔录是免费之,而新字段非常高昂
了解何时要复制数据
用没有适合含义的字段作为主键字段
以引用完整性
小结

简介
以统筹数据库时,最着重的步子是要保证数据科学分布及数据库的表中。使用对的数据结构,可以大幅度地简化应用程序的别样内容(查询、窗体、报表、代码等)。正确进行说明设计的正经名称是“数据库规范化”。

本文简要介绍数据库规范化的基本概念和组成部分用注意并力求避免的科普问题。

明白你的数目
每当设计表之前,应简明而打算怎么处理数量,还要了解就日的推数据会发生什么样的变更。您所举行的使以见面影响最后之宏图。

乃要如何的数码?
设计应用程序时,关键要打听规划之末段结出,以便确保您准备好有必要的数并知道那来自。例如,报表的外观、每个数据的源于以及所急需的保有数据是否还存在。对品种损失最为可怜之实在在品种后期发现要报表缺少数据。

晓要怎么样的数目后,就得确定数据的来自。数据是否打另数据源中导入?数据是否要清理或证实?用户是否用输入数据?

明明所需要数的类别及自是数据库设计的第一步。

汝打算如何处理这些多少?
用户是否用编制这些数据?如果要,应怎样展示数据以便让用户了解与编?有无来征规则及系的查找表?要求针对编辑和去保留备份的多少输入有没有发生相关联的审查问题?需要也用户展示怎么摘要信息?是否要转变导出文件?了解这些信后,就可以想象字段之间是如何相互关系的了。

数码里面如何相互关系?
以数据分组放入相关字段(例如与客户有关的消息、与发票相关的信息等),每个字段组都代表要建的阐明。然后考虑怎么用这些发明相互关联。例如,哪些表有部分多涉(例如,一个客户或有多摆放发票)?哪些表有一定涉嫌(这种状况下,通常会考虑用其重组及一个表中)?

乘机时间的延迟数据会发生什么的浮动?
设计表之后,常常会由没考虑时间之震慑使招致以后出现重问题。许多表明设计于当时使时效应大好,但是,常常会因为用户改数据、添加数与随时间的推迟而倒。开发人员经常会面意识要重设计表的布局来适应这些变化。表的结构发生变化时,所有有关的情节(查询、窗体、报表、代码等)也必须就更新。理解并预计数据会遵循时间推移发生怎样变化,可以兑现又好之筹划,减少题材的起。

攻如何以查询
了解如何分析及管制数据一致非常重要。您该深刻理解查询的劳作规律,理解什么运用查询在差不多个表之间链接数据,如何行使查询对数据开展分组和汇总,以及怎样以不需要为规范化格式显示数据经常采取交叉表查询。

哼的数量计划的最终目标就是若平衡两只待:既而就年华的缓有效地蕴藏数据,又如轻松地摸和分析数据。理解查询的作用对是设计表很有扶持。

数据库规范化概念
顿时片介绍数据库规范化所提到的基本概念,而非是针对数据库规范化进行理论性的探索。如何当公的实际状况遇使这些概念可能会见随着应用程序需要的异而享有扭转。这一部分底目的是明这些基本概念、根据实际需要采用它们,并理解偏离这些概念将见面并发什么样问题。

用唯一信息囤积在一个地方
大部数据库开发人员都明白数据库规范化的基本概念。理想状态下,您想以一律之数额存储在和一个地方,并于待引用时行使
ID
来拓展引用。因此,如果某些信息发生了变更,则可以在一个地方进行改动,而任何程序中之应和信息为会见随着转移。

比如,客户表会存储每个客户的记录,包括姓名、地址、电话号码、电子邮件地址以及另外特色信息。客户表中可能包含唯一的
CustomerID 字段(通常是 Autonumber
字段),这个字段即该表的主键字段,其他表下它们来引用该客户。因此,发票表可以只援引客户之
ID
值,而未是于各张发票中存储客户的有着信息(因为跟一个客户或会见有所多摆设发票),这样使客户之
ID 值即可从客户表中查找客户的详细信息。使用 Access
中功能强大的窗体(使用组合框和子窗体),可以轻松地就这项工作。如果要改客户信息(例如新增电话号码),只需要于客户表中修改,应用程序中援该信息之别样其他部分还见面跟着自动更新。

使正确规范化的数据库,通过简单的编纂即可轻松处理数量以时间推移而生的变更。使用未对规范化的数据库,通常需要动用编程或询问来改变多长达记下或多独说明。这不仅仅会大增工作量,还见面增多由于不对履行代码或询问而致使数据未一样的可能性。

笔录是免费之,而新字段非常高昂
美好的数据库应该一味待随着时光之延期添加新的记录,数据库表应该能保留大量记录。但是,如果你发现用充实又多字段,则恐会见逢设计问题。

电子表格专家时会赶上上述问题,因为他俩习惯给以设计电子表格的计设计数据库。设计时随时间变化的字段(例如,年、季度、产品跟销售人员)需要在明天加加新字段。而不利的计划应该是更换信息并拿随时间变化之数在一个字段内,这样就算得加上更多记录。例如,只待创建“年”字段,然后于该字段中输入各记录相应的年份值即可,无需呢每年创一个单独的字段。

充实额外的字段可能会见发生问题,因为表结构的变更会针对应用程序的外部分有潜移默化。在表明中上加更多字段经常,依赖该表的对象以及代码也亟需创新。例如,查询需要取得额外的字段,窗体需要出示这些字段,而报表则要包含这些字段,等等。但是,如果数据都规范化,则现有对象见面自动检索新数据,并正确计算还是展示这些多少。查询功能更是强大,因为其同意而照“年”字段进展分组,以逐渐显示摘要(不管表中涵盖哪些年)。

只是,数据规范化并无代表非能够形或采用随时间而别或者凭时的字段。需要浏览或展示这类似消息的开发人员通常可以动用交叉表查询来齐这同样目的。如果你不熟悉交叉表查询,应该学习怎么使其。虽然其同表有所不同(尤其是用户无法编辑交叉表查询的结果),但它确实可用来在数表中显示信息(最多可达成
255
独字段)。如果要以表中利用它,则会愈来愈扑朔迷离,因为表格要包含额外的或者连变动的许段名。这就是是胡大部分报表将数据作为独立的分组(而无是独的排列)显示的缘故。对于那些困难的情况,您必须花工夫错开化解这题目。希望保有人数犹能够解这种控制会趁着岁月之变更对另资源有的震慑。

顿时就是是怎么加记录是免费的(这是数据库的顶天立地优势)而益字段是如此昂贵的因。如果数据库设计科学,则可以适应各种各样的变化。

打探何时要复制数据
有时候数据要反规范化,以便保存或者会见随时间变化的音。

当经过客户 ID
号将发票链接到客户表的略示例中,我们也许需要保留开有发票时的客户地址(而非是制发票时之地点,因为客户信息于当时简单单事件中或者会见持有转)。如果起起发票时莫保留客户地址,而前又必须创新客户信息,则恐无法确定发送某些发票的宜地点。这可能会见导致大沉痛的经贸问题。当然,有些信息(如客户之电话号码)可以免保留。因此,应该发生选择地决定用复制哪些数据。

亟需复制数据的别样一个事例是填发票底明细项。报价只是通常用于挑选客户定购的货。我们得但存储报价单
ID,而 ID
指向包含产品说明、价格同外详细信息的报价单。但是,产品认证跟价格会就岁月一旦改。如果不将数据由报价单复制到明细表中,将来尽管无法准确地还打印原始发票。如果你没接到付款,问题将大惨重。

所以,虽然规范化可以用同样之数充分好地保存在一个地方并能够简化编辑工作,但一些情况下可休需要这些优势。如果之后由历史原因需要数的快照,则须由平开始便在数据库被统筹好。否则,一旦数据让遮盖就无法还找回。

行使无当含义的字段作为主键字段
为了提高效率,每个表都应该有一个主键字段。主键字段定义了于表中的唯一性,并由索引在其余字段中使,以增长搜索性能。例如,客户表可以涵盖为每个客户定义唯一编号的
CustomerID
字段。为了方便讨论,假定表中带有多独字段,而不仅仅是概括的纯表查找(例如国家/地区列表)。

貌似的话,主键字段应有所如下特征:

应该单独含一个字段
好以大半只字段定义为表的主键字段,但最是以一个字段。首先,如果需要运用多单字段来定义唯一性,则需要占用更多之上空来囤积主键。其次,表中的任何索引还非得采取主键字段的做,这样所占有的空间比较采用一个字段所占的上空要多。最后,在表明中标识记录得取得字段组合。使用一个
CustomerID 字段定义客户于采用其他字段组合要好得差不多。
有道是也数字型
Access 提供的 AutoNumber 字段类型是一个 Long
Integer(长整数),非常适用于主键字段。这些价值好活动包每个记录之唯一性,同时为支持多用户数量输入。
非会见随时间而变更
主键字段不应随时间而更改。一旦标识了主键字段,就应永远不更换(象社会保障号相同)。更改了之主键字段将大为难还下史数据,因为中间的链接给损坏了。
该没有合适含义
设保管主键字段不见面随时间而改变,它应当无合适含义。没有确切含义的主键值当其它数据未完全时为十分实惠。例如,您可以指定一个客户编号,而不管需该客户的总体地址。应用程序的其余部分可以生好地干活,您吗得于搜索记录时上加信息。如果表中采用了江山/地区字段或任何您没的标识字段作为主键的平等片,则不行可能会见招致无法用应用程序。
出于上述原因,我们建议以大部分阐明中使用 AutoNumber
字段作为主键字段。通过采取组合框和隐藏列,可以将字段绑定到 AutoNumber
字段并将那个逃匿,使用户无法见到。

采用引用完整性
对表进行定义并懂得各表是怎么样干的事后,请确保增长引用完整性来巩固各表之间的干。这样可免不当地修改链接字段要留孤立的记录。Microsoft
Jet
数据库引擎支持复杂的援完整性,允许用户进行级联更新和去。一般情况必发娱乐最新官方网址下,不应允改
ID 字段。因此,级联更新用得较少,但级联删除却格外管用。

譬如说,如果发票表与订单表明相关联,其中的平等张发票或者发极致多独订单(明细项),并且每个订单记录包含它所链接的发票编号,则足以使级联删除操作来删除发票记录,并活动删除所有相应的订单记录。这样可避免出现没有相应发票记录的订单记录。

小结
俺们期待你能够尽快以这些数据库设计概念应用至您的应用程序设计被,从而最充分程度地减少题材,减少非兑现此类设计时欲展开的匡正。祝你好运。

Luke Chung 是 FMS Inc. 的创始人兼总裁。FMS Inc.
是业界领先的老三正在产品供应商,其产品适用于 Microsoft Access
用户与开发人员。

发表评论

电子邮件地址不会被公开。 必填项已用*标注