数据库设计规范

更新时间:2023-08-07 10:59:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

数据库设计规范

目的

为规范数据库管理,统一数据库设计, 特制定本规范。

本规范的主要目的是希望规范数据库设计,尽量提前避免由于数据库设计不当而产生的麻烦;同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好的保证。

数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。

数据库物理模型设计意为用PowerDesigner 或者其他工具生成数据表结构模型以及其它各种数据库对象。生成各种数据库对象必须按照该规范的规定进行创建,以便统一开发和维护。

工具:PowerDesigner 15.1

设计概要:

一个系统对应一个Model,每个Model下分成多个Physical Diagram,每个Physical Diagram代表每个子系统的设计模型。

命名规范

Model以中文名字命名,如:危废综合监管云平台V0.1

其中V 是 version 的首写大写字母,0.1标明该模型是0.1版本,若以后做修改,将由DBA进行升级,该版本号将随着项目的进展而变化升级,如:危废综合监管云平台V2.5。

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

数据表相关设计要求

通用规范

使用英文:要用简单明了的英文单词,不要用拼音,特别是拼音缩写。主要目的很明确,让人容易明白这个对象是做什么用的;

一律大写,特别是表名:有些数据库,表的命名乃至其他数据对象的命名是大小写敏感的,为了避免不必要的麻烦,并且尊重通常的习惯,最好一律用大写; 数据库对象命名规范

表的命名

表名的前缀:前缀_表名。为表的名称增加一个或者多个前缀,前缀名不要太长,可以用缩写,最好用下划线与后面的单词分开;其目的有这样几个: 为了不与其他项目或者其他系统、子系统的表重名;

表示某种从属关系,比如表明是属于某个子系统、某个模块或者某个项目等等。表示这种从属关系的一个主要目的是,从表名能够大概知道如何去找相关的人员。比如以子系统为前缀的,当看到这个表的时候,就知道有问题可以去找该子系统的开发和使用人员;

表名称必须用英文大写字母,且具有代表含义的单词(字母)构成;

表名称命名必须遵循以下规则:

T_XXX_YYY T_+每个单词(每个字母大写) ,表名只有以下下两种情况

T_ 代表生产系统。

第一种情况;如:(单据审批)T_BILL_EXMINE中。因为表名可能有1-2个单词构成,所以XXX表示T_后的第一个的单词,YYY T_后的第二个的单词。

第二种情况;如:(申请计划)T_PLAN中, 同上。

表的备注内容,必须写清楚。

字段名称命名必须遵循:

a) Name 字段汉语名称;

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

b) Code 字段英文名称, 必须取该字段的英文单词,若有多个单词必须

有下滑线相隔。

c) 根据自己的情况命名字段名,但是必须是有意义且科学的单词,必须控制

在1-2个之内,每个单词的每个字母必须大写。 如:(审批顺序)EXMINE_ORDER

d) Table Property 属性中 必须有字段的注释(Comment)属性详细描述

下面是一些公用的字段命名

a) 姓名 NAMES

b) 编号 NUMBERS

c) 时间 TIMES

d) 日期 DATES

e) 如果一张表中有一个以上的;如: XXX_TIMES

外键名称命名规则,有一下两种情况

第二种情况,是直接关联的(在同一个系统中);

如:ID_P_PLAN

其中ID表示该字段为外键;P_PLAN为关联表的表

名;并用下划线将它们分隔标注 , 类型为VARCHAR2(32)

第二种情况,是间接关联的(不在同一个系统中) ;

如:ID_XXX

其中的ID表示该字段为外键;XXX为关联的另外一个系统中的表名,(本

系统中联系了人力资源这个系统), 类型为VARCHAR2(32)

每张表必须有一个名为ID的键作为主键,类型为 VARCHAR2(32),这里的ID统一为自增;

一定要标注每个字段是否为空;

下面是一些难确定的字段的类型和范围要求

数量,个数等为 NUMBER

价格,金额等为 NUMBER(10,6)

备注,意见,内容等为VARCHAR2(500)

附件等为 BLOB

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

存储过程相关设计要求

存储过程必须有以下注释说明:

/******************************************

DESCRIPTION:(描述此存储过程的功能或创建存储过程的原因)

PARAMETER:(存储过程的输入输出参数说明)

CREATE_DATE:(存储过程的创建日期/修改日期)

CREATE_AUTHOR:(创建/修改存储过程的作者)

******************************************/

函数相关设计要求

