《自己动手设计数据库》第7章 设计表结构

第7章 建立表结构

到此章为止,你手上应该有3张列表了:

  1. 主题列表
  2. 经过评审的特征列表,又名初始字段列表
  3. 计算字段列表

定义初始表列表

要执行这一段内容,还需要第5章定义的任务目标

确定隐含主题

首先不去看主题列表,这里先去看初始字段列表,原因后面解释。

先把字段按照主题归类,即根据你的初始字段列表中的字段值来创建主题,并把该主题添加进初始表列表,这么做的原因有两个:

  1. 判断自己是否对这些字段都了解
  2. 可以在接下来的过程中与主题列表进行比较,看是否有隐含主题

此处建立第一版初始列表,注意,有的字段可能可以描述多个主题!。

使用主题列表

在这一步中我们会用到主题列表,并创建第二版初始表列表。具体步骤:

  • 消除重复项

寻找第一版初始表列表主题表中名称相同的项,确认其主题是否相同。

如果主题相同则划掉主题列表中的该项。

如果不同,那么就将其中一个列表中的项进行重命名,再将这两项添加进第二版初始表列表中。并将这两项从列表中划掉。


  • 消除表示相同主题的项

前面我们去掉了名称相同的项,接下来就是判断是否含有名称不同,但是主题相同的项了。

主题列表中的每一项与第一版初始表列表中的每一项进行比较。

如果出现主题列表中的一项与第一版初始表列表中的一项或者多项主题相同的话,

(当出现一对多的情况时)先修正第一版初始表列表中的项,

然后比较该项在主题列表第一版初始表列表中哪个名字比较贴近该主题,就将第一版初始表列表中的项修改成该名字,

然后添加进第二版初始表列表中,

最后删除主题列表中的该项。


  • 合并主题列表和第一版初始字段列表中的项

这一步最简单,将剩下的主题列表的项添加进第二版初始表列表中。到此为止,第二版初始表列表完成。主题列表也完成他的工作了,可以休息了。

使用任务目标

在这里第三次修改初始表列表,也就是创建第三版初始表列表

在这个步骤中,将使用任务目标检验前两个步骤中是否遗漏主题。这是最后的机会。

从第一个任务目标开始着手,使用前面的确定主题技巧,技巧找出其中暗含的主题。划出你所找到的每一个主题,然后与第二版初始表列表中的项对照检查。检查的方法与将第一版初始表列表主题表相比较一样,这里就不赘述了。

按照上述方法创建的初始表列表就是第三版初始表列表,接下来还要进行筛选:<

定义最终表列表

现在,初始表列表已经称得上完善,所以你可以将它转换成最终表列表了。这一新列表包含两个新要素:表类型表描述

表类型

表类型主要有以下几种,主要根据表在数据库中的作为为区分依据:

  1. 数据表代表企业的重要主题,也是数据库所提供信息的主要基础。
  2. 联系表在多对多关系中建立起两表之间的联系。
  3. 子集表包含与特定数据库相关的字段,以非常具体的方式对该数据表的主题做进一步描述。(具体内容看本篇文章底部)
  4. 验证表包含相对静态的数据,它是数据库完整性的关键组成部分。
表描述

表描述阐述的是对该表所表示的主题的明确定义和该主题的重要性

改进表名称

制定表名称指南:

  • 制定的表名称应该独特且有意义
  • 表名称应明白无误地展现其主题
  • 表名称应该精简
  • 避免使用描述物理特征的词
  • 避免使用缩略语
  • 避免使用专有名称或其他过多限制输入数据的词语
  • 避免使用隐含或显式指明多个主题的名称
  • 使用复数形式

具体细节请看书吧,我语文不好,硬伤。

指明表类型

这个标题有点误导,按照书上的说法,现在我们创建的初始表列表中的表类型都是数据表,原因如下:

  • 没有考虑数据完整性,所以我们没有定义验证表
  • 没有考虑表之间的关系,所以不会有联系表
  • 子集表是在将初始特征列表添加进表中后再创建的,所以现在也不会有。

但是我感觉,这不一定,可能设计者考虑较多,已经设计出了表类型是验证表的主题也不一定,所以如果发现这样的情况的话,也不必删掉它,只是在后面针对数据表的操作中不需要再考虑此类表了。

编辑表描述

表描述是记录在最终表列表上的表的另一面。表描述至关重要,因为它说明了表存在以及企业收集该表中数据的原因。实际上,描述必须包含:
1. 对表进行明确定义
2. 阐明其对企业的重要性

编辑表描述指南:

  • 对表进行准确定义
  • 解释该表对企业的重要性
  • 描述务求简明扼要
  • 避免提及具体操作信息,比如该表使用的方式和场合
  • 不同描述之间保持独立
  • 避免使用示例
与用户与管理人员访谈

主要目的是获取用户代表与管理人员代表对该这些表描述的意见。


字段对应入表

到这里我们完成了

  • 初始表列表
  • 初始字段列表
  • 计算字段列表

接下来就是开始将初始字段列表分配到初始表列表中的项中去了。

注意!

很多初始字段列表中的某一字段可能与初始表列表中的多张表有关联,这个时候就要把这个字段添加与之关联的表中,这里不是一个字段只能对应一张表的关系!所以为了避免有字段遗漏的情况,应该将对着初始表列表中的每一张表,在初始字段列表中寻找与之对应的字段,而不是将参照初始字段列表来分配初始表列表


精简字段

改进字段名称

