ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 数据库编程注意事项

数据库编程注意事项

原创 Linux操作系统 作者:tolywang 时间:2007-07-16 00:00:00 0 删除 编辑

--说明:本文大多引用网上资料,版权由原作者拥有

一 常用资料索引及论坛

oracle中国用户组

http://www.cnoug.org

常用技巧集

http://www.cnoug.org/viewthread.php?tid=2226


入门问题集

http://www.cnoug.org/viewthread.php?tid=17716

各版精华区

http://www.cnoug.org/forumdisplay.php?fid=79&filter=digest (数据库管理)

http://www.cnoug.org/forumdisplay.php?fid=3&filter=digest (深入讨论区)

http://www.cnoug.org/forumdisplay.php?fid=78&filter=digest (入门技术区)

软件下载区

http://www.oracle.com

二 常用工具软件及介绍

建模工具 PowerDesigner9.5

目前所有数据库设计文档是word格式,对文档的版本控制及数据库同步都很不方便,有时修改了数据库,在文档上就很难同步,大部分的建模工具都可以满足文档与数据库同步等任务,希望大家能够喜欢用PowerDesigner来进行数据库设计,设计的图表更便于交流及与其它成员共享。

下载地址:

http://www.9iv.com

优化工具 Lecco sqlexpert for oracle3.2

Leccotoadpl/sql developer相比,lecco更专业,可以格式化写得较乱的SQL,也可以优化SQL并产生带有hitsSQL,用lecco来编写pl/sql代码,调试等都很方便,是一款不得多得的oracle开发工具。

下载址址:

http://www.playicq.com (好象收费啦)

SQLPL/SQL书写规范

1 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留

字大写,连接符orinand、以及=、<=>=等前后加上一个空格。

2 对较为复杂的sql语句加上注释,说明算法、功能,注释风格:注释单独成行。

(1)应对不易理解的分支条件表达式加注释;

(2)对重要的计算应说明其功能;

(3)过长的函数实现,应将其语句按实现的功能分段加以概括性说明;

(4)每条SQL语句均应有注释说明(表名、字段名)。

(5)常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)

3 SQL语句的缩进风格

(1)一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进

(2)where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开

始,连接符右对齐。

4 多表连接时,使用表的别名来引用列。

5 供别的文件或函数调用的函数,绝不应使用全局变量交换数据。

6 变量令名不能超出ORACLE的限制(30个字符),令名要规范,要用英文令名,从变

量上能看到变量的作用,如

g名称 全局变量 m名称 局部变量

c名称 光标 p名称 参数

7 查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。要清楚明白地使用列名,而不能使用列的序号。

8 功能相似的过程和函数,尽量写到同一个包中,加强管理。

9 尽量不要使用视图、临时表、自定义函数、自定义过程之类的对象进行辅助算运,尽量用一条SQL实现要求。

10 在写查询条件时注意使用索引,注意复合索引组成字段的顺序,如果没有索引,请及时与DBA联系,注意where条件中的字段顺序应该以表中的字段顺序为准,尽量有优于后期的数据库优化。

11 在查询语句中查询表达式左边不允许出现函数及其它运算表达式,所有左边的表达式都可以用其它的方法在右边实现

12 所有写好的SQL最好能在Lecco sqlexpert上进行格式化并进行优化,注意执行计划及运行时间,如果有问题请及时与DBA联系。

13 SQL书写优化性能建议

(1) 避免嵌套连接、子查询(多级) 如:A = B and B = C and C = D

(2) where条件中尽量减少使用常量比较,改用Bind Variable变量

(3) 大量的排序操作影响系统性能,所以尽量减少order bygroup by排序操作。

14 必须使用排序操作,请遵循如下规则:

(1) 排序尽量建立在有索引的列上。

(2) 如结果集不需唯一,使用union all代替union

15 关于索引的使用

(1) 尽量避免对索引列进行计算,如对索引列计算较多,请系统管理员建立函数索引。

(2) 尽量注意比较值与索引列数据类型的一致性,不要发生隐性转换

(3) 对于复合索引,SQL语句必须使用主索引列

(4) 索引中,尽量避免使用NULL

(5) 对于索引的比较,尽量避免使用NOT=!=

(6) 查询列和排序列与索引列次序保持一致

16 尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用Bind变量。

17 查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。

18任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

19 inor子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

20 其他经验性规则

