如何保证数据库结构的合理性(一、调整字段)

 

    最近重温了下《SQL查询凡人入门》,对里面提到保证数据库结构的合理性深有感触,故总结如下,与大家分享。

(一)调整字段

    数据库中字段是表的基本结构部分,所以在调整整个表之前必须使得字段都是处于最好状态。很多情况下,字段的选择确定会减少很多给定表的已有问题,也能避免一些潜在的问题的产生。

 

1)字段名称的调整

    字段描述的是表所描述的物体的特征。如果给字段一个合适的名称,就可以标识这个打算要描述的特征。一个有歧义的含糊不清的名称是一个麻烦的征兆,暗含这个字段的代表含义还没有真正明确下来。可以利用下面清单中的内容检查每一个字段名称。

1.对整个组织来说,这个名称是否具有一定的说明意义?

    要确保对于访问这个字段的每个人来说这个名称都是有描述意义的。语义有时候是非规则的,如果字段所用的词对于不同的人群来说语义不同,那就麻烦了。就好象在大部分地区,摇头表示的是“No”,而在印度,摇头则表示“Yes”。

2.这个字段是否清楚没有歧义?

    比如PhoneNumber就很容易让人误会。描述的是哪种电话号码?为了明确起见,如果需要记录每一种电话号码,那么应创建HomePhone、WorkPhone、CellPhone这样的字段。

    另外还需要确保不会在不同的表中使用相同的字段名。如有必要,建议在相同的字段名称前面加上一个短短的前缀。比如,Vendors表中用VendCity,Customers表中用CustCity,Employees表中用EmpCity这样的名称。

    总之,确保数据库中的每一个字段都有唯一的名称,在整个数据库结构中仅出现一次。除非这一字段被用来建立两个表之间的关联关系。

3.是否使用首字母的缩写或者其他缩写形式作为字段名称?

    如果有,请修改它!首字母的缩写很难解释,易被误解。使用缩写要非常谨慎,处理的时候也小心。如果对字段名称有一个信息的正向补充增强作用的情况下才使用缩写,缩写不能损害字段本身所表示的意义。

4.是否使用了暗含或者明确标识多个特性的字段名称?

    这种字段一般很容易发现,因为有类似于“and”或“or”这样的代表性字词。包含反斜线符号(\)、连字符(-)、与的记号(&)的字段同样也属于这一类型。如果发现这样的字段,检查所存储的数据,看是否需要将它们拆开成为更小的单独字段。

5.确保字段名称的单数形式

    字段所描述的是表所代表的物体的单一的特征,所以字段名应该是单数。而另一方面,表的名称之所以是复数,是因为它所描述的是同类对象或事件的集合。使用这一命名规则后,区分表的名称和字段名称就是一件很容易的事了。

 

2)消除粗糙的边

    修正了字段名,现在就应该转而注意字段本身的结构了。虽然对字段的合理性已经有了相当的把握,但还是有几点需要继续努力来使字段结构尽可能更加合理高效。

1.确保字段描述的是表所表示的物体某一特性。

    这一步可确定字段是否真的属于这个表。如果它和这个表的关系并不密切,那就删除它。这个规则也有一个例外情况:这个字段是用来建立这个表和数据库中另一个表之间的关联关系,或为了完成数据库应用的某些任务而专门添加到表中。

2.确保字段中仅包含一个单一的值。

    一个字段可能会潜在地保存相同值的几个具体实例,这称为多值字段。同样地,一个字段也可能潜在地保存两个或多个各自不同的值,这称为多型字段。多值字段和多型字段会给数据库管理带来混乱,尤其是在对这些数据进行编辑、删除和排序时。当每一个字段存储的是单一值时,会对保证数据完整性和信息正确性有很大的帮助。