制定字段名称的指南:

  • 字段名称应独特且富有内涵
  • 字段名称应简明扼要,准确描述字段所代表的特征
  • 字段名称应务求精简
  • 切勿使用缩略语,慎用缩写词
  • 切勿使用混淆字段名称含义的词语
  • 避免使用隐含或显示多个特征的名称
  • 使用名称的单数形式
使用理想字段解决异常现象

如果怀疑某一字段字段可能会产生问题,可以使用下面的理想字段的要素进行判断:

  • 代表表主题的鲜明特征,如果特点鲜明就没问题
  • 仅包含一个值(判断是否是多值字段)
  • 无法分解为更小的元素 (好像是第一范式的要求)
  • 不含计算值或串联值(判断是否是计算字段)
  • 在整个数据库结构中独一无二
  • 主要特性始终保持不变 (后面会讲,这里先不用管)
消除复合字段

将复合字段中的值进行拆分,拆分成多个字段,依然保存在该表中。

消除多值字段

一般情况下将该字段移除,然后根据该字段含义创建一张新的表,再来与原表之间建立联系表,具体的例子可以看这里:多对多关系的解决思路


精简表结构

既然已经精简了字段并确保每个字段合乎规范,现在可以开始精简表结构了。这一阶段的目标是确保字段合理分配到每个表和表的结构定义规范。这个过程也将揭晓表是否存在异常问题。

谈谈冗余数据和重复字段

冗余数据定义:在某字段中出现多次的一个值,它的产生有两种情况:

  1. 关联表中的字段,这个是没问题的
  2. 某些字段由于设计存在问题造成问题,这个就有问题了。

重复字段定义:在多个表中重复出现的字段,它的产生原因一般情况下有如下3中:

  • 用于将一组表联系起来 (主键、外键)
  • 表明特定类型的值出现多次
  • 对附加信息有需求倾向

除了第一种情况外,别的重复字段都要消除

参考理想表精简表结构
理想表的要素(这里只是列出来要求,可以作为最后的参考)
  • 表示单个主题,可以是一个对象或事件
  • 拥有一个主键
  • 不含复合字段或多值字段
  • 不含计算字段
  • 不含无用的重复字段
  • 冗余数据量保持低水平
消除无用的重复字段

我们前面讲解了重复字段的含义,接下来展示几个重复字段的例子,并消除他。

例1:

仪器表

Instructure IDTelephoneWeb Site
110110www.police.com
119119www.fireman.com
120120www.hospital.com

供货商

ManufactureTelephoneWeb Site
China110www.police.com
American119www.fireman.com
France120www.hospital.com

其中仪器表记录了该仪器的供货商的电话号码与网站,可是通时,供货商的表中也存储着这两个字段,这便造成了无用的重复字段,解决办法就是将重复字段从表中移除,再新建一张产品表与供货商的关系表

例2:

前面是多张表中的重复字段,现在来看一张表中的重复字段

学生表

Student IDStudent NameInstrument1Instrument2Instrument3
1YYGuitarPiano
2TTTenor SaxDrum SetBass Guitar

这里的 Instrument1\Instrument2\Instrument3 就是重复字段,而且当学生的乐器超过3种时,要不增加记录数量,即同一学生拥有两条记录,否则该表就无法记录下学生会的全部乐器了。这种情况下的话,跟上面一样,将这3个字段从该表中移除,组成新的表,再来与学生表做关联表,具体例子可以看这里:解决表关系中多对多的情况

建立子集表

我可以说这是一个坑吗?

当我们查看一张表的数据时,发现很多项中都存在数据为空(包括nul),那么一般情况下(不是绝对情况),这张表可能不满足理想表的第一要求。这张表应该是包含多个主题了,看下面这个例子。

而解决这个的办法就是创建子集表,注意,创建子集表不需要再经历上面那恐怖的筛选过程,只是将一个表的主题进行拆分。这里摘录一段书上关于子集表的话:

子集表表示特定数据表的一个从属主题。子集表包含了与其所表示的从属主题密切相关的字段,它也包含了一个或多个源自对应数据表的字段,这些字段用于连接对应数据表和子集表。需要注意的是,子集表包含表示本身和数据表共同特征的字段:这些字段必须保留在数据表中。

看下面这个具体的例子:

存货列表(INVENTORY)

  • Item Name
  • Item Description
  • Current Value
  • Insured Value
  • Data Entered
  • Manufacturer
  • Model
  • Warranty Expiration Date
  • Publisher
  • Author
  • ISBN
  • Category

其中很多的字段都是为了满足多种情况而添加进来的,如Author是为Item Name为book所添加的,Warranty Expiration Date(保修日期)是为Item Name为饮水机、打印机等设备添加的,所以如果就按照该表来存储数据的话,就会有很多项都有空缺内容。这个时候就可以为上述表创建子集表

原来的存货列表(INVENTORY)

  • Item Name
  • Item Description
  • Current Value
  • Insured Value
  • Date Entered

子集表

设备表(EQUIPMENT)

  • Item Name
  • Manufacturer
  • Model
  • Warranty Expiration Date

书表(BOOKS)

  • Item Name
  • Publisher
  • Author
  • ISBN
  • Category

可以看到设备表和书表的共同字段还存在存货列表中,但是两张表各自特殊的字段却被分了出来,创建了两张子集表,注意,子集表也是表,所以要添加进初始表列表中。

精简之前未发现的子集表

在将该创建的子集表都创建好后,就可以使用下面的方式来创建子集表。

  1. 消除子集表所有相同的字段,并使用这些字段建立新的数据
  2. 确认新数据表表示的主题,然后为其指定合适的名称
  3. 确保子集表表示该数据的从属主题,如有必要,修改子集表名称
  4. 为数据编写合适的描述,然后将它添加到最终列表中。标名表类型为数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值