(1) 尽量少用嵌套查询 如必须,请用not exist代替not in子句。如例(2

(2) 用多表连接代替EXISTS子句。如例(3

(3) 少用DISTINCT,用EXISTS代替 如例(4

(4) 使用UNION ALLMINUSINTERSECT提高性能

(5) 使用ROWID提高检索速度

(6) 使用优化索引机制进行访问路径控制,使用cursor时,显示光标优于隐式光标

本规范示例:

例一:

SELECT aka042 -- 单位缴费划入个人帐户比例

INTO prm_aaa043

FROM ka01 --医疗保险单位缴费划入个人帐户比例分段信息

WHERE akc021 = rec_kc01.akc021 -- 医疗人员类别

AND aka041 >= rec_kc01.akc023 -- 年龄上限

AND aka040 <= rec_kc01.akc023 -- 年龄下限

AND aae030 <= prm_date -- 开始时间

AND ( aae031 >= prm_date OR aae031 IS NULL ); -- 终止时间

例二:

SELECT ......

FROM emp

WHERE dept_no NOT IN ( SELECT dept_no

FROM dept

WHERE dept_cat='A');

SELECT ......

FROM emp e

WHERE NOT EXISTS ( SELECT 'X'

FROM dept

WHERE dept_no=e.dept_no

AND dept_cat='A');

例三:

SELECT ......

FROM emp

WHERE EXISTS ( SELECT 'X'

FROM dept

WHERE dept_no=e.dept_no

AND dept_cat='A');

SELECT ......

FROM emp e,dept d

WHERE e.dept_no=d.dept_no

AND dept_cat='A';

例四:

SELECT DISTINCT d.dept_code,d.dept_name

FROM dept d ,emp e

WHERE e.dept_code=d.dept_code;

SELECT dept_code,dept_name

FROM dept d

WHERE EXISTS ( SELECT 'X'

FROM emp e

WHERE e.dept_code=d.dept_code);

过程注释:

过程都以sp_开头,注意过程名称要符合令名要求

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

name:sp_Write_log

parameter:p_textContext in varchar2 参数描述

create date:2003-04-1

creater:chen jiping

desc:过程总功能描述

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

函数注释

函数以f开头,令名符合令名标准

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

name:f_Get_JobId

parameter:p_Name in varchar2 参数描述

return number:返回值描述

create date:2003-04-1

creater:chen jiping

desc:函数总功能描述

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

四 数据库设计规范[csdn 大力]

1数据库设计原则

(1) 程序有关的状态信息使用域进行限制和定义,不允许最终用户修改定义

(2) 用户可修改的状态列表信息,用数据表来定义,一经创建后,用户只可修改名称,不能修改代码,修改后的名称与原名称应代表相同的意义。

(3) 用户采用列表录入的文字信息,在一个统一的‘系统信息’表中定义,用户可任意创建和修改。用此种方法录入的信息,录入的信息与选择列表不存在约束关系,列表只是作为文字录入的一种辅助手段。

(4) 辅助编码表应至少有两列—代码和名称。只有在名称非常稳定的情况下才可以不使用代码。使用编码表的好处是在应用程序界面中,不同的地方出现同一种数据的录入(如录入数据或查询过滤条件)时只需定义一次选择列表,不会出现两处冲突的现象,方便编程。

(5) 所有记录业务数据的表中都设有‘录入员’和‘录入日期’列,由系统自动记录。

(6) 记录业务数据的表中,根据需要设置‘过程’和‘状态’列,‘过程’列用一位数字或字符记录如录入 审核 记账等过程状态;‘状态’列用一位数字或字符记录如正常 作废 删除等状态。所有表的‘过程’状态的改变日期和操作人由一单独表来记录,表中记录状态改变所涉及的表标识 记录标识 操作人和操作日期。

(7) 基本编码表中应设置‘编码’ ‘缩语’ ‘名称’,‘编码’作为主键与其它表的外键形成对应关系,完成基于主-外键的完整性约束。

(8) 记录录入单据的表中设置‘自动单据号’,由一字符开始以区分单据类型,后跟一数字序列表示序号。‘自动单据号’由系统自动生成,作为主表的主键,不允许用户修改,并作为连接主表和明细表的外键,明细表中设置序号列,用于同一单据中排列各行的序号。

(9) 用于记录业务数据的数据表与用于报表的数据表分别存于不同的数据库中,分别命名为‘业务数据库’和‘决策数据库’。‘业务数据库’独立于‘决策数据库’进行设计,‘决策数据库’中的数据来源于‘业务数据库’。

(10) 任意业务流程中应考虑创建 审核 记账 修改 删除 冲红 结存(月结 年结)的处理

及满足的条件。

(11) 对于主-明细表结构,设计对应的视图将两表连接用于查询。

(12) 禁止直接用编码或名称列表(in)作为固定的过滤条件对数据进行查询。应将包含此过滤条件

的查询做成特定的视图;或在编码表中加入一属性字段用于分类。

(13) 对于业务数据表应设定一个‘存档标记列’,对于新增行或修改行设置该标志,以便将业务数据

库中的数据向决策数据库复制时用以选择需更新的数据。当采用数据库复制技术时,也希望设

定此标志,以备用。此标志的设置可以由应用程序或触发器来执行。

(14) 决策数据库中应复制基本编码表和辅助编码表,以保持决策数据库数据的完整性。

(15) 同时采用多种分类方法:如果某一实体有多于一种的分类方法,或实体中的每个实例所属的类

的数量是不定的,这时实体表和分类表之间的关联是多对多的,即一个实体属于一个分类而同

时也属于其它的分类。对于具有可多选的分类标志的表,与分类名称列表之间存在多对多的关

系,须按多对多的关系来处理。

--实体表-- --实体-分类表-- --分类表

实例1 实例 分类 分类1->类别1.1

实例2 1N ... 1N 分类1->类别1.2

实例3 ... 分类2->类别2.1

(16) 业务过程的记录:如果一个业务表(或主表+明细表)依赖另外一个业务表的数据,或在流程

上一个业务表根据另一个业务表生成,则该业务表中应有一字段记录另一业务表对应记录的

标识。这样的结构使得在流程上的所有数据形成一个链。他有两个作用:其一,可以追述某

一过程进行到哪一步;其二,对于流程的回退有用,当流程需要回退到某一步时,将该步骤

生成的记录作废,同时作废由此记录生成的所有后续记录,即可以回退到流程的任意一点。

由于数据的依赖关系,回退时实际上是从后向前作废记录,直到希望回退到的位置为止。

一个业务流程应作为一个事务(在数据库管理系统中的定义),要保证这一事务的完整性。

首先一个事务要有一个标识,在这个事务进行过程中所产生的一切数据都应打上事务标识作

为标记。可以‘回滚’整个事务,或‘回滚’(从后向前)到事务进行的某一点上,然后再继

续进行直到完成事务。

(17) 分类字段的冗余:业务数据表往往关联许多的基本信息表,这些基本信息表中可能含有一些

分类字段,而业务数据表的分类统计可能引用这些字段。如果这些分类字段的内容会改变,

而又不希望这种改变影响业务数据的统计结果,则在这些业务数据表中应包含这些分类字段,用以记录业务发生时该字段的内容。

(18) 类别和状态的多选:多选分为必选(1..n)和可选(0..n)。如是必选,在设计时要有说

明,在程序实现中应有控制和检查。两个可选的类别或状态表可以合并为一个表,再与引用此表的主表形成多对多的关系。

(19) 财务记账的处理:由凭证生成各种帐目(总帐 明细帐 日记帐 部门帐 往来帐 项目帐以

及备查帐)时,有两种处理方法:一种是各账本不生成表,需要时临时生成,在月结时一次生

成月结帐;另一方法是生成表,当对凭证进行修改时,先做删除处理(可用数据库的级联删除

功能),再补新凭证然后记帐,或,先做作废处理(各账目中与凭证相关的记录由凭证号关联),

再补新凭证然后记帐。当各账本与凭证之间由凭证号关联时,可进行关联查找。

2 命名原则

(1) 表和视图命名原则

系统信息表:TS_

基本编码表:TB_

决策数据表:TD_

业务数据表:

不同的业务以不同的缩写(2-3个字符)开始,如‘TCRM_’;

如是辅助编码表则在代表业务的缩写后加A_,如‘TCRM_A_,

关联数据表:TRE__A_B

视图:在表命名的基础上加前缀改为V_

后缀:主-明细结构的表,主表为 _M;明细表为 _L

(2) 列命名规则
第一个字母小写,后面的单词或拼音,采用第一个字母大写,命名规则只来自于业务,尽量

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84790/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13308553