数据库设计参考标准数据库设计参考标准[1]文档控制文档属性文档编号作者版本日期密级EDS06黄翠微V12011年6月16文档修订历史版本状态日期作者修订描述数据库设计参考标准[2]一、概述为明确公司项目中数据库逻辑设计及物理设计的内容和流程,特制定本规范,供数据库设计、开发及维护人员参考。数据库设计方法目前可分为四类:直观设计法、规范设计法、计算机辅助设计法和自动化设计法。新奥尔良法是目前公认的比较完整和权威的一种规范设计法。新奥尔良法将数据库设计分成需求分析(分析用户需求)、概念设计(信息分析和定义)、逻辑设计(设计实现)和物理设计(物理数据库设计)。目前,常用的规范设计方法大多起源于新奥尔良法,并在设计的每一阶段采用一些辅助方法来具体实现。以下是两种常用的规范设计方法:1.基于E-R模型的数据库设计方法。该方法是由P.P.S.chen于1976年提出的数据库设计方法,其基本思想是在需求分析的基础上,用E-R(实体—联系)图构造一个反映现实世界实体之间联系的企业模式,然后再将此企业模式转换成基于某一特定的DBMS的概念模式。2.基于3NF的数据库设计方法。该方法是由S·Atre提出的结构化设计方法,其基本思想是在需求分析的基础上,确定数据库模式中的全部属性和属性间的依赖关系,将它们组织在一个单一的关系模式中,然后再分析模式中不符合3NF的约束条件,将其进行投影分解,规范成若干个3NF关系模式的集合。其具体设计步骤分为五个阶段:(1)设计企业模式,利用规范化得到的3NF关系模式画出企业模式;(2)设计数据库的概念模式,把企业模式转换成DBMS所能接受的概念模式,并根据概念模式导出各个应用的外模式;(3)设计数据库的物理模式(存储模式);(4)对物理模式进行评价;(5)实现数据库。备注:数据库设计规范、数据编程规范、数据库物理设计规范中以Oracle数据库为例,其它结构的数据库类似。二、数据库设计流程数据库设计参考标准[3]以规范性设计为例,把数据库设计流程分为以下几个阶段。(一)需求分析阶段1.需求收集和分析,得到数据字典描述的数据需求和数据流图描述的处理需求。2.需求分析的重点:调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。3.需求分析的方法:调查组织机构情况、各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。4.常用的调查方法有:跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。5.分析和表达用户需求的方法:主要包括自顶向下和自底向上两类方法。采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。6.数据流图(DataFlowDiagram,DFD)表达了数据和处理过程的关系。系统中的数据则借助数据字典(DataDictionary,简称DD)来描述。(二)概念结构设计阶段概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。概念模型可以转换为计算机上某一DBMS支持的特定数据模型,其特点为:1.具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。2.应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。(三)逻辑设计阶段将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:1.一个实体型转换为一个关系模式,实体的属性就是关系的属性;2.一个多对多的联系转换为一个关系模式。数据模型的优化,确定数据依赖,消除冗余的联系,确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准。(四)物理设计阶段数据库设计参考标准[4]为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。(五)数据库实施阶段运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。(六)数据库运行维护阶段在数据库系统运行过程中必须不断地对其进行评价、调整与修改。内容包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的RationalRose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的OracleDesigner等。三、数据库设计规范(一)数据库规范化的总体要求1.数据表中避免可空列虽然表中允许空列,但空字段为一种特殊的数据类型,数据库将对其进行特殊的处理,为此将增加数据库处理记录的复杂性,且当表中存在较多空字段时,在同等条件下,数据库处理的性能将降低许多。因此,在数据库表设计时应尽量避免。若确实需要,可通过一些折中方式处理,让其对数据库性能的影响降低至最少。在此推荐两个方式。A.设置默认值。默认值设置原则为业务启动后不可能达到的值,或者为原始状态的对应值。如无法从数值上区分是否为原始状态则不推荐设置默认值。以数值型字段为例,假设其用于存放采集终端所获取的子舱位订座,由于订座数默认至少为大于等于0的数值,为此可设置默认值为-1。另一个例子,字符型的航班状态,默认情况下航班为正常执行的正班,当因为天气、机械或其它调控等原因状态才发生改变,此时可设置默认值为“正班”。日期型数据可默认为1900-01-01,在应用层面显示需要根据实际情况进行转换。B.第二种方式是建立副表。这是当一张表中允许为空的列较多时,如接近表全部列数的三分之一,且这些列数据在大多情况下均为空,此时建议另外建立一张副表,以保存这些列;主表与副表之间根据关键字关联,这样将数据分别存储于两个独立的表中使得主表设计更为简单,既保证了数据库性能,又能满足存储空值的应用需要。如果字段默认值设置导致部分业务需求无法满足或开发代价大量增加,此时不建议设置,保留可空。如数值型字段,如在该字段上需要与其他字段进行组合运算、或基于该字段进行统计汇总时,空值具有不可替代的重要作用。数据库设计参考标准[5]2.数据表中不应存在重复数据值或列如客户数据与客户经理数据存储问题,如将二者放在同一张表中,为解决多个客户经理问题,表中必须设置首选客户经理、备选客户经理相关信息。在客户经理离职后,必须修改表中所有相关数据,造成很多不便且不利于追踪。为此,在数据库设计的时候要尽量避免现象发生,建议改变策略,将客户信息存入一张表,客户经理信息存入一张表,而客户与客户经理之间的联系关系存入第三张表。当联系关系发生变化时,仅需设置过期日期或状态即可。3.数据表主键设置为无意义数值序列号在进行数据库表设计的时候,采用一个无意义的、数值型的PKID对行记录进行唯一的标识,而不是通过航班号、航段、姓名、工号等具有业务意义的字段区分记录。由于人工管理下很难保证PKID值的不重复,为此建议每个表对应的PKID列的值由数据库自动管理。建议在原有业务上需要唯一区分的字段或字段组合上,建立唯一性索引。以存储10年的航班计划表为例,业务上唯一区分一个航班的通常包含三个字段,航班号、航段、起飞日期,先前的做法是在这三个上建立复合主键。在此推荐用一个Number(8)的PKID列作为主键,原因是以每天600个航班、一年365天,10年总计219万个航班,考虑到业务的扩展速度为10年内翻三番,657万,按理可设置7位,考虑到其它可能损耗的ID值,多设置一位,故为Number(8);在航班数据的增删改过程中,通常需要判断是否存在重复数据,是则为修改操作,否则为插入操作,此时仅以PKID列无法区分,为此建议在航班号、航段、起飞日期上建立唯一性索引,由数据库后台执行一致性校验。利用Sequence生成的PKID若需要用于其他数据库使用,需要在应用层面记录,以防止数据库出现问题时恢复后sequence不匹配问题。4.数据库对象前缀名统一一个应用系统对应的数据库表、视图、过程等对象,通常均高达千计,为对其进行规范管理与快速定位,要求遵循数据对象命名规范。具体命名规范详见下文第(二)点。5.数据表上避免设置外键外键的作用在于两方面,一是保证主从表数据一致性,这是数据库提供的、用于保证数据质量的强制性手段,二是定义主表数据删除时从表数据的级联删除方式;二者是外键的优势所在,减少了开发人员不分工作量。但是,外键的存在同样带来困扰。一是从应用系统的三层架构上考虑,如何设置外键关系到业务逻辑,这是将业务逻辑层部分功能后移至数据库层,导致各层职责不清的紧耦合现象,而且当业务逻辑随着需求发展发生变化将引起数据库层面与应用层面的双重修改;二是在开发过程中,开发人员不得不了解数据库物理设计细节,在项目协作分工上造成不便;三是从后续主数据、各业务方向公共数据建设上,为数据库管理员在执行数据表从“公有区”移入移出操作增加难度。为此,建议不设置外键;如果设置了外键,则仅保留数据一致性校验功能,不建议设置级联删除的选项。此时要求开发人员通过培养一种良好的编程习惯,从程序逻辑上实现主表、从表数据的增、删、改、查的规范操作。具体可参考如下说明。A.从表数据增加操作首先从主表上查询是否存在所需数据,是则可进行增加操作;否则需先数据库设计参考标准[6]增加主表数据后才可进行从表数据增加操作。B.从表数据删除操作直接删除从表数据。当主表数据未被任何从表引用时,根据实际业务需要判断是否级联删除主表数据。C.从表数据修改操作从表数据修改后的内容必须是主表内存在的数据,否则需先增加主表数据后才可进行数据修改操作。D.主表数据增加操作直接数据数据,与从表数据无关。E.主表数据删除操作删除之前判断是否存在引用的从表数据,是则根据业务规则决定是否继续,并根据业务规则判断从表引用数据的处理方式为对应数据项置空或删除从表数据记录。如果未存在引用的从表数据,则可直接删除。注意保持事务的原子性,即主、从表数据同时提交或同时回滚。F.主表数据修改操作判断是否存在引用的从表数据,是则首先修改从表数据,然后进行主表数据修改。注意保持事务的原子性,即主、从表数据同时提交或同时回滚。为了在应用程序上能顺利完成上述六项操作,开发人员除了严格记录主从表调用关系外,还必须在程序上实现数据一致性检查功能,以及时发现可能的数据不一致现象。如果应用程序未能实现这种一致性检查工作,则需将检查规则提交予DBA,由DBA在后台进行定期检查。6.避免在数据库上编写存储过程、代码包、触发器通常存储过程、代码包、触发器包含很多业务逻辑,违背了三层架构设计的松耦合原则。(二)数据对象命名规范1.命名规范总要求所有数据对象命名必须遵循如下规范要求。(1)通常采用“望文知义”的形式命名,部分对安全具有特殊要求的可以编号命名。(2)命名格式是,以字母打头,包含具有特定含义的一个或多个英文单词,数据库设计参考标准[7]单词之间以下划线“_”间隔,长度不超过30个字符;(3)大小写不敏感。(4)禁止使用关键字命名。(5)不同数据对象命名的前缀要求如下表所示。编号数据对象前缀要求1非临时数据表“4位模块名_表名”。2临时数据表“TMP_表名”3分区表“PT_”4主键“PK_表名”5索引“IDX_”6函数索引“FIDX_”7视图“VW_”8实体化视图“MV_”9存储过程“SP_”10触发器“TRG_”11函数“SF_”12数据包“PKG_”13序列“SEQ_”14数据类型“TYP_”15后台任务“JB_”2.表命名规范对于同一应用,在命名上区分不同功能模块的所使用的表。假设一个系统包含三个模块,基础维护、查询、系统管理,则基础维护表名前缀为“TB_BASE_”,查询模块表名前缀为