ORACLE设计规范
- 格式:doc
- 大小:198.50 KB
- 文档页数:38
1.Oracle数据库命名规范数据库命名规范总体上以“汉语拼音和常见英语单词相结合”的方式,汉语拼音即是采用每一个汉字拼音的第一个字母的方式。
英语单词采用整个英文单词或可以识别的英文单词缩写的方式。
数据库字段命名原则总统上同数据库命名,采用“汉语拼音和常见英语单词相结合”方式命名。
这里单独出来主要是强调本系统字段命名需要额外遵循如下规则:1)字段名称的唯一性:即同一含义的字段在整个系统范围内中必须有相同的字段名。
不能有类似一个表中的备注字段用“BeiZhu”,另一表中的备注却用“Remark”、“Desc”、“XXRemark”等。
2)字段含义唯一性:即系统同一字段名称必须有同一含义。
不能有类似“Name”在一个表中表单位名称,在另外一个表中表项目名称,这种情况需要加前缀区分。
3)所有字段名不能以SM开头,目的是避免与SuperMap保留字段前缀混淆4)空间表中:字段顺序以空间信息字段在前,属性信息字段在后原则。
5)属性表中:字段顺序以主次顺序设计,用于空间定位的字段放在最后原则。
1.1表属性规范1)表名前缀为Tbl_。
数据表名称必须以有特征含义的单词或缩写组成,中间可以用“_”分割,例如:tbl_pstn_detail。
表名称不能用双引号包含。
2)表分区名前缀为p。
分区名必须有特定含义的单词或字串。
例如:tbl_pstn_detail的分区p2004100101表示该分区存储2004100101时段的数据。
3)字段名字段名称必须用字母开头,采用有特征含义的单词或缩写,不能用双引号包含。
4)主键名前缀为PK_。
主键名称应是前缀+表名+构成的字段名。
如果复合主键的构成字段较多,则只包含第一个字段。
表名可以去掉前缀。
5)外键名前缀为FK_。
外键名称应是前缀+外键表名+主键表名+外键表构成的字段名。
表名可以去掉前缀。
1.2索引1)普通索引前缀为IDX_。
索引名称应是前缀+表名+构成的字段名。
如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。
Oracle数据库1 数据对象的命名规范1.1 通用规范1.1.1 使用英文:要用简单明了的英文单词,不要用拼音,特别是拼音缩写。
主要目的很明确,让人容易明白这个对象是做什么用的;1.1.2 一律大写,特别是表名:有些数据库,表的命名乃至其他数据对象的命名是大小写敏感的,为了避免不必要的麻烦,并且尊重通常的习惯,最好一律用大写;1.2 数据库对象命名规范1.2.1 表的命名1.2.1.1 表名的前缀:前缀_表名_T。
为表的名称增加一个或者多个前缀,前缀名不要太长,可以用缩写,最好用下划线与后面的单词分开;其目的有这样几个:1.2.1.1.1 为了不与其他项目或者其他系统、子系统的表重名;1.2.1.1.2 表示某种从属关系,比如表明是属于某个子系统、某个模块或者某个项目等等。
表示这种从属关系的一个主要目的是,从表名能够大概知道如何去找相关的人员。
比如以子系统为前缀的,当看到这个表的时候,就知道有问题可以去找该子系统的开发和使用人员;1.2.2 视图命名:相关表名_V(或者根据需要另取名字);1.2.3 程序包命名:程序包名_PKG(用英文表达程序包意义);1.2.4 存储过程命名:存储过程名_PRO(用英文表达存储过程意义);1.2.5 函数命名:函数名称_FUN(用英文表达函数作用);1.2.6 触发器命名:触发器名称_TRI(用英文表达触发器作用);1.2.7 索引命名:表名_字段名_IDX(如果存在多字段索引,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail 上建立联合索引,命名为表名_cus_cut_cur_IDX,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如在 custid, custom,custname上建立联合索引,就命名为表_tid_tom_tna_IDX;1.2.8 唯一索引命名:表名_字段名_UNI(如果存在多字段唯一索引,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail上建立唯一索引,命名为表名_ cus_cut_cur_UNI,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如:在 custid, custom,custname上建立唯一索引,命名:表_tid_tom_tna_UNI;1.2.9 主键命名:表名_字段名_PK(如果存在多字段主键,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail上建立主键,命名为表名_cus_cut_cur_PK,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如在 custid, custom,custname上建立主键,命名:表_tid_tom_tna_PK;1.2.10 外键命名:表名_主表名_字段名_FK;1.2.11 Sequence命名:表名_列名_SEQ(或者根据需要另取名字);1.2.12 Synonym命名:与对应的数据库对象同名;1.2.12 JAVA命名:遵守公司相应的JAVA命名规范;2 SQL的设计和使用2.1 Sql 书写规范2.1.1 尽量不要写复杂的SQL:过于复杂的S QL可以用存储过程或函数来代替,效率更高;甚至如果能保证不造成瓶颈的话,把条SQL拆成多条也是可以的。
Oracle数据库规划设计和运行维护方案(V1。
0)目录1。
前言 (6)1。
1. 编写目的 (6)1。
2。
方案说明 (6)1.3. 预期读者 (7)2。
数据库部署模式 (7)2.1. 单机模式 (7)2.2. 双机热备模式(HA模式) (8)2.3。
集群模式(RAC) (9)2。
4. 主从模式(DataGuard) (10)2.5。
混合模式(DataGrard+RAC) (10)2。
6。
数据库运行模式选择 (11)3。
系统特点和数据库类型 (11)3。
1。
业务系统的特点 (11)3。
1.1。
OLTP特点 (12)3.1.2。
OLAP特点 (13)3。
2。
数据库的规模 (13)3.3。
数据库版本建议 (13)4. 数据库运行环境规划 (14)4.1。
主机规划 (14)4。
2. 网络规划 (15)4.3. 存储规划 (17)5。
数据库安装部署规划 (19)5.1。
软件安装路径 (19)5。
2. 表空间设计 (19)5.2.1. 业务数据量估算 (19)5。
2。
2。
表空间使用规则 (21)5.2.3。
表空间的概念和分配原则 (25)5。
2.4。
表空间的参数配置 (26)5.2。
5. Undo/temp表空间的估算 (30)5.2。
6. 表的参数设置 (30)5.2。
7. 索引的使用原则 (31)5。
3. 文件设计 (32)5.3。
1. RAC配置文件 (32)5.3。
2. 参数文件 (33)5。
3。
3. 控制文件 (34)5。
3.4。
重做日志文件 (35)6。
数据库应用规划 (37)6。
1。
数据库用户设计 (37)6。
1。
1。
用户权限规划 (37)6.1.2。
用户安全实现 (39)6。
1。
3. 用户类型及角色命名规范 (41)6.2. 数据库分区 (44)6.2。
1. 数据库分区介绍 (44)6。
2.3. 物理分割 (45)6。
2。
4. 数据分区的优点 (45)6.2.5. 数据分区的不足 (45)6.2。
oracle数据库设计课程设计一、课程目标知识目标:1. 理解Oracle数据库的基本概念,掌握数据库设计的基本原理;2. 学会使用SQL语言进行数据库的基本操作,如创建表、查询数据、更新数据等;3. 掌握数据库设计规范,能够设计出结构合理、性能优良的数据库表结构;4. 了解数据库的安全性和一致性约束,能够为数据库设置合理的约束条件。
技能目标:1. 能够运用所学知识独立完成小型信息系统的数据库设计;2. 能够熟练运用SQL语言进行数据库的操作,解决实际问题;3. 能够运用数据库设计原则对现有数据库进行优化,提高数据库性能;4. 能够分析实际业务需求,撰写数据库设计文档,为软件开发提供支持。
情感态度价值观目标:1. 培养学生对数据库技术的兴趣,激发学习积极性,提高自主学习能力;2. 培养学生具备良好的团队合作精神,能够在团队项目中发挥积极作用;3. 培养学生严谨、细致的学习态度,对待数据库设计和操作能够认真负责;4. 通过数据库技术在实际案例中的应用,使学生认识到信息技术对社会发展的积极作用,增强社会责任感。
二、教学内容1. Oracle数据库基础知识- 数据库概念、发展历史及Oracle数据库特点- 数据库体系结构、数据库存储结构- SQL*Plus工具的使用2. SQL语言基础- 数据定义语言(DDL):创建、修改、删除表- 数据操纵语言(DML):插入、查询、更新、删除数据- 数据控制语言(DCL):权限管理、事务控制3. 数据库设计原理- 实体关系模型(ER模型)及其转换- 数据库设计范式:1NF、2NF、3NF、BCNF- 数据完整性、约束条件设置4. Oracle数据库高级应用- 索引、分区、视图、序列的应用- 存储过程、函数、触发器的创建与使用- 数据库性能优化、备份与恢复5. 实践项目- 设计一个小型信息系统的数据库,包括表结构设计、数据操作、完整性约束设置等- 对数据库进行性能优化,分析并解决性能瓶颈- 撰写数据库设计文档,进行项目展示与交流教学内容按照以上五个方面进行组织,确保学生能够系统地掌握Oracle数据库的设计与应用。
竭诚为您提供优质文档/双击可除oracle,外键命名规范篇一:数据库(oracle)命名规范命名规范(oracle数据库)1表命名命名最好望文生义,避免使用数据库关键词命名一律为大写字母(不要大下写混合)英文单词单数命名.例:FactoRy 英文单词缩写命名.例:dept英文单词之间用下划线连结,且每个单词皆为单数.例:task_Result用来存储历史资料,命名以histoRy结尾.例:task_his用来存储日志资料,命名以log结尾.例:task_log用来存储类别资料,命名以type结尾.例:task_type2表字段命名最好望文生义,避免使用数据库关键词英文单词单数命名.例:mail英文单词缩写命名.例:dept_id英文单词之间用下划线连结,且每个单词皆为单数.例:useR_name字段用来存储流水号,命名以id结尾.例:task_id字段用来存储代码,命名以no结尾.例:task_no字段用来存储类别,命名以type结尾.例:station_type字段用来存储名称,命名以name 结尾.例:enduseR_name字段用来存储描述,命名以desc结尾.例:station_desc字段用来存储代码,命名以code结尾.例:eRRoR_code字段用来存储标志,命名以Flag开头.例:debug_Flag3索引命名以表名+index+两位流水号(01~99).例:enduseR_index014键值主键命名以表名+pk+一位流水号(1~9).例:dept_pk1附键命名以表名+ak+一位流水号(1~9).例:dept_ak1外键命名以表名+Fk+一位流水号(1~9).例:dept_Fk1检查条件以表名+ck+一位流水号(1~9).例:dept_ck15视图命名以V_开头例:V_dept其它规则参考资料表命名规则6触发器以表名+tR+一位流水号(1~9)命名.例:dept_tR17存储过程命名以pc开头实现单一资料表交易功能,以pc+表名命名.例:pc_line实现关联资料表交易功能,以pc+功能命名.例:pc_getdata命名需让人明白其主要功能8函数检查功能的函数,以is+检查项目命名.例:boolischarValid(char)获取资料功能的函数,以get+数据项命名.例:stringgetlineno(char)设定资料功能的函数,以set+数据项命名.例:intsetlineno(char)9序列命名以seq开头以表的字段名命名.例:seq_line_id若与其它表的字段名相同,则以表名+字段名命名.例:seq_code_type_id10表空间存储资料的命名为项目名称.例:cRm存储索引的命名为项目名称+idx.例:cRmidx存储历史的命名为项目名称+old.例:cRmold存储临时的命名为项目名称+log.例:cRmlog.11数据文件命名以所属表空间开头+两位流水号(01~99)+.oRa.例:cRm01.oRa12包命名以功能缩写开头+pkg+流水号(1~9).例:cRmpkg1篇二:oRacle对象命名规范oracle对象命名规范(试用稿)20xx年4月修改说明正文目录1引言................................................. ................................................... .....................41.11.21.32目的................................................. ................................................... ..............4范围................................................. ................................................... ..............4参考资料................................................. ................................................... (4)国网标准化命名规范.............................................................................................42.12.2 2.32.42.5基本原则................................................. ................................................... ......4实体(表)的英文命名规则................................................. .........................4属性(列)的英文命名规则................................................. .........................5主键的英文命名规则................................................. .....................................6外键的英文命名规则................................................. . (6)3内部补充命名规范................................................. ..............错误!未定义书签。
编程规范1:所有数据库关键字和保留字都大写;字段、变量的大小写2:程序块采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为2/4个。
必须使用空格,不允许使用【tab】键。
3:当同一条语句暂用多于一行时,每行的其他关键字与第一行的关键字进行右对齐。
4:不允许多个语句写到一行,即一行只写一条语句。
5:避免把复杂的SQL语句写到同一行,建议要在关键字和谓词处换行。
6:相对独立的程序块之间必须加空行。
BEGIN、END独立成行。
7:太长的表达式应在低优先级操作符处换行,操作符或关键字应放在新行之首。
不同类型的操作符混合使用时,用括号隔离,使得代码清晰。
8: 不同类型的操作符混合使用时,应使用括号明确的表达运算的先后关系。
9:运算符以及比较符左边或者右边只要不是链接的括弧,则空一格。
10:if 后的条件要用括号括起来,括号内每行最多两个条件。
11:减少控制语句的检查次数,如在else( if..else)控制语句中,对最常用符合条件,尽量往前被检查到。
尽量避免使用嵌套的if 语句,在这种情况应使用多个if 语句来判断其可能。
命名规范1:不使用数据库关键字和保留字,为了避免不必要的冲突和麻烦。
2:严禁使用带空格的名称来给字段和表命名,会出错误而终止。
3:用户自定义数据库对象:表,视图,主外键,索引,触发器,函数,存储过程,序列,同义词,数据库连接,包,包体风格要保持一致。
数据库名称1-8个字符,其他对象1-30个字符,数据库连接不操过30个字符。
使用英文字母、数字、下划线。
除表外,其他对象命名最好用不同的前缀来区别。
表tbl_/t_视图v_序列seq_簇c_触发器trg_存储过程sp_/p_函数f_/fn_物化视图mv_包和包体pkg_类和类体typ_主键pk_外键fk_唯一索引uk_普通索引idx_位图索引bk_4:PL/SQL对象和变量命名规则输入变量i_输出变量o_输入输出变量io_普通变量v_全局变量gv_常量大写游标cur_用户自定义类型type_保存点spt_不允许使用中文和特殊字符用户对象命名应全部为小写,且不允许使用控制符号强制转换对象为小写字符变量命名,要有具体含义,能表明变量类型。
数据库命名、设计规范一、数据库表及字段1.数据库表的命名规范:表的前缀应该用系统或模块的英文名的缩写(全部大写)。
如果系统功能简单,没有划分为模块,则可以以系统英文名称的缩写作为前缀,否则以各模块的英文名称缩写作为前缀。
例如:如果有一个模块叫做BBS(缩写为BBS),那么你的数据库中的所有对象的名称都要加上这个前缀:BBS_ + 数据库对象名称,BBS_CustomerInfo标示论坛模块中的客户信息表。
表的名称必须是易于理解,能表达表的功能的英文单词或缩写英文单词,无论是完整英文单词还是缩写英文单词,单词首字母必须大写。
如果当前表可用一个英文单词表示的,请用完整的英文单词来表示;例如:系统资料中的客户表的表名可命名为:SYS_Customer。
如果当前表需用两个或两个以上的单词来表示时,尽量以完整形式书写,如太长可采用两个英文单词的缩写形式;例如:系统资料中的客户物料表可命名为:SYS_CustItem。
表名称不应该取得太长(一般不超过三个英文单词)。
表名长度不能超过30个字符,表名中含有单词全部采用单数形式,单词首字母必须大写。
在命名表时,用单数形式表示名称。
例如,使用 Employee,而不是 Employees。
对于有主明细的表来说。
明细表的名称为:主表的名称 + 字符Dts。
例如:采购定单的名称为:PO_Order,则采购定单的明细表为:PO_OrderDts;对于有主明细的表来说,明细表必须包含两个字段:主表关键字、SN,SN字段的类型为int型,目的为与主表关键字联合组成明细表的关键字,以及标示明细记录的先后顺序,如1,2,3……。
表必须填写描述信息,后台表名尽量与前台表名相同,后台独有的表应以_b作为后缀。
如r_gggd_b。
数据库表的命名采用如下规则:1)表名用模块名_开头,表名长度不能超过30个字符,表名中含有单词全部采用单数形式,单词首字母必须大写。
2)多个单词间用下划线(_)进行连接。
1 命名原则约定ü? 是指对数据库、数据库对象如表、字段、索引、序列、存储过程等的命名约定;ü? 命名使用富有意义的英文词汇,尽量避免使用缩写,多个单词组成的,中间以下划线分割ü? 避免使用Oracle的保留字如LEVEL、关键字如TYPE(见Oracle保留字和关键字);ü? 各表之间相关列名尽量同名;ü? 除数据库名称长度为1-8个字符,其余为1-30个字符,Database link名称也不要超过30个字符;ü? 命名只能使用英文字母,数字和下划线;?表名规则如下:命名规则为xxx_yyy_TableName。
xxx表示开发公司的名称,最多五个字母构成,尽量用简称;yyy表示子系统中的子模块的名称(可以没有), 最多五个字母构成,尽量用简称;TableName为表含义, 最多十个字母构成,尽量用简称?TableName规则如下:ü? 使用英文单词或词组作为表名,不得使用汉语拼音ü? 用名词和名词短语作表名ü? 不使用复数?正确的命名,例如:fiber_sys_userfiber_biz_order?存储过程规则如下:命名规则为xxx_yyy_StoredProcedureName。
xxx表示开发公司的名称,最多五个字母构成,尽量用简称;yyy表示子系统中的子模块的名称(可以没有), 最多五个字母构成,尽量用简称;StoredProcedureName为存储过程含义,最多十个字母构成,尽量用简称?StoredProcedureName规则如下:ü? 用动词或动词短语来命名,并带有宾语ü? 需要符合用Pascal 命名规则。
ü? 尽量谨慎地使用缩写ü? 尽量不要和关键字重合ü? 不要用任何名前缀 (例如 U,B)ü? StoredProce dureName内不使用下划线ü? 当操作依赖条件时,一般结尾使用 By+条件?存储过程正确的命名,例如:sys_InsertUsersys_SearchUserByUserIDsys_DeleteUserByUserID?视图规则如下:ü? 视图的命名采用xxx_yyy_ViewName_v。
数据库设计规范和指导1数据库设计规范需考虑以下1.业务根据业务和范式设计合理的表结构2.容量根据业务考虑月增长量,年增长量等等,考虑是否进行水平分表.根据请求性能指标考虑是否进行垂直水平分表.3.性能过高的范式会影响性能,数据库库表结构直接影响查询语句,间接影响查询效率.4.范式一般情况遵循范式,特殊情况可以反范式,进行表之间的字段冗余.5.索引优化dba根据业务表查询进行索引优化2数据库以及账户名划分1. 尽量简洁明义,能够一眼看出来这个数据库是用来做什么的;2. 使用名词作为数据库名称,并且只用英文,不用中文拼音;3. 使用英文字母,全部小写,如果oracle可按个人习惯全部大写或者小写.4. 如果有多个单词,则使用下划线隔开.使用常见单词,避免使用长单词和生僻词;2.1读写账号分离读写库w_xxx 只读库r_xxx2.2开发环境读写库dev_w_xxx 只读库dev_r_xxx2.3测试环境读写库qa_w_xxx 只读库qa_r_xxx2.4生产模拟环境生产数据库从库(准实时同步),只读环境,不允许修改数据,不允许修改表结构;供线上问题查找,数据查询等读写库real_w_xxx 只读库real_r_xxx2.55.生产线上环境线上环境;开发人员不允许直接在线上环境进行数据库操作,如果需要操作必须找DBA进行操作并进行相应记录;读写库online_w_xxx 只读库online_r_xxx3表名字段名限制SQLSERVER 128个字符,临时表116个字符。
Oracle 30个字符。
(为什么要这么短?)MySQL 64个字符。
DB2 128个字符?4表名命名规范1. 尽量简洁明义,能够一眼看出来这个数据库是用来做什么的;2. 使用名词作为数据库名称,并且只用英文,不用中文拼音;3. 使用英文字母,全部小写,如果oracle可按个人习惯全部大写或者小写.4. 如果有多个单词,则使用下划线隔开.使用常见单词,避免使用长单词和生僻词;5. 表名以t_开头,视图v_,类似常用的还有过程sp_xxx/函数f_xxx/包pkg_xxx/序列seq_xxx.6. 具备统一前缀,对相关功能的表应当使用相同前缀,如acl_xxx,ord_xxx,ppc_xxx;其中前缀通常为这个表的模块或依赖主实体对象的名字,通常来讲表名为:业务_动作_类型,或是业务_类型;acl_xxx_idx7. 数据库编码utf8mb4, 表编码可选择utf8和utf8mb4,默认utf8.字段中如果包含非主流字(如非主流的qq昵称)需用utf8mb4编码.8. 表引擎取决于实际应用场景及当前数据库中的已经存在的存储引擎;日志及报表类表建议用myisam,与交易,审核,金额等事务相关的表用innodb引擎。
密级公开()普通(√)秘密()机密()绝密()Oracle数据库编程规范文档编号:<文档编号(按照文档编码规范)>文档归类:<文档归类>作者:李程扬创建时间:2005-11-14修改时间:2005-11-15版本号:v1.0文档传阅:一、数据库对象创建及命名规范1、数据库字段及对象命名规范a.数据库命名规范与PB编程规范对命名方式的约定可相互参照;b.命名单词间分隔用下划线[_],尽可能使用与业务相匹配的单词或其缩写;c.绝对不允许使用拼音首码及简单数字的命名方式;d.Oracle对于对象或字段名称长度有限制,最多31个字符;2、字段定义及类型说明a.字段定义仅能使用以下类型i.date:日期时间类型,存入日期字段的数据若未指明时间,时间缺省就是[00:00:00];若未指明日期,则日期缺省是[1900-01-01];对于年份[number(4,0)]与月份[number(6,0)]这类数据,一般用number类型定义;ii.number:数值类型,字段所占空间与每一行数据相关,即有多少存多少;要注意其定义小数位是包含在总长度中,如number(12,2)——总长度为12位,其中小数占2位;iii.char:定长字符串类型,不论字符串信息多少都要占用所定义长度的空间,不足的部分用空格填充;对于一些更新操作比varchar2效率高;长度限制为255;iv.varchar2:非定长字符串类型,字符串信息多少就占多少空间,所以对于此类型数据在存入数据库前要去空格,以防止多余空格造成字段关联错误;相比char可节省很多存储空间,某种程序上可提高网络传输效率;长度限制为4000个字符;v.clob:一般存大于4000个字节的字符串信息,如数据窗口的语法;vi.blob:一般存二进制数据,如图片;b.对于字符串类型,除数据固定长度字段(如char(1)、SICK_ID),其它情况都必须使用varchar2类型;c.对于number与varchar2类型,在定义时要预留足够的长度,因为这两种类型都是按实际数据来分配存储空间,这样才能避免数据需求变长,字段长度修改造成程序错误(数据窗字段及数值变量小数位定义);d.应尽量使用number类型定义代码、状态字段;相比char或varchar2,这可最大程度地节省空间,并可显著提度检索效率;当然,同类型已定义的字段,为兼容原先设计,还是必须使用旧的类型定义;e.字段命名约定i.字段名称不必像PB变量使用前缀来标识其数据类型;ii.字段常用后缀如下ID/No表示唯一的序列号标识;其中ID多用于表示对人或物的标识,即指的是一种标志(如Sick_ID);而No多用于对连续号或流水号的标识(如单据号Apply_No)Code 表示项目代码(如项目代码Item_Code)Name 表示名称(如项目名称Item_Name)Class 表示类别(如单据类别Apply_Class)Operator 表示操作员(类型用varchar(27),如Apply_Operator)Time 表示日期或日期时间(如Audit_Time)Dept 表示科室(如开单科室Apply_Dept)Flag 表示标志(字段类型用char(1),值为Y或N)Status 表示状态(字段类型用char(1))iii.常见业务字段名称及类型定义如下3、数据库对象定义说明:创建对象时一定要指定是在哪个模式下面a.表i.下面列出建表步骤(一般在PB6中新建表,再拷出相应建表语法)建表语法创建主键及索引创建同义词对象授权(所有新建对象都必须授权给zhiydba)ii.对于表命名有以下常用后缀_master:主表_detail:细表_record:记录表_dict:系统字典/用户字典_config:用户配置表iii.不推荐使用表外键约束,也不推荐除空值以外的其它约束检查,这类约束判断一般在程序中处理;b.主键:一种特殊的索引i.主键名都是以pk_作为前缀,后面一部分用表名,即pk_+表名ii.所有表都必须创建主键,否则这些表就没办法做更新操作c.索引i.索引名以idx_作为前缀,后面一部分用表名+索引相关列名或其缩写ii.创建索引时一定要记得指明其所在模式(一般与表在同一模式下),这一点程序员常会遗漏;iii.索引也要区分是唯一索引还是可重复索引;iv.要查询的列尽可能创建索引,一般不推荐使用多列组合索引,而应分开建立索引;如病人ID或查询时间字段;另外,用到组合索引时要注意索引列的顺序;v.一个表索引最多不能超过7个,否则会影响数据更新效率,且占用存储空间,即:索引越多、查询效率高、但更新操作慢、存储占用高;vi.对于值内容单一(如只有0与1)或大部分数据是空值的字段不用建索引;对于某些数据量很少的表(如字典),也是不用建索引;d.视图:其命名以v_作为前缀,统一建在zhiydba模式下(可省去授权)e.序列号:其命名以_seq作为后缀,统一建在zhiydba模式下;主要用于数据表的主键字段取唯一值(如单据号),对于字典代码就没必要用序列号;f.同义词:创建相应对象的同义词主要是便于编程(public),做到对象模式无关g.用户:即模式h.函数及存储过程:除非开放接口给其它软件供应商,否则不使用这两类对象,因为包(package)就可代替其功能,并便于分类组织;i.后台包/Java包:不用深入了解,知道有这些东西就可;j.后台任务(Job):后台计划任务执行,通过dba_jobs可查询当前在执行任务;k.触发器:Oracle的触发器一般都认为在事务处理上不安全,所以除非特殊接口,否则不准使用触发器;二、Oracle常用函数1、Oracle的PL/SQL语言是对SQL的过程性语言扩展,当前Oracle的SQL语法遵循SQL92标准;2、完整PL/SQL函数集可查阅\\Research\ZHIS4_Tools\Database\Oracle8i资料\doc\server.816\a76989\toc.htm3、字符串相关函数a.||:字符串合并操作符b.trim:去字符串前后空格,一定要记住存取字符串数都要调用此函数去空格c.substr:截取字符串的一部分内容,也PB的mid函数功能一样d.to_char:将数值型或日期型数据转化为字符类型,如to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')e.lpad/rpad:在串值左/右重复填充指定的字符串,与PB的fill函数功能类似f.upper/lower:字符串都转为大写/小写4、日期相关函数a.+/-:加/减天数操作符b.to_date:将字符串类型数据转为日期型信息,如to_date('2005-11-15','yyyy-mm-dd')c.trunc:去掉时间那部分信息,常用于按日期检索数据d.add_months:增加月份5、数值相关函数:a.to_number:将字符串类型数据转为数值型,如to_number(to_char(operation_time,'yyyymmdd'))要注意,如果待转化数据包含非数字内容,就会报Oracle错误b.trunc:按指定小数位精度截取6、其它函数a.nvl:空值判断,这是很常用的函数;对于PL/SQL的空串与空值是一样的,即在SQL语法中没必要像PB一样判断空串;b.decode:条件分支判断,if elsec.sign:判断数值的符号,可用于>或<判断,常与decode合起来使用;7、伪列:在SQL语法中可以和普通列一样使用a.sysdate:取当前数据库所在服务器的时间——系统时间b.rownum:用于限制检索行数c.rowid:当前检索行的唯一内部定位标识符8、序列号取值:nextval,取序列号的下一数值9、特殊表:dual10、解析表列类型信息的命令:desc(describe)三、Oracle事务处理1、事务概念a.在PB编程中,事务开始于SQL更新操作或行锁,结束于提交(commit)或回滚操作,即一个事务的开始与结束是隐式由系统自动控制;b.在中断任何事务前(如弹出提示框或窗口),一定要把事务提交或回滚;c.注意:任何出错函数都会自动把事务回滚,再弹出相应提示;要注意判断返回值2、并发控制(锁机制/资源争用):多用户操作程序必须会遇到并发问题,数据库系统中一般通过锁来防止并发a.锁类型/锁粒度:PB编程中常用到的是排它锁,而Oracle内部处理一般是共享锁(如update/delete操作)i.行级锁:select for update语法;推荐在程序中使用;ii.表级锁:lock table语法;杜绝在程序中使用表级锁,除非是同一事务中对表的所有数据进行修改操作,否则极易引发数据库阻塞;b.死锁类型i.行间死锁:在不同事务处理中,a行与b行的锁表顺序相反;ii.表间死锁:在不同事务处理中,A表与B表的锁表顺序相反;c.死锁与阻塞:可认为两者是共生的,都源于对数据库资源未能及时释放i.死锁:Oracle对于死锁会在一定时间范围内检测到并自动解锁,但此过程需占有大量资源,大量事务并发死锁时常造成数据库变慢,客户端操作没有响应,严重情况下会引起系统崩溃;若Oracle没能及时解锁,这时数据库就会发生大量阻塞;ii.阻塞:一般是程序事务处理长时间未能提交或回滚,导致事务所占数据库资源未能释放,系统响应时间变量,大量阻塞也会使平常不会出现的行级死锁大量出现,从而使系统陷入资源争用的死循环,除非这时手工干预或引发阻塞的事务释放资源,否则最终结果必然是系统崩溃;iii.系统崩溃:指数据库系统对客户端操作无任何响应,且客户端无法连接;数据库所在服务器(一般是windows2000)对鼠标或键盘操作也无响应,这种情况下只能是重启服务器;四、数据库编程容错1、SQL执行语句容错:任何数据库操作都必须判断是否正确执行(sqlca)a.查询语句错误判断(select/cursor/execute immediate)sqlca.sqlcode:=0(正确),-1(出错),f_sqlerr/sqlca.sqlcode=100b.更新语句错误判断(update/insert/delete)sqlca.sqlcode/sqlnrows:数据更新影响行数,f_sqlerror2、PB程序错误判断a.数据窗口更新错误判断:update(true,false)=1/resetupdateb.数据窗口内部错误处理:dberror事件c.应用级错误:systemerror事件五、SQL执行效率问题1、客户端等待最占用时间的部分就是数据库操作及网络传输,网络问题不是这文档所涉及的,下面主要针对数据库操作讲一些常用优化方法;2、Oracle的SQL语法从提交命令到输出结果一般要经过以下几步:语法分析、语义分析、执行路径分析、……3、Oracle的优化方式:基于规则(base rule)/基于选择(base choose),一般推荐用基于选择(base choose)的优化方式,但可在检索语法中设置特殊的优化方式;4、SQL查询语句优化列举:尽可能利用索引,减少表间关联字段a.关联的字段不能加上使用表达式(函数、计算式等),特殊是修改数据窗口的检索条件时(SetSQLSelect),如:to_char(operation_time,'yyyy-mm-dd')=正确的写书方式应为:selectfrom dispensary_sick_price_itemwhere operation_time >= to_date('2005-11-15','yyyy-mm-dd')and operation_time < to_date('2005-11-16','yyyy-mm-dd');b.特别要注意对于字符型字段与数值参数关联(或反过来数值型字段与字符参数关联),一定要把参数先转化为与字段同样的类型,否则即使字段有建索引也没办法用到,因为Oracle分析SQL语法时会自动把字段加上相应的函数处理以匹配参数;即所有参数类型定义应与所关联字段匹配,或对类型转化要显示在参数中处理;c.多表关联时,尽可能使用主键列;d.尽可能用exists/not exists语法,而不是in/not in语法;一般若子查询数据量较小可用in语法,若子查询行数可能会超过100条,则必须使用exists语法,且Oracle的in语法有最多999行限制;e.尽量使用绑定变量,主要是动态执行的SQL语法(用动态游标),这样可在SQL执行预处理时省却语法分析阶段所占的时间,特别是在循环语句中;f.char和varchar2字段类型关连:i.char与char:不论两字段长度定义如何,都能利用索引;ii.varchar2与varchar2:也与其长度定义无关,但要注意要么后面都没空格,要么空格数量要一致才能用到索引;iii.char与varchar2:除非varchar2字段空格补足到与char定义长度一样,否则没办法用到索引;g.对于大数据量表新建索引时,一定要记得分析索引analyze index comm.PK_IC_CARD_DEPOSIT(索引名) compute statistics;5、判断SQL执行情况的方法:可通过在SQLPlus设置以下命令,然后执行所要分析的SQL语法,就可以得到其执行路径与执行时间等信息set autotrace on/set autotrace traceonly(不显示所检索的数据)set timing on6、大幅提高批量数据处理效率的方法——后台包,如床位计价、每日报表基表数据生成等;对于一些医院业务高峰常用模块(如住院摆药、单据扣费等)也常把这类业务写在后台包中处理;7、数据库连接接口:正常情况下都是使用PB原生Oracle接口,且按其客户端配置尽可能用高版本的Oracle客户端;六、数据库操作安全问题1、不准在PB的数据库管理窗口中执行SQL更新语法,必须在sqlplus执行,这样才能判断执行结果,防止更新语法写错(如where条件写漏了),以决定提交(commit)还是回滚(rollback);2、更新数据前先用相同条件的select语法查看,且把检索出的数据导出备份(用PB或程序员助手),以便出错时恢复数据(很有中能SQL语法没错,但需求是错的);3、除非是清库才使用truncate table语法(直接提交,无法回滚,且无数据库日志),否则删除所有数据只能使用delete from 语法;七、数据库管理相关1、Oracle数据库文件a.初始化文件:initzhis4.ora与spfilezhis4.ora(Oracle9i才有)b.密码文件:可用命令orapwd创建c.控制文件:control filed.数据文件:Oracle系统文件、临时表空间文件、回滚段数据文件、用户数据文件e.日志文件:在线日志与归档日志2、手工启动/关闭数据库实例a.启动实例(初始化文件):startup nomount->alter database mountb.启动实例(控制文件):startup mount->alter database openc.启动实例(数据文件):startup/startup opend.关闭实例:shutdown immediate3、数据库备份机制:a.[硬件]双机热备b.[软件]文件备份(在线热备/离线冷备)c.[软件]导出备份(全库导出/增量导出)4、重建数据库相关(详细步骤参见创建数据库步骤.txt)a.修改数据库实例名:创建实例,init文件实例参数修改,重建控制文件b.数据库文件路径修改:init文件控制文件路径修改,重建控制文件c.实例名与数据库文件路径都不变:拷到相同目录,直接启动。
ORACLE设计规范1、数据库模型设计方法规范1.1、数据建模原则性规范1.2、实体型之间关系认定规范1.3、范式化1NF的规范1.4、范式化2NF的规范1.5、范式化3NF的规范1.6、反范式化冗余字段使用规范1.7、数据库对象命名基本规范第一:长度规范:凡是需要命名的对象其标识符均不能超过30个字符,也即:Oracle中的表名、字段名,函数名,过程名,触发器名,序列名,视图名的长度均不能超过30个字符;第二:构成规范:数据库各种名称必须以字母开头,但严禁使用SYS开头;名称只能含有字母,数字和下划线“_”三类字符,“_”用于间隔名称中的各语义字段;不要使用DUAL作表名;第三:大小写规范:构成Oracle数据库中的各种名称(表明,字段名,过程名,视图名等等)的所有字符,必须使用大写,也就是不能在脚本中,对任何名称添加双引号“”来设定字符的大小写形式,只要不采用“”限制,Oracle自动会将各名称转化成大写。
2、表的设计规范2.1、表的主键规范遵循如下三点原则:第一:有无原则:除临时表和外部表,以及流水表,日志表外,其他表都要建立主键;第二:构成原则:主键不能使用含有实际语义的列,应该增加一个xx_id字段做主键,类型为number,取值来自序列sequence;第三:创建原则:对于500万以上的表,请数据组参与设计实施,采用先建唯一索引再添加主键约束的方式来创建主键;2.2、表的主键列规范对于实体表,主键就是一列,就是没有任何语义的自增的NUMBER列,对于关系表,主键就是相关实体表主键形成的复合主键,是多列;2.3、使用注释的规范2.4、一个表所含字段总长度的规范2.5、一个表所含字段访问频繁度的规范2.6、一个表所含数据量的规范2.7、大对象字段(BLOB,CLOB)使用规范2.8、增量同步表的设计规范字典信息表和需要使用增量同步的表必须增加如下属性:2.9、表的表空间使用规范2.10、索引的表空间使用规范3、设计分区表的规范3.1、RANGE分区的规范3.2、LIST分区的规范3.3、HASH分区的规范3.4、RANGE-LIST分区的规范3.5、RANGE-HASH分区的规范4、索引的设计规范4.1、主键索引的规范4.2、唯一约束索引的规范4.3、外键列索引的规范4.4、复合索引的规范4.5、函数索引的规范4.6、位图索引的规范4.7、反向索引的规范4.8、分区索引的规范4.9、索引重建的规范5、SQL访问规范5.1、避免SELECT *程序中不能出现SELECT*,即使是选择全部选择项,也需要全部指明,这主要出于如下原因:第一:使用*相对比较慢,因为Oracle 需要遍历更多的内部字典信息;第二:为避免以后相关表增加字段造成程序错误,比如INSERT INTO SELECT和SELECT INTO语句会报错;5.2、避免笛卡尔运算多表关联查询不能出现笛卡尔积,如果在报表中为集聚表(或称中间表)生成多个维度组成的复合主键需要使用迪克尔积的,必须请数据组确认性能。
5.3、使用CTAS备份在进行DML操作(INSERT,UPDATE,DELETE)之前,必须对数据进行备份,使用如下语句:方法一:表数据全部备份:CREATETABLE TAB_NAME_BAK AS SELECT * FROM TAB_NAME;方法二:部分备份:对大表仅备份将要修改的数据:CREATE TABLE TAB_NAME_BAKAS SELECT * FROM TAB_NAME WHERE [选择出被操作数据的条件];5.4、INSERT时需写全列名代码中INSERT语句必须写出全部列名,以保证表增加字段后语句执行不受影响:如:INSERT INTO TAB(COL1,COL2)VALUES(COL1_VAL,COL2_VAL);再如:INSERT INTO TAB(COL1,COL2)SELECT COL1_VAL,COL2_VAL FROM TAB_BB;不能将COL1,COL2和COL1_VAL,COL2_VAL省略;5.5、大数据量的DMLDML操作涉及到大数据量时,请分解为多次执行;对于UPDATE和DELETE每次涉及数据量在1万条左右,并且每次执行完就提交;对于INSERT INTO SELECT如果采用提示(/*+ append parallel */)可以处理百万级别的数据量。
5.6、完成事务及时commit对于一个完成了的事务,请用commit显示提交,这是避免锁争用的锁等待的需要,特别是对DML操作频繁的表;5.7、java的变量绑定使用“变量绑定”来处理一条SQL带不同常量多次执行的情况,动态绑定可以大大优化SQL的执行效率,还可以优化Oracle的内存使用。
在Java中,结合使用setXXX系列方法,可以为不同数据类型的绑定变量进行赋值,从而大大优化了SQL语句的性能。
JAVA情况下的动态绑定示例如下:String v_id = 'xxxxx';String v_sql = 'select name from tb_a where id = ? ';stmt = con.prepareStatement( v_sql );stmt.setString(1, v_id ); //为绑定变量赋值stmt.executeQuery();5.8、perl的变量绑定使用“变量绑定”来处理一条SQL带不同常量多次执行的情况,动态绑定可以大大优化SQL的执行效率,还可以优化Oracle的内存使用。
PERL绑定变量实例如下:$modsql = qq{insert into tmp_tai_rtkpi_mark(tab_name,kpi_id,ne_id,timepoint,cacu_time,start_time,stop_time,down_base,up_base,ajast_flag,inuse_flag,cal_data)values(?,?,?,?,?,?,?,?,?,?,?,?)};if ( !$dbh->prepare($modsql) ) {writeToLog( "start SQL prepare Error!/n" . DBI::errstr . "/n/n" ); }$sth_msg_in_DB = $dbh->prepare($modsql)|| die( "start SQL prepare Error!/n" . $DBI::errstr . "/n" );$sth_msg_in_DB->bind_param( 1, $kpiid_tab{$kpi_id} );$sth_msg_in_DB->bind_param( 2, $kpi_id );$sth_msg_in_DB->bind_param( 3, -1 );$sth_msg_in_DB->bind_param( 4, -1 );$sth_msg_in_DB->bind_param( 5, $current_time );$sth_msg_in_DB->bind_param( 6, $start_time );$sth_msg_in_DB->bind_param( 7, $end_time );$sth_msg_in_DB->bind_param( 8, $temp_min );$sth_msg_in_DB->bind_param( 9, $temp_max );$sth_msg_in_DB->bind_param( 10, 0 );$sth_msg_in_DB->bind_param( 11, 1 );$sth_msg_in_DB->bind_param( 12, -1 );$sth_msg_in_DB->execute() || die( "SQL Execute Error!/n" . $DBI::errstr . "/n" );5.9、避免重复访问:使用group避免重复访问(一):同源单组单查询:如下语句要避免:SELECT CLASS,sum(COL) FROM TAB_TEST WHERE CLASS=’A’ UNION ALLSELECT CLASS,sum(COL) FROM TAB_TEST WHERE CLASS=’B’ UNION ALLSELECT CLASS,sum(COL) FROM TAB_TEST WHERE CLASS=’C’改写成:SELECT CLASS,sum(COL) FROM TAB_TEST GROUP BY CLASS5.10、避免重复访问:竖向显示变横向现实避免重复访问(二):竖向显示变横向显示问题语句:SELECTA.C1AC1,A.C2AC2,A.C3AC3,B.C1BC1,B.C2BC2,B.C3BC3,C.C1CC1,C.C2CC2,C.C3CC3FROM(SELECT'123'X,'SYNONYM'C1, sum(2)C2,count(1)C3FROMTAB WHERE TABTYPE= 'SYNONYM')A,(SELECT'123'X,'TABLE'C1, sum(2)C2,count(1)C3FROMTAB WHERE TABTYPE= 'TABLE')B,(SELECT'123'X,'VIEW'C1, sum(2)C2,count(1)C3FROMTAB WHERE TABTYPE= 'VIEW')C;正确使用形式如下:SELECTMAX(DECODE(TABTYPE,'SYNONYM','SYNONYM',NULL)) AC1,MAX(DECODE(TABTYPE,'SYNONYM',sum(2),0))AC2,MAX(DECODE(TABTYPE,'SYNONYM',count(1),0))AC3,MAX(DECODE(TABTYPE,'TABLE','TABLE',NULL)) BC1,MAX(DECODE(TABTYPE,'TABLE',sum(2),0))BC2,MAX(DECODE(TABTYPE,'TABLE',count(1),0))BC3,MAX(DECODE(TABTYPE,'VIEW','VIEW',NULL)) CC1,MAX(DECODE(TABTYPE,'VIEW',sum(2),0))CC2,MAX(DECODE(TABTYPE,'VIEW',count(1),0))CC3FROMTABWHERETABTYPE IN('TABLE','SYNONYM','VIEW')GROUPBY TABTYPE;5.11、避免重复访问:用表更新表避免重复访问(三):一个表同时更新另一个表的多个字段问题SQL:使用TB_SOURCE表更新表TB_TARGET的多个字段UPDATE TB_TARGET A SETA.COL1 = (selectB.COL1 from TB_SOURCE B where B.id = A.id) ,A.COL2 = (selectB.COL2 from TB_SOURCE B where B.id = A.id) ,A.COL3 = (selectB.COL3 from TB_SOURCE B where B.id = A.id) ,A.COL4 = (selectB.COL4 from TB_SOURCE B where B.id = A.id)WHERE A.id IN ( select B.id from TB_SOURCE B)正确使用形式如下:UPDATE TB_TARGET ASET (COL1, A.COL2, A.COL3, A.COL4 )=(SELECT B.COL1, B.COL2, B.COL3, B.COL4 FROM TB_SOURCE B WHERE B.id = A.id)WHERE EXISTS (select 1 from TB_SOURCE B where B.id = A.id)5.12、数据库连接及时关闭程序中必须显示关闭数据库连接,不仅正常执行完后需显示关闭,而且在异常处理块(例如java的exception段)也要显示关闭。