/******************************************

DESCRIPTION:(描述此函数的功能或创建函数的原因)

PARAMETER:(函数的输入输出参数说明)

CREATE_DATE:(函数的创建日期/修改日期)

CREATE_AUTHOR:(创建/修改函数的作者)

******************************************/

触发器相关设计要求

/******************************************

DESCRIPTION:(描述此触发器的功能或创建触发器的原因)

PARAMETER:(触发器的输入参数说明)

CREATE_DATE:(触发器的创建日期/修改日期)

CREATE_AUTHOR:(创建/修改触发器的作者)

******************************************/

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

视图相关设计要求

/******************************************

DESCRIPTION:(描述此视图的功能或创建视图的原因)

PARAMETER:(视图的输入参数说明)

CREATE_DATE:(视图的创建日期/修改日期)

CREATE_AUTHOR:(创建/修改视图的作者)

******************************************/

数据库对象设计原则

表的设计

主、外键

每个表,都必须要有主键。主键是每行数据的唯一标识,保证主键不可随意更新修改,在不知道是否需要主键的时候,请加上主键,它会为你的程序以及将来查找数据中的错误等等,提供一定的帮助;

一个表的某列与另一表有关联关系的时候,如果加得上的话,请加上外键约束。外键是很重要的,所以要特别强调:

适量建外键。为了保证外键的一致性,数据库会增加一些开销,如果有确凿的并且是对性能影响到无法满足用户需求的证据,可以考虑不建外键。否则,还是应该建外键;

不要以数据操作不方便为理由而不建外键。是的,加上外键以后,一些数据操作变得有些麻烦,但是这正是对数据一致性的保护。正是因为这种保护很有效,所以最好不要拒绝它;

以缺省的方式建立外键(即用delete restrict方式),以达到保护数据一致性的目的;外键在保护数据一致方面非常有效。如果不建外键,数据库中容易出现垃圾数据,并且无人知晓。当数据量很大的时候,查找这些垃圾数据也是相当困

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

难的。而应用程序在设计时,往往没有考虑或者也无法照顾到垃圾数据。因此垃圾数据很可能造成应用程序工作不正常,并且表现出来的现象会很奇怪,让人摸不着头脑。

列的设计

字段的宽度要在一定时间内足够用,但也不要过宽,占用过多的存储空间,对于长度不确定的列,采用可变长度的数据类型如 varchar类型;

字段的类型及宽度在设计以及后面进行开发时,往往要与应用的设计、开发人员商讨,以得到双方认可的类型及宽度;

除非必要,否则尽量不加冗余列。所谓冗余列,是指能通过其他列计算出来的列,或者是与某列表达同一含义的列,或者是从其他表复制过来的列等等。冗余列需要应用程序来维护一致性,相关列的值改变的时候,冗余列也需要随之修改,而这一规则未必所有人都知道,就有可能因此发生不一致的情况。如果是应用的特殊需要,或者是为了优化某些逻辑很复杂的查询等操作,可以加冗余列;

除非必要,否则尽量不使用

LONG, TEXT, BLOB, CLOB, NCLOB, LONG, LONG RAW这一类的数据类型,而是使用其他可以替代的数据类型;优先使用varchar2类型替代CHAR类型,除非列宽有严格的要求而且得到应用严格支持;

记录数

单表的记录数一般控制在两千万条 (参考值,各应用可以根据实际情况进行适量调整) 以内;

记录数在两千万和两亿条之间的表一定要采用分区技术,并根据应用的使用情况创建合适的分区标准,单个分区内的记录数一般控制在两千万条(参考值,各应用可以根据实际情况进行适量调整)以内,同时表的索引使用对应的分区索引;

记录数超过两亿条的表一定要考虑信息生命周期,必须考虑历史数据的剥离,并在应用设计中完成对历史数据的相应处理功能(历史数据的剥离规则须经业务使用部门的确认);

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

索引的设计

索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。但大量的DML操作会增加系统对索引的维护成本,对性能会有一定影响,对于插入相当频繁的表要慎重建索引,索引也会占相当的存储空间,所以要根据硬件环境和应用需求在空间和时间上达到最好的平衡点,主要原则:

适当利用索引提高查询速度:当数据量比较大,了解应用程序的会有哪些查询,依据这些查询需求建相应的索引;最好亲自试验一下,模拟一下生产环境的数据量,在此数据量下,比较一下建索引前后的查询速度;索引对性能会有一定影响,对于DML频繁列的索引要定期维护(重建)。但是,索引的结构对于索引的更新(比如在插入数据的时候)是有一定优化的,所以不要在没有试验以前过分夸大它对性能的影响。最终还是以试验为准;

