数据库设计规范化的五个要求.doc

上传人:b****1 文档编号:238681 上传时间:2022-10-07 格式:DOC 页数:10 大小:35.50KB
下载 相关 举报
数据库设计规范化的五个要求.doc_第1页
第1页 / 共10页
数据库设计规范化的五个要求.doc_第2页
第2页 / 共10页
数据库设计规范化的五个要求.doc_第3页
第3页 / 共10页
数据库设计规范化的五个要求.doc_第4页
第4页 / 共10页
数据库设计规范化的五个要求.doc_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据库设计规范化的五个要求.doc

《数据库设计规范化的五个要求.doc》由会员分享,可在线阅读,更多相关《数据库设计规范化的五个要求.doc(10页珍藏版)》请在冰豆网上搜索。

数据库设计规范化的五个要求.doc

数据库设计规范化的五个要求

通常情况下,可以从两个方面来判断数据库是否设计的比较规范。

一是看看是否拥有大量的窄表,二是宽表的数量是否足够的少。

若符合这两个条件,则可以说明这个数据库的规范化水平还是比较高的。

当然这是两个泛泛而谈的指标。

为了达到数据库设计规范化的要求,一般来说,需要符合以下五个要求。

  要求一:

表中应该避免可为空的列。

  虽然表中允许空列,但是,空字段是一种比较特殊的数据类型。

数据库在处理的时候,需要进行特殊的处理。

如此的话,就会增加数据库处理记录的复杂性。

当表中有比较多的空字段时,在同等条件下,数据库处理的性能会降低许多。

  所以,虽然在数据库表设计的时候,允许表中具有空字段,但是,我们应该尽量避免。

若确实需要的话,我们可以通过一些折中的方式,来处理这些空字段,让其对数据库性能的影响降低到最少。

  一是通过设置默认值的形式,来避免空字段的产生。

如在一个人事管理系统中,有时候身份证号码字段可能允许为空。

因为不是每个人都可以记住自己的身份证号码。

而在员工报到的时候,可能身份证没有带在身边。

所以,身份证号码字段往往不能及时提供。

为此,身份证号码字段可以允许为空,以满足这些特殊情况的需要。

但是,在数据库设计的时候,则可以做一些处理。

如当用户没有输入内容的时候,则把这个字段的默认值设置为0或者为N/A。

以避免空字段的产生。

  二是若一张表中,允许为空的列比较多,接近表全部列数的三分之一。

而且,这些列在大部分情况下,都是可有可无的。

若数据库管理员遇到这种情况,笔者建议另外建立一张副表,以保存这些列。

然后通过关键字把主表跟这张副表关联起来。

将数据存储在两个独立的表中使得主表的设计更为简单,同时也能够满足存储空值信息的需要。

  要求二:

表不应该有重复的值或者列。

  如现在有一个进销存管理系统,这个系统中有一张产品基本信息表中。

这个产品开发有时候可以是一个人完成,而有时候又需要多个人合作才能够完成。

所以,在产品基本信息表产品开发者这个字段中,有时候可能需要填入多个开发者的名字。

  如进销存管理中,还需要对客户的联系人进行管理。

有时候,企业可能只知道客户一个采购员的姓名。

但是在必要的情况下,企业需要对客户的采购代表、仓库人员、财务人员共同进行管理。

因为在订单上,可能需要填入采购代表的名字;可是在出货单上,则需要填入仓库管理人员的名字等等。

  为了解决这个问题,有多种实现方式。

但是,若设计不合理的话在,则会导致重复的值或者列。

如我们也可以这么设计,把客户信息、联系人都放入同一张表中。

为了解决多个联系人的问题,可以设置第一联系人、第一联系人电话、第二联系人、第二联系人电话等等。

若还有第三联系人、第四联系人等等,则往往还需要加入更多的字段。

  可是这么设计的话,会产生一系列的问题。

如客户的采购员流动性比较大,在一年内换了六个采购员。

此时,在系统中该如何管理呢?

难道就建立六个联系人字段?

这不但会导致空字段的增加,还需要频繁的更改数据库表结构。

明显,这么做是不合理的。

也有人说,可以直接修改采购员的名字呀。

可是这么处理的话,会把原先采购订单上采购员的名字也改变了。

因为采购单上客户采购员信息在数据库中存储的不是采购员的名字,而只是采购员对应的一个编号。

