数据库设计规范
更新时间: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升级为新版本。
正在阅读:
数据库设计规范08-07
河涌改道施工方案09-27
2018年12月大学英语六级真题解析(仔细阅读卷二)11-12
《交通工程设施试验检测》试题库05-12
湖北省宜昌市高一上学期数学期末考试试卷04-08
房地产项目可行性研究开题报告01-31
2013年度钦州市考试录用公务员入闱体检名单 - 图文06-30
基于单片机的万年历设计05-19
质量员(土建方向)通用与基础知识 试卷01-02
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 规范
- 数据库
- 设计
- 2012年全国高考理宗卷物理部分试题及答案(真正的word版)
- 网络课程中华诗词之美 叶嘉莹
- 初一上学期班主任工作计划
- 《药品经营许可证管理办法》
- 静压机压力对照表
- 第八章 生物群落的分类与排序
- 新农合工作汇报材料
- 酒店软装设计要点包括哪些
- 生于忧患死于安乐试题与答案
- Unit 6 词组短语汇总真
- STM32F107系列单片机USB通信的用法解析
- 大桥小学十二五课题《课堂高效训练的研究》开题报告
- 2019版数学(人教b版)选修2-3课时训练: 03排列及排列数公式 含解析
- 人工髋关节置换术后的康复
- 企业集团财务管理考试答案
- 高级英语1 Unit5Conservatives and Liberals翻译
- 出口骗税问题的剖析及防范
- 柬埔寨、中国与UNDP合作推动柬木薯产业发展
- 观《海洋天堂》有感
- 新型职业农民创业发展面临的问题及对策建议