要建实际用不上的索引,与上条相关,如果建的索引并不提高任何一应用中的查询速度,则要把它删除;有些数据库有相关工具可以发现实际未被使用的索引,可以利用一下;

索引类型的选择:要根据数据分布及应用来决定如何建立索引,一般的高基数数据列(高基数数据列是指该列有很多不同的值)时 ,建立BTree索引(一般数据库索引的缺省类型);当低基数数据列(该列有大量相同的值)时,可以考虑建立位图索引(如果所选数据库支持的话),但位图索引是压缩类型索引,所以DML(增、删、改)的代价更高,要综合考虑;

索引列的选择:如果检索条件有可能包含多列,创建联合主键或者联合索引,把最常用于检索条件的列放在最前端,其他的列排在后面;不要索引使用频繁的小型表,假如这些小表有频繁的DML就更不要建立索引,维护索引的代价远远高于扫描表的代价;

主键索引在建立的时候一定要明确的指定名称,不能让系统默认建立主键索引(可能有些数据库无法指定主键名,则例外);

外键必须需建索引。当有一定数据量,并且经常以外键所在列为关联,进行关联查询时,需要建索引(可能有些数据库自动为外键建索引,则例外);

当有联合主键或者联合索引时,注意不要建重复的索引。举例说明:

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

表EMPLOYEES,它的主键是建立在列DEPARTID和EMPLOYEEID上的联合主键,并且创建主键的语句中DEPARTID在前,EMPLOYEEID在后。在这样一个表里,通常就没有必要再为DEPARTID建一个索引了;联合索引的情况也一样;

更复杂的情况,比如表EMPLOYEES,有一个索引建立在列CORPID, DEPARTID, EMPLOYEEID三列上,在创建语句中也依据上述顺序,就没有必要再为CORPID建立索引;也没有必要再建立以CORPID在前,DEPARTID在后的联合索引;如果EMPLOYEEID需要索引,那么为EMPLOYEEID建立一个索引是不与上面的索引重复的;DEPARTID列也类似;

控制一个表的索引数量,尽量使得一个表的索引数量小于五个;

视图的设计

在不太清楚视图用法的情况下,尽量不建。因为一旦建了,就有被滥用的危险;

如果需要建视图,只要是打算长期使用的,请写入数据库设计中。明确它的用途、目的;

建立视图时要明确写出所有要选择出的列名而不要以SELECT *来代替,可以使结构清晰可读性增强,也不会增加它对表的所有字段的依赖,而表是很可能修改的,特别是增加字段。就很有可能导致使用该视图的应用程序出错; 存储过程、函数、触发器的设计

触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,一定要经过测试再应用在生产系统中,而且必须集中对它文档化。

请把程序包、存储过程、函数、触发器,与应用程序一同加入CVS中,进行版本控制。因为此四者包含了代码,应用程序对他们的依赖程度比对表、视图的依赖程度更高;

适量但尽量少使用存储过程、函数、触发器。使用存储过程、函数、触发器的影响:

(1) 可以减少数据库与客户端的交互,提高性能;

在javaweb项目中,规范数据库的整体设计,便于项目的开发维护

(2) 有的数据库还对他们进行了某种程度的编译,在执行的时候,不用再对其中的SQL等语句进行解析,从而提高速度;

(3) 如果有多个应用,使用了不同的开发语言,当有某些关键的或者复杂逻辑希望共享,则可以考虑使用存储过程或者函数。因为存储过程等在数据库一级是共享的; (4) 增强了应用对数据库的依赖,如果打算将来移植数据库的话,使用得越多,则移植的困难越大;数据库中的业务逻辑越多(存储过程等),应用以及存储过程等的维护难度也会增大;

(5) 通常存储过程等没有面向对象的特性,不容易设计出易于扩展的结构。当存储过程比较复杂时,或者它们相互间的调用关系比较复杂时,可能难于维护;

DBA项目数据管理细节

因项目开发需要,数据库分为测试数据库和正式数据库,测试数据库为程序员开发用; 无论何种原因数据库变动后必须将数据库变动脚本提交DBA,由DBA提交正式库,并修改项目数据库设计PDM,PDM升级为新版本。

本文来源:https://www.bwwdw.com/article/eh9j.html

Top