在编号不改而名字改变了的情况下,采购订单上显示的就是更改后的名字。

这不利于时候的追踪。

  所以,在数据库设计的时候要尽量避免这种重复的值或者列的产生。

笔者建议,若数据库管理员遇到这种情况,可以改变一下策略。

如把客户联系人另外设置一张表。

然后通过客户ID把供应商信息表跟客户联系人信息表连接起来。

也就是说,尽量将重复的值放置到一张独立的表中进行管理。

然后通过视图或者其他手段把这些独立的表联系起来。

  要求三:

表中记录应该有一个唯一的标识符。

  在数据库表设计的时候,数据库管理员应该养成一个好习惯,用一个ID号来唯一的标识行记录,而不要通过名字、编号等字段来对纪录进行区分。

每个表都应该有一个ID列,任何两个记录都不可以共享同一个ID值。

另外,这个ID值最好有数据库来进行自动管理,而不要把这个任务给前台应用程序。

否则的话,很容易产生ID值不统一的情况。

  另外,在数据库设计的时候,最好还能够加入行号。

如在销售订单管理中,ID号是用户不能够维护的。

但是,行号用户就可以维护。

如在销售订单的行中,用户可以通过调整行号的大小来对订单行进行排序。

通常情况下,ID列是以1为单位递进的。

但是,行号就要以10为单位累进。

如此,正常情况下,行号就以10、20、30依次扩展下去。

若此时用户需要把行号为30的纪录调到第一行显示。

此时,用户在不能够更改ID列的情况下,可以更改行号来实现。

如可以把行号改为1,在排序时就可以按行号来进行排序。

如此的话,原来行号为30的纪录现在行号变为了1,就可以在第一行中显示。

这是在实际应用程序设计中对ID列的一个有效补充。

这个内容在教科书上是没有的。

需要在实际应用程序设计中,才会掌握到这个技巧。

  要求四:

数据库对象要有统一的前缀名。

  一个比较复杂的应用系统,其对应的数据库表往往以千计。

若让数据库管理员看到对象名就了解这个数据库对象所起的作用,恐怕会比较困难。

而且在数据库对象引用的时候,数据库管理员也会为不能迅速找到所需要的数据库对象而头疼。

  为此,笔者建立,在开发数据库之前,最好能够花一定的时间,去制定一个数据库对象的前缀命名规范。

如笔者在数据库设计时,喜欢跟前台应用程序协商,确定合理的命名规范。

笔者最常用的是根据前台应用程序的模块来定义后台数据库对象前缀名。

如跟物料管理模块相关的表可以用M为前缀;而以订单管理相关的,则可以利用C作为前缀。

具体采用什么前缀可以以用户的爱好而定义。

但是,需要注意的是,这个命名规范应该在数据库管理员与前台应用程序开发者之间达成共识,并且严格按照这个命名规范来定义对象名。

  其次,表、视图、函数等最好也有统一的前缀。

如视图可以用V为前缀,而函数则可以利用F为前缀。

如此数据库管理员无论是在日常管理还是对象引用的时候,都能够在最短的时间内找到自己所需要的对象。

  要求五:

尽量只存储单一实体类型的数据。

  这里将的实体类型跟数据类型不是一回事,要注意区分。

这里讲的实体类型是指所需要描述对象的本身。

笔者举一个例子,估计大家就可以明白其中的内容了。

如现在有一个图书馆里系统,有图书基本信息、作者信息两个实体对象。

若用户要把这两个实体对象信息放在同一张表中也是可以的。

如可以把表设计成图书名字、图书作者等等。

可是如此设计的话,会给后续的维护带来不少的麻烦。

  如当后续有图书出版时,则需要为每次出版的图书增加作者信息,这无疑会增加额外的存储空间,也会增加记录的长度。

而且若作者的情况有所改变,如住址改变了以后,则还需要去更改每本书的记录。

同时,若这个作者的图书从数据库中全部删除之后,这个作者的信息也就荡然无存了。

很明显,这不符合数据库设计规范化的需求。

  遇到这种情况时,笔者建议可以把上面这张表分解成三种独立的表,分别为图书基本信息表、作者基本信息表、图书与作者对应表等等。

如此设计以后,以上遇到的所有问题就都引刃而解了。

