AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > ACCESS

数据库规范化技巧

51自学网 2015-09-25 http://www.51zixue.net

 

时需要复制数据

    需要反规范化,以便保存可能会随时间变化的信息。

    在通过客户 ID 号将发票链接到客户表的简单示例中,我们可能需要保留开出发票时的客户地址(而不是制作发票时的地址,因为客户信息在这两个事件之间可能会有所变化)。如果开出发票时未保留客户地址,而将来又必须更新客户信息,则可能无法确定发送某些发票的确切地址。这可能会导致非常严重的商业问题。当然,有些信息(如客户的电话号码)可以不保存。因此,应该有选择地决定需要复制哪些数据。

    需要复制数据的另一个例子是填写发票的明细项。报价单通常用于挑选客户订购的商品。我们可以只存储报价单 ID,而 ID 指向包含产品说明、价格和其他详细信息的报价单。但是,产品说明和价格会随着时间而改变。如果不将数据从报价单复制到明细表中,将来则无法准确地重新打印原始发票。如果您尚未收到付款,问题将非常严重。

    因此,虽然规范化可以将相同的数据很好地保存在一个地方并能简化编辑工作,但某些情况下却不需要这些优势。如果以后由于历史原因需要数据的快照,则必须从一开始就在数据库中设计好。否则,一旦数据被覆盖就无法再找回。

有确切含义的字段作为主键字段

    效率,每个表都应该有一个主键字段。主键字段定义了在表中的唯一性,并由索引在其他字段中使用,以提高搜索性能。例如,客户表可以包含为每个客户定义唯一编号的 CustomerID 字段。为了便于讨论,假定表中包含多个字段,而不仅仅是简单的单一表查找(例如国家/地区列表)。

    一般来说,主键字段应具有如下特征:

  • 应该只包含一个字段
    可以将多个字段定义为表的主键字段,但最好是使用一个字段。首先,如果需要使用多个字段来定义唯一性,则需要占用更多的空间来存储主键。其次,表中的其他索引还必须使用主键字段的组合,这样所占用的空间比使用一个字段所占用的空间要多。最后,在表中标识记录需要获取字段组合。使用一个 CustomerID 字段定义客户比使用其他字段组合要好得多。  
  • 应该为数字类型
    Access 提供的 AutoNumber 字段类型是一个 Long Integer(长整数),非常适用于主键字段。这些值可以自动保证每个记录的唯一性,同时也支持多用户数据输入。  
  • 不会随时间而改变
    主键字段不应该随时间而改变。一旦标识了主键字段,就应该永远不变(象社会保障号一样)。更改过的主键字段将很难再使用历史数据,因为其中的链接被破坏了。  
  • 应该没有确切含义
    要确保主键字段不会随时间而更改,它应该没有确切含义。没有确切含义的主键值在其他数据不完整时也非常有用。例如,您可以指定一个客户编号,而无需该客户的完整地址。应用程序的其余部分可以很好地工作,您也可以在检索记录时添加信息。如果表中使用了国家/地区字段或其他您没有的标识字段作为主键的一部分,则很可能会导致无法使用应用程序。 

    鉴于上述原因,我们建议在大部分表中使用 AutoNumber 字段作为主键字段。通过使用组合框和隐藏列,可以将字段绑定到 AutoNumber 字段并将其隐藏,使用户无法看到。

使用引用完整性

    对表进行定义并理解各表是如何关联的之后,请确保添加引用完整性来巩固各表之间的关系。这样可以避免错误地修改链接字段而留下孤立的记录。Microsoft Jet 数据库引擎支持复杂的引用完整性,允许用户进行级联更新和删除。一般情况下,不应修改 ID 字段。因此,级联更新用得较少,但级联删除却非常有用。

    例如,如果发票表与订单表相关联,其中的一张发票可能有无限多个订单(明细项),并且每个订单记录包含它所链接的发票编号,则可以使用级联删除操作来删除发票记录,并自动删除所有相应的订单记录。这样可以避免出现没有相应发票记录的订单记录。

小结

    我们希望您能尽快将这些数据库设计概念应用到您的应用程序设计中,从而最大程度地减少问题,减少未实现此类设计时需要进行的修正。祝您好运。 

 
 

上一篇:数据库标准化基础  下一篇:怎样用代码隐藏、最大化、最小化ACCESS的主窗口