软件数据库设计说明书
安徽新型农村合作医疗信息管理系统
目 录
1
文档介绍 ...................................................................................................................................................... 2 1.1 1.2 1.3 1.4 2 3
文档目的 .............................................................................................................................................. 2 文档范围 .............................................................................................................................................. 2 读者对象 .............................................................................................................................................. 2 参考文献 .............................................................................................................................................. 2
数据库环境说明 .......................................................................................................................................... 3 数据库的命名规则 ...................................................................................................................................... 4 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10
命名约定 .............................................................................................................................................. 4 注释说明 .............................................................................................................................................. 5 缩进 ...................................................................................................................................................... 6 断行 ...................................................................................................................................................... 7 大小写 .................................................................................................................................................. 7 主键选择 .............................................................................................................................................. 8 列长度的选择 ...................................................................................................................................... 8 使用SQL语句的约定 ......................................................................................................................... 8 关于ALIBABA表的约定 ................................................................................................................... 9 列值约定 .............................................................................................................................................. 9
4 物理设计 .................................................................................................................... 错误!未定义书签。 4.1
参合管理数据库设计 ........................................................................................ 错误!未定义书签。
5 安全性设计 ................................................................................................................................................ 10 5.1 5.2
防止用户直接操作数据库的方法 ..................................................................................................... 10 用户账号密码的加密方法 ................................................................................................................ 10
6 优化 ............................................................................................................................................................ 10 6.1 6.2 6.3 6.4 6.5 6.6 6.7
UNIX性能监控 ................................................................................................................................... 10 调整内存管理 .................................................................................................................................... 11 调整磁盘I/O ...................................................................................................................................... 12 监控磁盘性能 .................................................................................................................................... 13 调整CPU的使用............................................................................................................................... 13 调整块大小和文件大小 .................................................................................................................... 14 调整UNIX缓冲区高速缓存大小 ...................................................................................................... 14
1 文档介绍
1.1 文档目的
根据安徽新型农村合作医疗信息管理系统数据库系统设计的规范以及参考系统的需求分析说明书;对安徽新型农村合作医疗信息管理系统数据库系统进行描述、设计说明。
1.2 文档范围
● 对安徽新型农村合作医疗信息管理系统数据库开发环境配置描述、介绍 ● 对安徽新型农村合作医疗信息管理系统数据库命名制定规范
● 对安徽新型农村合作医疗信息管理系统数据库的逻辑设计进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库物理设计进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库安全性进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库进行优化说明 ● 对安徽新型农村合作医疗信息管理系统数据库管理与维护说明
1.3 读者对象
本文档读者对象:安徽省卫生厅农村合作医疗处、安徽省卫生厅信息管理中心;项目开发参与对象:系统分析员、高级程序员、程序员、系统测试人员等
1.4 参考文献
● 《新型农村合作医疗信息系统》建设规范;卫生部农卫司 ● 《新型农村合作医疗管理信息系统基本功能规范》;卫生部
● 《新型农村合作医疗管理信息系统需求分析说明书》;湖南泰阳网络科技有限公司
2 数据库环境说明
1.数据库系统采用unix操作系统下的oracle
2.设计工具为Sysbase Powerdesigner Version9.5.0.660 3.编程工具为PL/SQL Developer Version 6.0.5.926 (MBCS) 4.开发环境配置
*.background_dump_dest='D:\ORACLE\admin\nccm3\bdump' *.compatible='9.2.0.0.0'
*.control_files='D:\ORACLE\oradata\nccm3\CONTROL01.CTL','D:\ORACLE\oradata\nccm3\CONTROL02.CTL','D:\ORACLE\oradata\nccm3\CONTROL03.CTL' *.core_dump_dest='D:\ORACLE\admin\nccm3\cdump' *.db_block_size=8192 *.db_cache_size=209715200 *.db_domain=''
*.db_file_multiblock_read_count=16 *.db_name='nccm3'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=nccm3XDB)' *.fast_start_mttr_target=300 *.hash_join_enabled=TRUE *.instance_name='nccm3' *.java_pool_size=20971520 *.job_queue_processes=10 *.large_pool_size=40894464
*.log_archive_dest_1='LOCATION=D:\ORACLE\oradata\nccm3\archive' *.log_archive_format='%t_%s.dbf' *.log_archive_start=true *.open_cursors=300
*.pga_aggregate_target=93323264
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE' *.shared_pool_size=69206016 *.sort_area_size=20971520
*.star_transformation_enabled='FALSE' *.timed_statistics=TRUE *.undo_management='AUTO' *.undo_retention=10800 *.undo_tablespace='UNDOTBS1'
*.user_dump_dest='D:\ORACLE\admin\nccm3\udump'
3 数据库的命名规则
3.1 命名约定
1.是指数据库、数据库对象如TABLE、SEQUENCE、PROCEDURE、COLUMN等的命名约定; 2. 命名富有意义英文词汇,除个别通用的(见列表),要避免使用缩写,多个单词组成的,中间以下划线分割;
3. 除数据库名称长度为1-8个字符,其余为1-30个字符,Database link名称也不要超过30个字符;
4. 命名只能使用英文字母,数字和下划线;
5. 避免使用Oracle的保留字如level、关键字如type(见列表); 6. 各表之间相关列名尽量同名;
7. 数据库的命名:后台数据库命名为“nccm”+表示站点的2-4个字符。测试数据库命名为“nccm”+“TEST”, 开发数据库命名为“nccm3”,用模式(SCHEMA/USER)的不同来区分不同的站点。 8. INDEX命名:table_name+column_name+index_type(1 byte)+idx,各部分以下划线(_)分割。多单词组成的column name,取前几个单词首字母,加末单词组成column_name。如:sample表
member_id上的index: sample_mid_idx news表title上的unique index:news_titile_uidx; 9. SEQUENCE命名:seq_+table_name;
3.2 注释说明
1. 本注释说明主要用于PL/SQL程序及其它SQL文件,其它可作参考; 2. SQLPLUS接受的注释有三种: ―― 这儿是注释 /* 这儿是注释 */ REM 这儿是注释
3. 开始注释,类似JAVAK中的开始注释,主要列出文件名,编写日期,版权说明,程序功能以及修改记录: REM
REM $Header: filename, version, created date,auther REM
REM Copyright REM
REM FUNCTION
REM function explanation REM REM NOTES REM
REM MODIFIED (yy/mm/dd)
REM who when - for what, recently goes first 4. 块注释,如表注释,PROCEDURE注释等,同JAVA: /*
* This table is for TrustPass * mainly store the information
* of TrustPass members */
5. 单行注释,如列注释:
login_id VARCHAR2(32) NOT NULL, -- 会员标识
3.3 缩进
低级别语句在高级别语句后的,一般缩进4个空格: DECLARE
v_MemberId VARCHAR2(32), BEGIN
SELECT admin_member_id INTO v_MemberId FROM company WHERE id = 10;
DBMS_OUTPUT.PUT_LINE(v_MemberId); END;
同一语句不同部分的缩进,如果为sub statement,则通常为2个空格,如果与上一句某部分有密切联系的,则缩至与其对齐: BEGIN
FOR v_TmpRec IN (SELECT login_id,
gmt_created, -- here indented as column above satus
FROM member -- sub statement WHERE site = 'china' AND country='cn' ) LOOP NULL;
END LOOP; END;
3.4 断行
• 一行最长不能超过80字符 • 同一语句不同字句之间 • 逗号以后空格 • 其他分割符前空格 SELECT offer_name ||','
||offer_count as offer_category, id
FROM category
WHERE super_category_id_1 = 0;
3.5 大小写
属于ORACLE的关键字大小,表名、列名等小写。 列类型的选择
• 用CHAR(1)代替布尔值;
• 应尽量使用VARCHAR2代替CHAR类型; • VARCHAR(2)最多4000字符; • DATE精确到微秒,而非天;
• 使用CLOB代替LONG,BLOB代替LONG RAW;
• ORACLE只有NUMBER一种数据类型,使用时请给定长度;
3.6 主键选择
选择有意义的,不太长且能唯一标识记录行的列做主键,没有这种列时,才考虑使用EQUENCE做主健。
3.7 列长度的选择
应当根据实际需要选择列长度。有对应web 页面的,与页面上对应列长度一致。 对数据的验证除数据库端实现外还要尽可能在表现层控制。
3.8 使用SQL语句的约定
1. 尽量避免在循环中使用SQL语句。 2. 避免在WHERE字句中对列施以函数: SELECT *
FROM service_promotion
WHERE TO_CHAR(gmt_modified,‟yyyy-mm-dd‟) = „20001-09-01‟;
而应使用: SELECT *
FROM service_promotion WHERE gmt_modified
>= TO_DATE(„2001-9-01‟,‟yyyy-mm-dd‟) AND gmt_modified
WHERE id = „123‟; -- id‟s type is number 4. 避免无效的连接:
SELECT count(*)
FROM offer a, count_by_email b WHERE a.email(+) = b.email; 5. 连接(join)时要使用别名: SELECT a.*,b.offer_count(*) FROM offer a, count_by_email b WHERE a.email(+) = b.email; 6. 取TABLE 的META信息: SELECT * FROM table_name
WHERE rowid is null (or rownum = 1 or pk = impossible_value); 可考虑使用: SELECT * FROM table_name WHERE 1 = 0 ;
3.9 关于ALIBABA表的约定
如果使用ALIBABA BZO,设表至少有如下字段: site VARCHAR2(32) gmt_create DATE gmt_modified DATE
如果从IdBizObject继承,则还有一个NUMBER型的列,通常是主键,并与某一个SEQUENCECF 对应;如果从StrIdBizObject继承,则还有一个VARCHAR2型的列。
3.10 列值约定
1. 有固定值列表的列,如status, action, site, 其值取小写;
2. 应尽可能选择数字来代表固定值列表中的值,相应的列定义为NUMBER型;
3. 用CHAR(1)表示布尔值的取大写:“Y”,“N”。
4 安全性设计
4.1 防止用户直接操作数据库的方法
提示:用户只能用账号登陆到应用软件,通过应用软件访问数据库,而没有其它途径操作数据库。
4.2 用户账号密码的加密方法
提示:对用户账号的密码进行加密处理,确保在任何地方都不会出现密码的明文。
5 优化
5.1 Unix性能监控
Unix提供了性能监控命令,用于监控数据库性能和决定数据库的需求。除了为Oracle进程提供统计外,它们还为CPU提供使用统计,为整个系统提供中断、交换、分页和上下文转换功能。监控命令包括:
1. vmstat
vmstat命令报告Unix上的进程、虚拟内存、磁盘、分页和CPU的活动情况。下面命令将显示系统每5秒钟做的事的概要:
% vmstat 5
2. sar
sar命令用于监控交换、分页、磁盘和CPU活动。下面命令用于每10秒显示10次分页活动的概要:
$ sar -p 10 10
3. iostat
iostat命令报告终端和磁盘的活动。该报告显示哪些磁盘是忙的(该信息在平衡I/O负载时有用)。下面命令用于每5秒显示5次终端和磁盘活动:
$ iostat 5 5
4. swap
swap命令报告关于交换空间使用的信息。交换空间的不足可以导致系统悬挂,减慢响应时间。
5. mpstat
mpstat命令报告每个处理器的统计。
5.2 调整内存管理
1. 分配足够的交换空间
内存交换(swapping)可以造成很大的内存开销,应该将它最小化。在Unix上使用sar -w或vmstat -S命令来检查交换。若系统在交换,且需要节省内存,则应采用以下措施:
避免运行不必要的系统daemon进程或应用程序进程;减少数据库缓冲区的数量,以释放一些内存;减少UNIX文件缓冲区的数量(特别是在使用原始设备时)。在Unix上用swap -l命令决定当前正在使用多少交换空间。使用swap -a命令向系统中增加交换区。用系统RAM两到四倍的交换空间启动数据库。若准备使用Oracle Developer、Oracle Applications或Oracle InterOffice,则使用更高的值。监控交换空间的使用,在必要时增加它。
2. 控制分页
内存分页(paging)可能没有交换那样问题严重,因为为了运行,整个应用程序不必全部放在内存中。少量的分页不可能显著地影响系统的性能。为了检测过多的分页,在快速响应或空闲期间运行测量,并与响应迟缓时的测量进行比较。使用vmstat或sar-p监控分页。
若系统有过多的页面活动,则需考虑以下解决办法:
o 安装更多的内存;
o 将一些工作移到另一系统中;
o 配置系统核心使用更少的内存;
o 保持SGA在单个共享内存段中。
o 没有足够的共享内存,将不能够启动数据库。这时,我们可以重新配置UNIX核心,
以增加共享内存。
5.3 调整磁盘I/O
I/O瓶颈是最容易识别的性能问题。跨所有可用的磁盘均匀地平衡I/O,可以减少磁盘存取的时间。对于较小的数据库和不使用并行查询选项的那些数据库,要确保不同的数据文件和表空间跨可用的磁盘分布。
1. 调整DBWR,增加写带宽
Oracle提供以下方法以防止DBWR(数据库写进程)活动成为瓶颈:
使用异步I/O 异步I/O允许进程继续处理下一个操作,而不必等待在发出写后,最小化了空闲时间,因而改善了系统性能。Unix支持原始设备和文件系统数据文件的异步I/O。
使用I/O从属 I/O从属(slave)是专用的进程,其惟一功能是执行I/O。它们代替Oracle 7的多个DBWR特性(实际上它们是多个DRWR的概括,可以由其它进程分布)。不管异步I/O是否可用,它们都可以操作。若设置的话,它们被从LARGE_POOL_SIZE分配,否则从共享内存缓冲区分配。
初始化参数控制了I/O从属的行为,其中DISK_ASYNCH_IO和TAPE_ASYNCH_IO允许分别为磁盘和磁带设备关闭异步I/O(因为每个进程类型的I/O从属缺省为0,除非明确设置,否则没有I/O从属被发布)。
若DISK_ASYNCH_IO或TAPE_ASYNCH_IO无效,则DBWR_IO_SLAVES应该设置大于0,否则DBWR将成为一个瓶颈。在这种情况下,Unix上DBWR_IO_SLAVES的最佳值为4,而在
LGWR_IO_SLAVES的情况下,发布的从属不应该超过9个。
DB_WRITER_PROCESSES代替Oracle 7的参数DB_WRITERS,指定某实例的数据库写进程的初始数量。若使用DBWR_IO_SLAVES,则只有一个数据库写进程被使用,而不管
DB_WRITER_PROCESSES的设置。
2. .使用IOSTAT查找大磁盘请求队列请求队列显示特定磁盘设备上等待服务的I/O请求有多
长。由大量的磁盘I/O或由平均查找时间I/O引起请求队列。磁盘请求队列应该为0或接近于0。
3. 选择合适的文件系统类型 Sun SPARC Unix允许选择文件系统。文件系统有不同特性,它
们用于存取数据的技术对数据库性能有实质性的影响。文件系统通常包括:
o s5:UNIX系统V文件系统;
o ufs:UNIX文件系统(由BSD UNIX派生);
o vxfs:Veritas文件系统;
o 原始设备:没有文件系统。
通常没有事实证明文件系统与文件系统是相配的,甚至不同的ufs文件系统也难以比
较(因为执行不同),尽管ufs通常是高性能的选择,但根据选择文件系统的不同,
性能差别变化也很大。
5.4 监控磁盘性能
使用sar -b和sar -u可以监控磁盘性能。
sar -b对磁盘性能的重要性如下:
1. bread/s、bwrit/s:块读和块写,它们对文件系统而言是非常重要的。
2. pread/s、pwrit/s:分区读和分区写,它们对原始分区数据库系统是非常重要的。
Oracle块大小应该匹配磁盘块大小或是磁盘块大小的倍数。若可能的话,在数据库文件使用文件系统前在分区上做文件系统检查;然后制作一个新的文件系统,确保它是清洁的和不破碎的。尽可能地均匀分布磁盘I/O,将数据库文件与日志文件分开。
5.5 调整CPU的使用
1. 在同一优先权上保持所有Oracle用户和进程在Oracle中,所有用户和后台进程操作在同
一优先级上,修改优先权对竞争和响应时间有意想不到的影响。例如,若LGWR(日志写进程)获得低优先权,则它不能充分地执行,LGWR将成为一个瓶颈;另一方面,若LGWR有高的优先权,用户进程可能要忍受较坏的响应时间。
2. 在多处理器系统上使用处理器亲和力/捆绑在多处理器环境中,使用处理器亲和力/捆绑
(affinity/binding,若它在系统中可用)。处理器捆绑禁止某进程从一个CPU移动到另一个,允许CPU高速缓存中的信息被更好地利用,而且可以捆绑服务器进程,从而充分利用高速缓存(因为它总是活动的,允许后台进程在CPU间流动)。
3. 为Export(导出)/Import(导入)和SQL Loader使用单任务链接
若要在用户和Oracle之间传输大量的数据(如使用Export/Import),使用单任务结构是非常高效的,因为作为单任务链接Oracle可执行程序,允许某用户进程直接存取整个SGA。但运行单任务需要更多的内存。为了使用单任务导入、导出和SQL Loader(sqlldrst)可执行
程序,我们可以调用make文件的ins_rdbms.mk(在$ORACLE_HOME/rdbms/lib目录中)。下面是用于实现单任务导入、导出和SQL Loader(sqlldrst)的可执行程序:
% cd $ORACLE_HOME/rdbms/lib
% make -f ins_utilities.mk singletask
5.6 调整块大小和文件大小
在Unix上,Oracle块缺省值为2KB,可以设置的实际大小为2KB的倍数,最大设置值为16KB。 最优的块大小通常是缺省值,但随着应用程序而变化。为了用不同的Oracle块大小建立数据库,在创建数据库前在initsid.ora文件中增加下面行:db_block_size=new_block_size
5.7 调整Unix缓冲区高速缓存大小
为了充分利用原始设备的优点,我们需要调整Oracle缓冲区高速缓存的大小和Unix缓冲区高速缓存。
Unix缓冲区高速缓存由操作系统提供。它在内存中保存数据的块(在它们被从内存传送到磁盘前,反之亦然)。
Oracle缓冲区高速缓存是在内存中保存Oracle数据库缓冲区的区域。因为Oracle可以使用原始设备,它不需要使用Unix缓冲区高速缓存。
在移动原始设备时,增加Oracle缓冲区高速缓存的大小。若系统中内存的数量是有限的,则相应地减少Unix缓冲区高速缓存的大小。
Unix命令sar可以帮助决定哪些缓冲区高速缓存应该增加或减少:
∙
∙
∙
∙
∙ sar -b:报告Unix缓冲区高速缓存的活动; sar -w:报告Unix内存交换活动; sar -u:报告CPU利用情况; sar -r:报告内存利用情况; sar -p:报告Unix内存分页活动。
通常在缓存命中率上升时,我们需要增加Oracle缓冲区高速缓存的大小,而在交换/分页活动变高时,我们需要减少高速缓存的大小。
软件数据库设计说明书
安徽新型农村合作医疗信息管理系统
目 录
1
文档介绍 ...................................................................................................................................................... 2 1.1 1.2 1.3 1.4 2 3
文档目的 .............................................................................................................................................. 2 文档范围 .............................................................................................................................................. 2 读者对象 .............................................................................................................................................. 2 参考文献 .............................................................................................................................................. 2
数据库环境说明 .......................................................................................................................................... 3 数据库的命名规则 ...................................................................................................................................... 4 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10
命名约定 .............................................................................................................................................. 4 注释说明 .............................................................................................................................................. 5 缩进 ...................................................................................................................................................... 6 断行 ...................................................................................................................................................... 7 大小写 .................................................................................................................................................. 7 主键选择 .............................................................................................................................................. 8 列长度的选择 ...................................................................................................................................... 8 使用SQL语句的约定 ......................................................................................................................... 8 关于ALIBABA表的约定 ................................................................................................................... 9 列值约定 .............................................................................................................................................. 9
4 物理设计 .................................................................................................................... 错误!未定义书签。 4.1
参合管理数据库设计 ........................................................................................ 错误!未定义书签。
5 安全性设计 ................................................................................................................................................ 10 5.1 5.2
防止用户直接操作数据库的方法 ..................................................................................................... 10 用户账号密码的加密方法 ................................................................................................................ 10
6 优化 ............................................................................................................................................................ 10 6.1 6.2 6.3 6.4 6.5 6.6 6.7
UNIX性能监控 ................................................................................................................................... 10 调整内存管理 .................................................................................................................................... 11 调整磁盘I/O ...................................................................................................................................... 12 监控磁盘性能 .................................................................................................................................... 13 调整CPU的使用............................................................................................................................... 13 调整块大小和文件大小 .................................................................................................................... 14 调整UNIX缓冲区高速缓存大小 ...................................................................................................... 14
1 文档介绍
1.1 文档目的
根据安徽新型农村合作医疗信息管理系统数据库系统设计的规范以及参考系统的需求分析说明书;对安徽新型农村合作医疗信息管理系统数据库系统进行描述、设计说明。
1.2 文档范围
● 对安徽新型农村合作医疗信息管理系统数据库开发环境配置描述、介绍 ● 对安徽新型农村合作医疗信息管理系统数据库命名制定规范
● 对安徽新型农村合作医疗信息管理系统数据库的逻辑设计进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库物理设计进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库安全性进行设计、说明 ● 对安徽新型农村合作医疗信息管理系统数据库进行优化说明 ● 对安徽新型农村合作医疗信息管理系统数据库管理与维护说明
1.3 读者对象
本文档读者对象:安徽省卫生厅农村合作医疗处、安徽省卫生厅信息管理中心;项目开发参与对象:系统分析员、高级程序员、程序员、系统测试人员等
1.4 参考文献
● 《新型农村合作医疗信息系统》建设规范;卫生部农卫司 ● 《新型农村合作医疗管理信息系统基本功能规范》;卫生部
● 《新型农村合作医疗管理信息系统需求分析说明书》;湖南泰阳网络科技有限公司
2 数据库环境说明
1.数据库系统采用unix操作系统下的oracle
2.设计工具为Sysbase Powerdesigner Version9.5.0.660 3.编程工具为PL/SQL Developer Version 6.0.5.926 (MBCS) 4.开发环境配置
*.background_dump_dest='D:\ORACLE\admin\nccm3\bdump' *.compatible='9.2.0.0.0'
*.control_files='D:\ORACLE\oradata\nccm3\CONTROL01.CTL','D:\ORACLE\oradata\nccm3\CONTROL02.CTL','D:\ORACLE\oradata\nccm3\CONTROL03.CTL' *.core_dump_dest='D:\ORACLE\admin\nccm3\cdump' *.db_block_size=8192 *.db_cache_size=209715200 *.db_domain=''
*.db_file_multiblock_read_count=16 *.db_name='nccm3'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=nccm3XDB)' *.fast_start_mttr_target=300 *.hash_join_enabled=TRUE *.instance_name='nccm3' *.java_pool_size=20971520 *.job_queue_processes=10 *.large_pool_size=40894464
*.log_archive_dest_1='LOCATION=D:\ORACLE\oradata\nccm3\archive' *.log_archive_format='%t_%s.dbf' *.log_archive_start=true *.open_cursors=300
*.pga_aggregate_target=93323264
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE' *.shared_pool_size=69206016 *.sort_area_size=20971520
*.star_transformation_enabled='FALSE' *.timed_statistics=TRUE *.undo_management='AUTO' *.undo_retention=10800 *.undo_tablespace='UNDOTBS1'
*.user_dump_dest='D:\ORACLE\admin\nccm3\udump'
3 数据库的命名规则
3.1 命名约定
1.是指数据库、数据库对象如TABLE、SEQUENCE、PROCEDURE、COLUMN等的命名约定; 2. 命名富有意义英文词汇,除个别通用的(见列表),要避免使用缩写,多个单词组成的,中间以下划线分割;
3. 除数据库名称长度为1-8个字符,其余为1-30个字符,Database link名称也不要超过30个字符;
4. 命名只能使用英文字母,数字和下划线;
5. 避免使用Oracle的保留字如level、关键字如type(见列表); 6. 各表之间相关列名尽量同名;
7. 数据库的命名:后台数据库命名为“nccm”+表示站点的2-4个字符。测试数据库命名为“nccm”+“TEST”, 开发数据库命名为“nccm3”,用模式(SCHEMA/USER)的不同来区分不同的站点。 8. INDEX命名:table_name+column_name+index_type(1 byte)+idx,各部分以下划线(_)分割。多单词组成的column name,取前几个单词首字母,加末单词组成column_name。如:sample表
member_id上的index: sample_mid_idx news表title上的unique index:news_titile_uidx; 9. SEQUENCE命名:seq_+table_name;
3.2 注释说明
1. 本注释说明主要用于PL/SQL程序及其它SQL文件,其它可作参考; 2. SQLPLUS接受的注释有三种: ―― 这儿是注释 /* 这儿是注释 */ REM 这儿是注释
3. 开始注释,类似JAVAK中的开始注释,主要列出文件名,编写日期,版权说明,程序功能以及修改记录: REM
REM $Header: filename, version, created date,auther REM
REM Copyright REM
REM FUNCTION
REM function explanation REM REM NOTES REM
REM MODIFIED (yy/mm/dd)
REM who when - for what, recently goes first 4. 块注释,如表注释,PROCEDURE注释等,同JAVA: /*
* This table is for TrustPass * mainly store the information
* of TrustPass members */
5. 单行注释,如列注释:
login_id VARCHAR2(32) NOT NULL, -- 会员标识
3.3 缩进
低级别语句在高级别语句后的,一般缩进4个空格: DECLARE
v_MemberId VARCHAR2(32), BEGIN
SELECT admin_member_id INTO v_MemberId FROM company WHERE id = 10;
DBMS_OUTPUT.PUT_LINE(v_MemberId); END;
同一语句不同部分的缩进,如果为sub statement,则通常为2个空格,如果与上一句某部分有密切联系的,则缩至与其对齐: BEGIN
FOR v_TmpRec IN (SELECT login_id,
gmt_created, -- here indented as column above satus
FROM member -- sub statement WHERE site = 'china' AND country='cn' ) LOOP NULL;
END LOOP; END;
3.4 断行
• 一行最长不能超过80字符 • 同一语句不同字句之间 • 逗号以后空格 • 其他分割符前空格 SELECT offer_name ||','
||offer_count as offer_category, id
FROM category
WHERE super_category_id_1 = 0;
3.5 大小写
属于ORACLE的关键字大小,表名、列名等小写。 列类型的选择
• 用CHAR(1)代替布尔值;
• 应尽量使用VARCHAR2代替CHAR类型; • VARCHAR(2)最多4000字符; • DATE精确到微秒,而非天;
• 使用CLOB代替LONG,BLOB代替LONG RAW;
• ORACLE只有NUMBER一种数据类型,使用时请给定长度;
3.6 主键选择
选择有意义的,不太长且能唯一标识记录行的列做主键,没有这种列时,才考虑使用EQUENCE做主健。
3.7 列长度的选择
应当根据实际需要选择列长度。有对应web 页面的,与页面上对应列长度一致。 对数据的验证除数据库端实现外还要尽可能在表现层控制。
3.8 使用SQL语句的约定
1. 尽量避免在循环中使用SQL语句。 2. 避免在WHERE字句中对列施以函数: SELECT *
FROM service_promotion
WHERE TO_CHAR(gmt_modified,‟yyyy-mm-dd‟) = „20001-09-01‟;
而应使用: SELECT *
FROM service_promotion WHERE gmt_modified
>= TO_DATE(„2001-9-01‟,‟yyyy-mm-dd‟) AND gmt_modified
WHERE id = „123‟; -- id‟s type is number 4. 避免无效的连接:
SELECT count(*)
FROM offer a, count_by_email b WHERE a.email(+) = b.email; 5. 连接(join)时要使用别名: SELECT a.*,b.offer_count(*) FROM offer a, count_by_email b WHERE a.email(+) = b.email; 6. 取TABLE 的META信息: SELECT * FROM table_name
WHERE rowid is null (or rownum = 1 or pk = impossible_value); 可考虑使用: SELECT * FROM table_name WHERE 1 = 0 ;
3.9 关于ALIBABA表的约定
如果使用ALIBABA BZO,设表至少有如下字段: site VARCHAR2(32) gmt_create DATE gmt_modified DATE
如果从IdBizObject继承,则还有一个NUMBER型的列,通常是主键,并与某一个SEQUENCECF 对应;如果从StrIdBizObject继承,则还有一个VARCHAR2型的列。
3.10 列值约定
1. 有固定值列表的列,如status, action, site, 其值取小写;
2. 应尽可能选择数字来代表固定值列表中的值,相应的列定义为NUMBER型;
3. 用CHAR(1)表示布尔值的取大写:“Y”,“N”。
4 安全性设计
4.1 防止用户直接操作数据库的方法
提示:用户只能用账号登陆到应用软件,通过应用软件访问数据库,而没有其它途径操作数据库。
4.2 用户账号密码的加密方法
提示:对用户账号的密码进行加密处理,确保在任何地方都不会出现密码的明文。
5 优化
5.1 Unix性能监控
Unix提供了性能监控命令,用于监控数据库性能和决定数据库的需求。除了为Oracle进程提供统计外,它们还为CPU提供使用统计,为整个系统提供中断、交换、分页和上下文转换功能。监控命令包括:
1. vmstat
vmstat命令报告Unix上的进程、虚拟内存、磁盘、分页和CPU的活动情况。下面命令将显示系统每5秒钟做的事的概要:
% vmstat 5
2. sar
sar命令用于监控交换、分页、磁盘和CPU活动。下面命令用于每10秒显示10次分页活动的概要:
$ sar -p 10 10
3. iostat
iostat命令报告终端和磁盘的活动。该报告显示哪些磁盘是忙的(该信息在平衡I/O负载时有用)。下面命令用于每5秒显示5次终端和磁盘活动:
$ iostat 5 5
4. swap
swap命令报告关于交换空间使用的信息。交换空间的不足可以导致系统悬挂,减慢响应时间。
5. mpstat
mpstat命令报告每个处理器的统计。
5.2 调整内存管理
1. 分配足够的交换空间
内存交换(swapping)可以造成很大的内存开销,应该将它最小化。在Unix上使用sar -w或vmstat -S命令来检查交换。若系统在交换,且需要节省内存,则应采用以下措施:
避免运行不必要的系统daemon进程或应用程序进程;减少数据库缓冲区的数量,以释放一些内存;减少UNIX文件缓冲区的数量(特别是在使用原始设备时)。在Unix上用swap -l命令决定当前正在使用多少交换空间。使用swap -a命令向系统中增加交换区。用系统RAM两到四倍的交换空间启动数据库。若准备使用Oracle Developer、Oracle Applications或Oracle InterOffice,则使用更高的值。监控交换空间的使用,在必要时增加它。
2. 控制分页
内存分页(paging)可能没有交换那样问题严重,因为为了运行,整个应用程序不必全部放在内存中。少量的分页不可能显著地影响系统的性能。为了检测过多的分页,在快速响应或空闲期间运行测量,并与响应迟缓时的测量进行比较。使用vmstat或sar-p监控分页。
若系统有过多的页面活动,则需考虑以下解决办法:
o 安装更多的内存;
o 将一些工作移到另一系统中;
o 配置系统核心使用更少的内存;
o 保持SGA在单个共享内存段中。
o 没有足够的共享内存,将不能够启动数据库。这时,我们可以重新配置UNIX核心,
以增加共享内存。
5.3 调整磁盘I/O
I/O瓶颈是最容易识别的性能问题。跨所有可用的磁盘均匀地平衡I/O,可以减少磁盘存取的时间。对于较小的数据库和不使用并行查询选项的那些数据库,要确保不同的数据文件和表空间跨可用的磁盘分布。
1. 调整DBWR,增加写带宽
Oracle提供以下方法以防止DBWR(数据库写进程)活动成为瓶颈:
使用异步I/O 异步I/O允许进程继续处理下一个操作,而不必等待在发出写后,最小化了空闲时间,因而改善了系统性能。Unix支持原始设备和文件系统数据文件的异步I/O。
使用I/O从属 I/O从属(slave)是专用的进程,其惟一功能是执行I/O。它们代替Oracle 7的多个DBWR特性(实际上它们是多个DRWR的概括,可以由其它进程分布)。不管异步I/O是否可用,它们都可以操作。若设置的话,它们被从LARGE_POOL_SIZE分配,否则从共享内存缓冲区分配。
初始化参数控制了I/O从属的行为,其中DISK_ASYNCH_IO和TAPE_ASYNCH_IO允许分别为磁盘和磁带设备关闭异步I/O(因为每个进程类型的I/O从属缺省为0,除非明确设置,否则没有I/O从属被发布)。
若DISK_ASYNCH_IO或TAPE_ASYNCH_IO无效,则DBWR_IO_SLAVES应该设置大于0,否则DBWR将成为一个瓶颈。在这种情况下,Unix上DBWR_IO_SLAVES的最佳值为4,而在
LGWR_IO_SLAVES的情况下,发布的从属不应该超过9个。
DB_WRITER_PROCESSES代替Oracle 7的参数DB_WRITERS,指定某实例的数据库写进程的初始数量。若使用DBWR_IO_SLAVES,则只有一个数据库写进程被使用,而不管
DB_WRITER_PROCESSES的设置。
2. .使用IOSTAT查找大磁盘请求队列请求队列显示特定磁盘设备上等待服务的I/O请求有多
长。由大量的磁盘I/O或由平均查找时间I/O引起请求队列。磁盘请求队列应该为0或接近于0。
3. 选择合适的文件系统类型 Sun SPARC Unix允许选择文件系统。文件系统有不同特性,它
们用于存取数据的技术对数据库性能有实质性的影响。文件系统通常包括:
o s5:UNIX系统V文件系统;
o ufs:UNIX文件系统(由BSD UNIX派生);
o vxfs:Veritas文件系统;
o 原始设备:没有文件系统。
通常没有事实证明文件系统与文件系统是相配的,甚至不同的ufs文件系统也难以比
较(因为执行不同),尽管ufs通常是高性能的选择,但根据选择文件系统的不同,
性能差别变化也很大。
5.4 监控磁盘性能
使用sar -b和sar -u可以监控磁盘性能。
sar -b对磁盘性能的重要性如下:
1. bread/s、bwrit/s:块读和块写,它们对文件系统而言是非常重要的。
2. pread/s、pwrit/s:分区读和分区写,它们对原始分区数据库系统是非常重要的。
Oracle块大小应该匹配磁盘块大小或是磁盘块大小的倍数。若可能的话,在数据库文件使用文件系统前在分区上做文件系统检查;然后制作一个新的文件系统,确保它是清洁的和不破碎的。尽可能地均匀分布磁盘I/O,将数据库文件与日志文件分开。
5.5 调整CPU的使用
1. 在同一优先权上保持所有Oracle用户和进程在Oracle中,所有用户和后台进程操作在同
一优先级上,修改优先权对竞争和响应时间有意想不到的影响。例如,若LGWR(日志写进程)获得低优先权,则它不能充分地执行,LGWR将成为一个瓶颈;另一方面,若LGWR有高的优先权,用户进程可能要忍受较坏的响应时间。
2. 在多处理器系统上使用处理器亲和力/捆绑在多处理器环境中,使用处理器亲和力/捆绑
(affinity/binding,若它在系统中可用)。处理器捆绑禁止某进程从一个CPU移动到另一个,允许CPU高速缓存中的信息被更好地利用,而且可以捆绑服务器进程,从而充分利用高速缓存(因为它总是活动的,允许后台进程在CPU间流动)。
3. 为Export(导出)/Import(导入)和SQL Loader使用单任务链接
若要在用户和Oracle之间传输大量的数据(如使用Export/Import),使用单任务结构是非常高效的,因为作为单任务链接Oracle可执行程序,允许某用户进程直接存取整个SGA。但运行单任务需要更多的内存。为了使用单任务导入、导出和SQL Loader(sqlldrst)可执行
程序,我们可以调用make文件的ins_rdbms.mk(在$ORACLE_HOME/rdbms/lib目录中)。下面是用于实现单任务导入、导出和SQL Loader(sqlldrst)的可执行程序:
% cd $ORACLE_HOME/rdbms/lib
% make -f ins_utilities.mk singletask
5.6 调整块大小和文件大小
在Unix上,Oracle块缺省值为2KB,可以设置的实际大小为2KB的倍数,最大设置值为16KB。 最优的块大小通常是缺省值,但随着应用程序而变化。为了用不同的Oracle块大小建立数据库,在创建数据库前在initsid.ora文件中增加下面行:db_block_size=new_block_size
5.7 调整Unix缓冲区高速缓存大小
为了充分利用原始设备的优点,我们需要调整Oracle缓冲区高速缓存的大小和Unix缓冲区高速缓存。
Unix缓冲区高速缓存由操作系统提供。它在内存中保存数据的块(在它们被从内存传送到磁盘前,反之亦然)。
Oracle缓冲区高速缓存是在内存中保存Oracle数据库缓冲区的区域。因为Oracle可以使用原始设备,它不需要使用Unix缓冲区高速缓存。
在移动原始设备时,增加Oracle缓冲区高速缓存的大小。若系统中内存的数量是有限的,则相应地减少Unix缓冲区高速缓存的大小。
Unix命令sar可以帮助决定哪些缓冲区高速缓存应该增加或减少:
∙
∙
∙
∙
∙ sar -b:报告Unix缓冲区高速缓存的活动; sar -w:报告Unix内存交换活动; sar -u:报告CPU利用情况; sar -r:报告内存利用情况; sar -p:报告Unix内存分页活动。
通常在缓存命中率上升时,我们需要增加Oracle缓冲区高速缓存的大小,而在交换/分页活动变高时,我们需要减少高速缓存的大小。