以上五条是在数据库设计时达到规范化水平的基本要求。

除了这些另外还有很多细节方面的要求,如数据类型、存储过程等等。

而且,数据库规范往往没有技术方面的严格限制,主要依靠数据库管理员日常工作经验的累积。

数据库设计中的反规范技术探讨

1. 数据库设计简述

数据库设计是把现实世界的商业模型与需求转换成数据库的模型的过程,它是建立数据库应用系统的核心问题。

设计的关键是如何使设计的数据库能合理地存储用户的数据,方便用户进行数据处理。

  

数据库设计完全是人的问题,而不是数据库管理系统的问题。

系统不管设计是好是坏,照样运行。

数据库设计应当由数据库管理员和系统分析员一起和用户一道工作,了解各个用户的要求,共同为整个数据库做出恰当的、完整的设计。

  

数据库及其应用的性能和调优都是建立在良好的数据库设计的基础上,数据库的数据是一切操作的基础,如果数据库设计不好,则其它一切调优方法提高数据库性能的效果都是有限的。

  

数据的规范化

  

1.1. 范式概述

  

规范化理论是研究如何将一个不好的关系模式转化为好的关系模式的理论,规范化理论是围绕范式而建立的。

规范化理论认为,一个关系数据库中所有的关系,都应满足一定的规范(约束条件)。

规范化理论把关系应满足的规范要求分为几级,满足最低要求的一级叫做第一范式(1NF),在第一范式的基础上提出了第二范式(2NF),在第二范式的基础上又提出了第三范式(3NF),以后又提出了BCNF范式,4NF,5NF。

范式的等级越高,应满足的约束集条件也越严格。

规范的每一级别都依赖于它的前一级别,例如若一个关系模式满足2NF,则一定满足1NF。

下面我们只介绍1NF,2NF,3NF范式。

  

  1.2. 1NF

  

  1NF是关系模型的最低要求,它的规则是:

  

  每一列必须是原子的,不能分成多个子列。

  

  每一行和列的位置只能有一个值。

  

  不能具有多值列。

  

  例:

如果要求一个学生一行,一个学生可选多门课,则下面的“学生”表就不满足1NF:

student(s-no,s-name,class-no)

  

  其中:

s-no为学号,s-name为学生姓名,class-no为课程号。

因为一个学生可选多门课,所以列class-no有多个值,所以空不符合1NF。

  

  规范化就是把它分成如下两个表:

“学生”表和“选课”表,则这两个表就都满足1NF了。

  

  student(s-no,s-name)

  

  stu-class(s-no,class-no)

  

  1.3. 2NF

  

  对于满足2NF的表,除满足1NF外,非主码的列必须依赖于所有的主码,而不是组合主码的一部分。

如果满足1NF的表的主码只有一列,则它自动满足2NF。

  例:

下面的“选课”表,不符合2NF。

  

  stu-class(s-no,class-no,class-name)

  

  其中:

class-name为课程名称。

因为词表的主码是:

(s-no,class-no),非主码列class-name依赖于组合主码的一部分class-no,所以它不符合2NF。

  

  对该表规范化也是把它分解成两个表:

“选课”表和“课程”表,则它们就都满足2NF了。

  

  stu-class(s-no,class-no)

  

  class(class-no,class-name)

  

  1.4. 3NF

  

  3NF的规则是除满足2NF外,任一非主码列不能依赖于其它非主码列。

  例:

下面的“课程”表,不符合3NF。

  

  class(class-no,class-name,teacher-no,teacher-name)

  

  其中:

teacher-no为任课教师号,teacher-name为任课教师姓名。

因为非主码列teacher-name依赖于另一非主码列teacher-no,所以它不符合3NF。

  其解决办法也是把它分解成两个表:

“课程”表和“教师”表,则它们就都满足3NF了。

  

  class(class-no,class-name,teacher-no)

  

  teacher(teacher-no,teacher-name)

  

  1.5. 小结

  

  当一个表是规范的,则其非主码列依赖于主码列。

从关系模型的角度来看,表满足3NF最符合标准,这样的设计容易维护。

一个完全规范化的设计并不总能生成最优的性能,因此通常是先按照3NF设计,如果有性能问题,再通过反规范来解决。

  

  数据库中的数据规范化的优点是减少了数据冗余,节约了

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1