账务系统开发规范一、数据对象命名规范数据元素命名基本原则:对于账务系统建议命名如果可以的话控制在 18 个字符以内,一般不超过 25 个字符严禁使用多字节字符集来命名命名使用的字符集.完全使用拉丁字母和数字下划线命名由于 Oracle 使用数据库字符集,而不是 Unicode,对其他字符集支持不好所以严禁使用双引号包含的命名对所有数据库对象命名采用 Oracle 默认大写方式符合 ISO 标准命名准则建议参照 ISO-11179 标准,我总结了几条 ISO-11179 for SQL 1、 唯一,在数据字典中唯一2、 表征是什么而不是从反面表述3、 包含最简单易懂的主要特征4、 定义时不携带任何其他元素嵌套的定义和潜在的概念5、 表、集合、收集器应该表明其的聚集概念6、 过程、函数、触发器、作业必须在命名含有动名结构7、 表的拷贝或视图、别名必须包含基表的命名的一部分能识别与基表的关系和作用数据库对象基本的命名格式(一致采用下划线分割)数据库对象逻辑类型_模块/系统 /架构_ [前缀]_ 主题 数据库对象逻辑类型:数据库对象逻辑类型反映对象的数据库逻辑类型,对于可能会转换的对象类型如视图与表,冠以超集的命名如表。
对于易混淆重要的数据对象特别要注意V_ 视图PK_ 主键约束FK_ 外键约束UN_ 唯一约束CH_ 检验约束PK_ 主键索引IDX_UN_ 唯一索引IDX_BM_ 位图索引IDX_NM_ 普通索引IDX_FC_ 函数索引 前缀:对于表、视图、约束、索引、同义词、数据库连接避免无用的前缀不要在前缀中反映任何有关对象底层物理特性的东西,以免带来物理层改变导致对象的命名变化命名只是概念领域的建模开发人员可以通过 DDL 字典或语义来查找对象的物理类型,而命名只是逻辑层面的,两者尽量分开前缀不要和数据库系统前缀混淆 所以前缀定义为业务逻辑层次或功能类型模块/系统/ 架构代表对象属于哪个具体子系统或子组件,业务逻辑层次或功能类型表示对象处于这个子系统的哪个逻辑层次上相同子系统相同逻辑层次上的对象不允许同名逻辑层次满足层次名的完整性每个层次在它的上一个层次中定义,每个层次都有适合于自己的层次名,并与其他层次独立DIC 字典表MAP 映射表CTL 控制表LOG 日志表BRF 简要记录表TMP 临时表DAT 业务数据表PAR 参数表ERR 非法数据表CRE 核心表MID 中间结果表其他的业务层分类 其他的业务层分类OUT 外来数据表 模块/系统/架构:COM 通用功能FA 财务系统TRD 交易入账RPT 报表系统其他补充的 其他补充的 主题:主题反映在这个逻辑层次中的唯一独特命名,简洁反映这个层次中的一个对象或属性,采用全英文单数形式。
具体来说有以下几点:1. 表以名词或名词短语命名,表名是采用单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前 4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成 4 个字母长的别名;如果表的名字由 3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成 4 字母长的别名,其余依次类推)在命名过程当中,根据语义拼凑缩写即可注意,由于 ORACLE 会将字段名称统一成大写或者小写中的一种,所以要求加上下划线2. 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单3. 所有的存储值列表的表前面加上前缀 Z目的是将这些值列表类排序在数据库最后4. 关联类通过用下划线连接两个基本类之后,再加前缀 R 的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写关联表用于保存多对多关系如果被关联的表名大于 10 个字母,必须将原来的表名的进行缩写如果没有其他原因,建议都使用缩写 举例:表 Object 与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;表 Depart 和 Employee;存在多对多的关系;则关联表命名为R_Dept_Emp5. 采用有意义的列名,表内的列要针对键采用一整套设计规则。
每一个表都将有一个自动 ID 作为主健 ,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID ”的方法命名如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用_CODE 后缀对列名应该采用标准的前缀和后缀6. 视图以 V 作为前缀,其他命名规则和表的命名类似;7. 命名应尽量体现各视图的功能触发器:触发器以 TR 作为前缀,触发器名为相应的表名加上后缀,Insert 触发器加"_I",Delete触发器加"_D",Update 触发器加"_U",如:存储过程:PRC +系统功能分类 + 过程功能分类 + 具体名称过程功能分类:INTER 数据接口DEALCTL 业务控制DEAL 业务逻辑DATASH 数据展现CALC 计算逻辑CHECK 数据校验尽量用有意义的英文名称后续部分主要以动宾形式构成,并用下划线分割各个组成部分函数:FNC + 系统功能分类 + 函数功能分类 + 具体名称函数功能分类:GET 获取数据SET 更新数据CAL 计算数据具体名称:尽量用有意义的英文名称后续部分主要以动宾形式构成,并用下划线分割各个组成部分。
命名中其他注意事项1) 以上命名都不得超过 30 个字符的系统限制2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名绝对不要在对象名的字符之间留空格3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了二、sql 书写规范: 1、sql 语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql 保留字大写2、连接符 or、in、and 、以及=、= 等前后加上一个空格 3、对较为复杂的 sql 语句加上注释,说明算法、功能 注释风格:注释单独成行、放在语句前面 (1) 应对不易理解的分支条件表达式加注释; (2) 对重要的计算应说明其功能; (3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明; (4) 每条 SQL 语句均应有注释说明(表名、字段名) (5) 常量及变量注释时,应注释被保存值的含义( 必须),合法取值的范围(可选) (6) 可采用单行/ 多行注释 (-- 或 /* */ 方式) 4、SQL 语句的缩进风格 (1) 一行有多列,超过 80 个字符时,基于列对齐原则,采用下行缩进 (2) where 子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5、多表连接时,使用表的别名来引用列 6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据; 如例(1) 二、书写优化性能建议 1、避免嵌套连接例如:A = B and B = C and C = D 2、where 条件中尽量减少使用常量比较,改用主机变量 3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from 后边最后一个表) 4、大量的排序操作影响系统性能,所以尽量减少 order by 和 group by 排序操作 如必须使用排序操作,请遵循如下规则: (1) 排序尽量建立在有索引的列上 (2) 如结果集不需唯一,使用 union all 代替 union 5、索引的使用 (1) 尽量避免对索引列进行计算如对索引列计算较多,请提请系统管理员建立函数索引 (2) 尽量注意比较值与索引列数据类型的一致性 (3) 对于复合索引,SQL 语句必须使用主索引列 (4) 索引中,尽量避免使用 NULL (5) 对于索引的比较,尽量避免使用 NOT=(!=) (6) 查询列和排序列与索引列次序保持一致 6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。
7、尽量使用共享的 SQL 语句 8、查询的 WHERE 过滤原则,应使过滤记录数最多的条件放在最前面 9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边 10、in、or 子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引 三、其他经验性规则 1、尽量少用嵌套查询如必须,请用 not exist 代替 not in 子句如例(2) 2、用多表连接代替 EXISTS 子句如例(3) 3、少用 DISTINCT,用 EXISTS 代替 如例(4) 4、使用 UNION ALL、MINUS、INTERSECT 提高性能 5、使用 ROWID 提高检索速度对 SELECT 得到的单行记录,需进行DELETE、UPDATE 操作时,使用 ROWID 将会使效率大大提高 6、使用优化线索机制进行访问路径控制 7、使用 cursor 时,显示光标优于隐式光标 本规范示例: 例一: SELECT aka042 -- 单位缴费划入个人帐户比例 INTO prm_aaa043 FROM ka01 --医疗保险单位缴费划入个人帐户比例分段信息 WHERE akc021 = rec_kc01.akc021 -- 医疗人员类别 AND aka041 >= rec_kc01.akc023 -- 年龄上限 AND aka040 = prm_date OR aae031 IS NULL ); -- 终止时间 例二: X SELECT ...... FROM emp WHERE dept_no NOT IN ( SELECT dept_no FROM dept WHERE dept_cat='A'); O SELECT ...... FROM emp e WHERE NOT EXISTS ( SELECT 'X' FROM dept WHERE dept_no=e.dept_no AND dept_cat='A'); 例三: X SELECT ...... FROM emp WHERE EXISTS ( SELECT 'X' FROM dept WHERE dept_no=e.dept_no AND dept_cat='A'); O SELECT ...... FROM emp e,dept d WHERE e.dept_no=d.dept_no AND dept_cat='A'; 例四: X SELECT DISTINCT d.dept_code,d.dept_name FROM dept d ,emp e WHERE e.dept_code=d.dept_code; O SELECT dept_code,dept_name FROM dept d WHERE EXISTS ( SELECT 'X' FROM emp e WHERE e.dept_code=d.dept_code); 三、编程格式规范:通用格式:Myrule.br四、团队开发 使用 VSS 进行后台版本管理get (read only):check out & comment:undo check outadd filecheck in & comment对于各种文件的修改,开发人员将要修改的文件 checkout 到本地,修改完毕,编译、测试无误后,重构入数据库并且 checkin。