3.确保字段所存储的内容不是计算结果或者一连串事件的结果。

    一个设计良好的表中不允许出现计算列。主要原因是因为计算列的值本身。这里的字段,不像电子数据表格中的一个单元,不能保存一个具体的计算值。当计算表达式中的任何一部分改变,存储在字段中的计算值不会随之更新。唯一方式是手工修改或者编写代码年进行自动修改。然而,使用计算列的首选是在SELECT语句中结合使用。

4.确保在整个数据库中一个字段仅出现一次。

    一个普遍错误是向数据库中的好几个表插入了相同的字段,那就会面临数据不一致的问题。此时,改变了一个表中的这个字段而忘记了对其他表中的相同字段进行相同的修改,就会出现数据的不一致。避免这个问题的方法微十时毫 确保整个数据库结构中一个字段仅出现一次。(此规则的例外情况是用某一个字段来建立两个表之间的关联关系。)

 

3)多型字段的处理

    识别多型字段可以先回答一个简单问题:是否能将当前字段的值分解成更小的独立的几部分?如果回答“是”,那么这就是一个多型字段。

    比如Customers表中有这个一个字段StreetAddress,里面的记录为“15127 NE 24th ,#383 ,Redmond ,WA 98052”。这个字段就可以拆分为CustAddress、CustCity、CustState和CustZipcode,分别存储15127 NE 24th 、Redmond、WA和98052。

下面是书中调整前和调整后的表:

调整后:

    有时候可能识别一个多型字段是比较困难的,比如Instruments表中有这么一个字段IstrumentID,里面存储了GUIT2201、MFX3349、AMP1001、AMP5590、SFX2227和AMP2766。乍看好象不是多型字段,仔细查看就会发现,此字段的值中包含了两个不同的信息:设备所属的类别——如AMP(amplifier,扩音器)、GUIT(guitar,吉他)和MFX(multieffects unit,音效组合)——以及这些设备的标识号码。这两个值应该分开保存在各自的字段中,以保证数据完整性。下图是Instruments表:

 

4)多值字段的处理

    多值字段的处理比多型字段相对困难一些,但是值得庆幸的是,多值字段一眼就能识别出来。几乎毫无例外的,这一类型字段存储的值包含许多逗号,逗号用来分隔字段中值的不同部分。

    在对多值字段进行处理之前,要先明白最初想要赋予的多值字段和表之间的关系。多值字段的值和其父表中的记录是M:M的关系:一个多值字段中的某一个确定的值和父表中的多个记录相关,父表中的一个记录和多值字段中的多个值相关联。处理这种多对多关系和其他多对多关系的方法一样——用一个关联表。

    要创建关联表,使用多值字段并复制原来表中的主关键字作为建立新表的基础部分。给这个新的关联表一个合适的名字,并指定这两个字段为其组合主关键字。(这种情况下,组合两个字段中的值就能惟一标识新表中的每一个记录。)然后就可以在一对一的基础上对新表中的两个字段关联了。

    比如现在有Pilots表,表中有三个字段PilotID、PilotName、Certifications,有两个记录分别为:25100、John、727,737,757,MD80;25101、David、737,747,757。很注意到Certifications是一个多值字段(存储的值包含了逗号),先将Certifications从Pilots表中删除,然后将根据Certifications的内容新建Certifications表,Certifications表中有如下字段CertificationID和TypeofAircraft,包含记录如下:8102、Boeing 727;8103、Boeing 737;8104、Boeing 747;8105、 Boeing 757;8106、 McDonnell Douglas MD80。接着,在创建一关联表,比如Pliot Certifications表,表中的字段分别为Pilots表的主键PilotID和Certifications表的主键CertificationID。根据原来的记录,Pliot Certifications表中会有如下记录:25100、8102;25100、8103;25100、8105;25100、8106;25100、8103;25100、8104;25101、8105。

    为了方便,上面的例子是我简化过的,下面是书中的例子:

    调整前的表:

调整后的表:

posted @ 2012-09-27 12:48  竹风抚荷塘  阅读(2742)  评论(3编辑  收藏  举报