现在的位置: 首页 > 综合 > 正文

数据模型设计思考与实践

2013年10月01日 ⁄ 综合 ⁄ 共 2606字 ⁄ 字号 评论关闭

数据模型设计思考与实践

李俊杰

概述

在当前的主要软件应用项目中,数据库在项目中的作用是极其重要的,因此作为项目基础的数据模型的设计就显得非常重要,不仅事关数据的存储和使用,而且反映了对需求的理解和未来变化需求的适应性和扩展性,数据模型设计的好坏还影响存取效率和性能,同时也决定了项目的实现机制和扩展性,特别是对于分布式系统而言,数据的同步及网络通信的设计也非常重要。

数据的应用特性和分库存储设计

系统中的数据有着不同的应用特性,有的是静态数据,如系统运行配置信息,在系统运行上线前必须初始化的,还有系统业务配置信息,也是在系统运行之初必须设置的,这些数据可能在系统下线都不会变化。有的是半静态的数据,很少作更新处理,如一些产品定义数据只有在发布新的产品才会有所变化,其他时间一直处在休眠状态。有的则是工作数据,在一个业务处理过程中会频繁地进行更新,始终处于活跃期,会不断地被访问更新。

传统的数据库设计过程中,所有的数据放在一个数据库中,好处是在数据存取时可最大限度地利用DBMS本身提供的功能来提高数据的存取效率。但从数据备份和数据管理的角度来看,就存在着一定的缺陷和问题。

按照数据的使用特性进行存储管理根据其使用特性在实际应用中是有现实意义的,原因是:根据不同的数据应用特性进行分库,可以有针对性地对不同的库制定备份策略,在大型项目中数据量非常大,从数据安全和数据存储管理方面考虑备份策略就非常有意义,另外分库存储设计提高了数据的访问效率,因为可以针对业务数据的存取进行优化,对业务数据的访问制定负载平衡策略,提高系统的访问量和缩短系统的相应时间,当然提高系统的性能是一项复杂的系统工程,需要多方面的协作和优化,分库存储设计仅仅是其中之一。

文本型数据的代码化和格式化

在系统的需求分析阶段,有许多东西都是以文字描述的,设计人员要对这些内容庞杂的信息进行梳理和抽象,如何组织成为计算机能够识别,且为实际系统应用中显示操作人员所熟知的专业术语和行业术语,答案就是文本数据的代码化和格式化。如单位性质(经济分类):00  其它企业单位,01       国有,02       集体,03       私营,04       个体。这样,就可以在前台显示文本,在数据库相关表中存储代码,这样有利于优化存储,有利于需求的变更,如有些文本变化,只需更新相应的代码表,并且针对统计分析需求就会非常容易。

还有代码的版本的设计,如疾病代码,不同时期采用不同版本的代码,不同的行业采用不同版本,只须设计疾病版本表,疾病表(其中疾病版本号是外键)。

复杂的文本代码化,如职业代码,就可以分为职业大类,职业子类(其中职业大类代码是外键),职业细类代码(其中职业子类代码是外键),从表的命名和外键的分布,显然可以理解三个表的关系,另外同样职业细类的代码是“职业大类代码”+“职业代码子类”+“职业代码细类序号”,如:

            大类               子类              细类        代码       说明

00                  00                00           000000     无职业

00                  00                01           000001     离退休

 

还有一种情况,即该类代码只在一个表的一个字段中使用,不据通用性,通常的设计是在Power Designer中列属性的标准选项(standard checks 中设置相关代码,如理赔给付类型代码:1 合同给付 2   比例给付, 3  协议给付 5  责任给付, 9  拒赔给付。

视图的设计与使用          

视图是一种虚表,它依赖数据源的实表而存在,视图的主要用途是针对数据安全方面考虑的,但在实际设计中,可以把常用的联合查询以视图的形式设计在数据库中,可以避免编程人员写过多的数据库sql语句,并且可以进行复杂逻辑处理、提高运算速度和节省存储空间,同时也可以起到信息隐藏的目的,即你后台的数据库表发生变化,只要视图显示的字段不变,前台调用视图就不用改变。特别是对你的数据库不太了解的人员,其意义就更大了。

表字段的灵活运用

字段的借用,例如表中有两个字段,一个是code_type,一个是code。这样根据code_type的不同,则code字段中存储不同的代码。

表之间的虚依赖关系。例如一个表和依赖于两个以上的表中的一个,那么就有了这样的情况。类似于字段的借用,code_type的值不同,则code存储的值是所依赖的不同的表的外键。

面向对象设计思想在数据模型设计中的作用

特别是对于应用系统,其需求往往是笼统和复杂的,首先分析需求不变和变化的部分,进而分析数据的相互关系,从顶到下,划分其逻辑联系,把相关的内容抽象成若干相互作用的对象,而每一个对象都有若干属性,则每一属性就可作为一个表所对应的字段。还要澄清一个问题,数据模型(表)和对象并不是一一对应的关系,数据模型主要考虑数据存储和数据之间的关系。而对象是数据和行为的结合体。表之间的关联主要是主表和子表的关系,主键和外键的关系,但在对象设计时,有些表现为继承关系,但大多数表现为聚合关系。在数据模型的设计中,常常使用中间表把多对多关系变成两个一对多的关系。但在对象设计时就不会把中间表作为一个对象。

表和表之间的依赖关系,在对象设计中并不完全表示为继承关系,而更多地表示为例如类型表(type),字段有类型编码(type_code),类型名称(type_name), 类型描述(type_dscr);其子表如合同,在设计时把合同设计为一个类,而类型只是它的一个属性,即合成关系。另外一种情况,合同表中设计一个类型字段,然后根据该类型字段,其更详尽的属性放到相关的子表中,类型不同,则需要不同的子表来描述其特性。这时就类似于继承关系,但在面向对象设计中就会把合同设计成类,包括类型类接口属性,类型类接口属性的实现类则表示为合同子表的内容。

总之,数据模型的设计要综合考虑诸多因素,例如提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化等等,以上只是本人在数据模型设计中的体会和经验,仅供参考。

    

     努力,在于我热爱我的事业,与中国的软件一起走向成熟,走向世界。

 

联系作者:lijj_72@hotmail.com

 

抱歉!评论已关闭.