有关数据完整性的教训和转一篇文章

     因为个人设计上喜欢把业务和相关的逻辑放在软件层,一直认为把业务逻辑放在软件层,因为实体类基本跟数据库表的映射都是保持一致的,如果把业务逻辑放在软件层,更加能够体现类与类之间的关系,并且把业务集中在软件层,可以使系统的业务规则更加集中,而且可以利用UML把类关系来表示业务逻辑。

     不过最近发生了一个事情让我觉得应该转换一下想法,事情是这样的,该业务的功能涉及多个系统之间的数据同步,按照我们的习惯是使用DTS来实现,最近发现某些中间关联表既然出现了违反业务逻辑的数据。

     因为该些系统的数据同步情景比较多,所以有的需要按照各种情景实现数据的同步,所以有的通过DTS进行同步,有的通过软件层进行同步,而且中间互相映射的表在数据结构上分了很多层,一环套一环(电影<无极>啊),所以排查起来比较麻烦。

     吃一堑张一智,这也让我了解,在数据库设计的时候不要单纯的把业务逻辑仅仅放在软件层,同时也要在数据库层对数据的完整性进行控制,当软件层出现错误,或者遗漏控制时,还有数据库层的数据完整性来进行把关和控制,而且像有时候很难保证改变数据的地方仅仅有软件一个来源,可能有多个更改源,如果在数据库层有数据完整性约束,将会加强系统数据的完整性控制。

 

     上网查看了一些资料,转了下面的文章,提醒自己在进行系统设计时,不但要保证软件层面的业务完整性控制,在数据库层面上一样要加强数据完整性约束的设计。

 

文章如下:

 出处:http://www.enet.com.cn/article/2008/0421/A20080421238331.shtml

=================================================

 

数据库完整性就是数据库完整性约束设计

 数据库完整性(Database Integrity)是指数据库中数据的正确性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过DBMS或应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。通过DBMS实现的数据库完整性按照数据库设计步骤进行设计,而由应用软件实现的数据库完整性则纳入应用软件设计(本文主要讨论前者)。数据库完整性对于数据库应用系统非常关键,其作用主要体现在以下几个方面:

  1.数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据。

  2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率。同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。

  3.合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。比如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响数据装载的效率又能保证数据库的完整性。

  4.在应用软件的功能测试中,完善的数据库完整性有助于尽早发现应用软件的错误。

  数据库完整性约束可分为6类:列级静态约束、元组级静态约束、关系级静态约束、列级动态约束、元组级动态约束、关系级动态约束。动态约束通常由应用软件来实现。不同DBMS支持的数据库完整性基本相同,Oracle支持的基于DBMS的完整性约束如下表所示:

  数据库完整性设计示例

  一个好的数据库完整性设计首先需要在需求分析阶段确定要通过数据库完整性约束实现的业务规则,然后在充分了解特定DBMS提供的完整性控制机制的基础上,依据整个系统的体系结构和性能要求,遵照数据库设计方法和应用软件设计方法,合理选择每个业务规则的实现方式;最后,认真测试,排除隐含的约束冲突和性能问题。基于DBMS的数据库完整性设计大体分为以下几个阶段:

  一.需求分析阶段

  经过系统分析员、数据库分析员、用户的共同努力,确定系统模型中应该包含的对象,如人事及工资管理系统中的部门、员工、经理等,以及各种业务规则。

  在完成寻找业务规则的工作之后,确定要作为数据库完整性的业务规则,并对业务规则进行分类。其中作为数据库模式一部分的完整性设计按下面的过程进行。而由应用软件来实现的数据库完整性设计将按照软件工程的方法进行。

  二.概念结构设计阶段

  概念结构设计阶段是将依据需求分析的结果转换成一个独立于具体DBMS的概念模型,即实体关系图(ERD)。在概念结构设计阶段就要开始数据库完整性设计的实质阶段,因为此阶段的实体关系将在逻辑结构设计阶段转化为实体完整性约束和参照完整性约束,到逻辑结构设计阶段将完成设计的主要工作。

  三.逻辑结构设计阶段

  此阶段就是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化,包括对关系模型的规范化。此时,依据DBMS提供的完整性约束机制,对尚未加入逻辑结构中的完整性约束列表,逐条选择合适的方式加以实现。

  在逻辑结构设计阶段结束时,作为数据库模式一部分的完整性设计也就基本完成了。每种业务规则都可能有好几种实现方式,应该选择对数据库性能影响最小的一种,有时需通过实际测试来决定。

  数据库完整性设计原则

  在实施数据库完整性设计的时候,有一些基本的原则需要把握:

  1.根据数据库完整性约束的类型确定其实现的系统层次和方式,并提前考虑对系统性能的影响。一般情况下,静态约束应尽量包含在数据库模式中,而动态约束由应用程序实现。

  2.实体完整性约束、参照完整性约束是关系数据库最重要的完整性约束,在不影响系统关键性能的前提下需尽量应用。用一定的时间和空间来换取系统的易用性是值得的。

  3.要慎用目前主流DBMS都支持的触发器功能,一方面由于触发器的性能开销较大,另一方面,触发器的多级触发不好控制,容易发生错误,非用不可时,最好使用Before型语句级触发器。

  4.在需求分析阶段就必须制定完整性约束的命名规范,尽量使用有意义的英文单词、缩写词、表名、列名及下划线等组合,使其易于识别和记忆,如:CKC_EMP_REAL_INCOME_EMPLOYEE、PK_EMPLOYEE、CKT_EMPLOYEE。如果使用CASE工具,一般有缺省的规则,可在此基础上修改使用。

  5.要根据业务规则对数据库完整性进行细致的测试,以尽早排除隐含的完整性约束间的冲突和对性能的影响。

  6.要有专职的数据库设计小组,自始至终负责数据库的分析、设计、测试、实施及早期维护。数据库设计人员不仅负责基于DBMS的数据库完整性约束的设计实现,还要负责对应用软件实现的数据库完整性约束进行审核。

  7.应采用合适的CASE工具来降低数据库设计各阶段的工作量。好的CASE工具能够支持整个数据库的生命周期,这将使数据库设计人员的工作效率得到很大提高,同时也容易与用户沟通。

 

 

posted on 2008-07-29 11:20  旭日东生  阅读(453)  评论(0编辑  收藏  举报