时间:2021-07-01 10:21:17 帮助过:3人阅读
errno为整型的错误信息代码,执行成功返回0。Errno的值的具体含义通过errmsg参数说明,或者通过代码中的注释或文档。
Errmsg为错误信息的字符串描述,这个参数主要用于调试期作为说明,避免在应用程序中使用该值。同时,要注意英文版系统和中文版系统中,信息的语言选择对程序的影响。
1、存储过程的输出记录集:为程序的结构清晰,存储过程最好只返回一个记录集。但在某些为了提高性能的场合,还是可以输出多个记录集
2、记录集中,每个输出的字段最后都指定字段的别名,以面真实的字段名信息流失到客户端,从而加大黑客找到系统漏洞的可能。
1、 所有SQL关键字大写
2、 使用良好的变量命名规范
3、 保持良好的结构,包括空行、缩进和空格等。
4、 块状的语句,一定要写上BEGIN…END
5、 在每个存储过程的开头加上详细的注释:包括存储过程名称、参数说明、功能说明、返回数据集说明、以及作者和版权声明。
6、 每个存储过程内的代码前后必须加上SET NOCOUNT ON 和SET NOCOUNT OFF。
7、 存储过程格式的示例如下:
/*********************************************/
* Name: User_AddUser
* Purpose: Add a user to system
* Parameters: @strUserName the user’s login name
* @strPwd the user’s password, encrypted by MD5
* @errno the error number, it’s a “output” param
* @errmsg the error message, it’s a “output” param
* Returns: the user’s ID, as a result set.
* Author: ahfu, ah_fu126@hotmail.com
* Copyright: CopyRights By SyNet 2005.All Rights Reserved.
* Create At: 2005-03-18 Last Modify: 2005-03-19
/*********************************************/
CREATE PROCEDURE User_AddUser
(
@strUserName varchar(20),
@strPwd varchar(50),
@errno int = 0 OUTPUT,
@errmsg varchar(255)=NULL OUTPUT
)
AS
BEGIN
SET NOCOUNT ON
/*以下是存储过程的代码*/
SET NOCOUNT OFF
END
1、如果对记录的更改操作不止一次,则需要把这些操作写在事务中。
2、事务必须显式提交或者取消。
1、 若无必要,不要使用游标
2、 包含游标的存储过程,必须对性能进行认真测试。
1、为便于在程序的编码期查错,可以在设计数据库的时候尽可能多的加上约束(check)。如,整型的字段的取值范围等,常常为field>0。
2、同理,尽可能地在开发期间使用触发器来验证数据的完整性。
3、如果字段之间存在冗余,应该编写触发器来管理冗余的字段
3、在开发阶段保存完整的主键、外键和唯一索引的约束。
4、原则:编码期间,数据完整性优先于性能。在保障系统正确运行的前提下尽可能的提高效率。
3、 使用ER-WIN设计数据库,同时设计逻辑视图和物理视图(也可以是PowerDesigner等工具,通过ER图形表示出数据表之间的关系)
4、 开发过程中尽量保证设计文档和物理表结构的一致变化
5、 数据库分开发期和运行期两个版本:开发期版本主要体现完整的约束,运行期版本体现效率的优化。
1、在运行阶段删除不必要的约束(check)。
2、尽量不要使用触发器
3、尽量保留主键约束
4、适当删除外键,以提高性能
5、在运行期间,通过分析系统的访问量,创建索引来优化性能
6、分析每个表可能的数据增长量,定义自动拆分表规则。将大表进行拆分来提高性能。
7、预先考虑数据清理规则:在什么情况下删除数据库中的旧数据,以此来提高性能。
8、制定数据库备份和灾难恢复计划。
9、为效率考虑,可以在系统测试阶段适当增加冗余字段,或者冗余表。
10、分页的记录输出必须通过存储过程来实现,不能使用API游标来分页,这样可以提高分页的效率。
案例:网站有200万用户,有很多模块围绕用户提供服务。
为提高效率,每个表最多只保存与用户有关的10万记录,200万条记录拆分到20个表中。编号为1-10万的用户将记录保存到表一,100001-200000编号的记录保存到表二,以此类推。
建立一个拆分信息表,表中保存了哪些表是经过拆分的,拆分到什么程度,拆分规则是什么。
当插入记录的时候,首先判断插入这条记录的用户的ID。存储过程根据ID的范围,自动把表插入到相应的拆分表中去。
当按照条件查询,存储过程自动连接所有的拆分表,丛中筛选出记录。(一般情况下:同类型的查询远远大于按照条件的全体查询)
案例:留言本表中,要保存用户的ID作为外键。通常,通过连接留言表和用户表来得知是哪个用户发布了留言。
为提高效率,在留言本表中增建用户名的字段。插入记录的时候,同时保存用户ID和用户名。这样,当查询时,就不必连接两个表,使效率大大提高。
但是,当用户修改用户名时,要吗更新其他表中的用户名,要吗忽略这种用户名不一致的影响。如何处理取决于用户名在模块中的重要程度。
案例:有用户表和分组表,两个表之间是多对多的关系,建立一个用户与组的关系表来实现这种关系。
用户表中有百万条记录,组表中几千条记录。如果每个用户都属于多个组的化,关联表中将存在几百万条记录。
现在将用户表和关联表进行拆分,拆分规则为用户的ID范围。当查询某用户的组时,效率大大提高。但是当查询某组下的用户时,需要关联所有的拆分表,效率很低。
为提高效率,建立一个冗余的用户和组的关系表,这个关系表中保存第一个关系表中统一的内容,但是拆分规则为组ID的范围。这样,当查询组中的用户时,丛第二个关系表中查询,效率大大提高。
方案一:
1、首先统计得到符合条件的记录数
2、定义表变量:表变量的第一个字段为自增长类型,第二个字段为记录集中的唯一值字段(一般是主键)
3、使用insert () select 语句将符合条件的记录的唯一值字段保存在表变量中。
4、使用where ID in (select ID From 表变量 WHERE ……) 的方法从表两边中读出需要的唯一值字段。
方案二:
1、首先统计符合条件的记录数,并根据页大小计算页数
2、如果读取第一页,直接使用TOP子句读取
3、如果页数在前一半:
结果集1:SELECT TOP CurPage*PageSize Fields FROM Table ORDER BY ID ASC
结果集2:SELECT TOP PageSize * FROM (结果集1) ORDER BY ID DESC
最终结果:SELECT * FROM (结果集2) ORDER BY ID ASC
4、如果页数在后一半:
结果集1:SELECT TOP (PageCount-CurPage)*PageSize Fields FROM Table ORDER BY ID DESC
最终结果:SELECT TOP PageSize * FROM Table ORDER BY ID ASC
海南省人口管理信息系统:
根据人口管理信息系统的数据分布特点,基于客户/服务器体系结构的分布式系统技术,以Oralce数据库系统作为分布式系统基础,设计实现了人口管理信息系统数据库分布式处理的方案。
1 数据库的数据特点与分布式处理分析
一般,人口管理信息系统数据库对全省的人口数据信息进行存储和管理,其数据量庞大,地域覆盖面广,数据录入和访问点分散,数据处理的地域分布性强,传统的中心数据库管理方式难以胜任跨地域的大型数据库管理,因此可采用分布式数据库来存储和管理人口信息数据。
结合海南经济特区的业务特点,人口规模较少,各市分局不参与人口信息管理,因此海南省人口信息数据管理可采用省厅-市局-派出所三级模式;另外,由于其业务办公地点也很分散,故人口管理信息系统需要采用分布式运行方式。根据分布式数据库系统设计场地自治原则,在每一存放数据的独立节点上至少要建立一个数据库,也可在同一地点建立多个数据库,以满足不同的应用需要。据此在省厅和市局设立多个物理数据库,通过网络和数据库链路将它们联系在一起,组成统一的全局数据库。
2 分布式数据库的设计
数据库设计原则
系统的主要任务是获得人口管理所需要的数据,这些数据包括人口基本信息、身份证信息、图像信息、代码信息、尾码分配信息等,人口信息数据项多,且涉及到许多数据表和字典表,因此在设计数据库时,要根据这些信息之间的关系,建立相应的数据表及相互之间的约束等。由于存储和管理大量数据,故应建立一个良好的数据组织结构和数据库,使整个系统都可以快速、方便、安全、准确地调用和管理数据。在PMIS的数据库具体设计过程中,采用了如下的设计原则:
(1) 采用开放的多层分布式数据访问结构;
(2) 满足关系数据库理论的3NF,同时为兼顾编程的方便性适当地保留了数据冗余,从而提高整个系统的效率;
(3) 充分利用数据字典功能。
分布式数据库系统结构
整个系统采用客户/服务器体系结构,用标准的SQL进行数据存取,实现数据分布式处理,各节点负责维护本地数据库的完整性,通过分布式数据库管理系统,实现各节点数据库的动态连接与分布操作。各市人口信息数据存放在市局的数据库中,在省厅的数据库中则分别建立到各市局的数据库链路,省厅通过视图创建或快照查询这些数据,市局和派出所用户直接访问市局数据库服务器中的数据。另外,各派出所之间不能直接进行数据相互操作,跨所信息查询通过市局数据库上的视图或快照完成,跨市人口信息查询则通过在市局上建立同省厅数据库表名或视图名等相应的同义词完成。这样,利用远程数据库的表名或视图名等相应的同义词可实现数据的透明访问,通过快照进行定期复制以实现远程数据的非实时访问。分布式数据库系统拓扑结构如下图1 所示。
系统采用了集中-分布式相结合的数据库存储方案,各市局间通过专线数据共享,最终形成了全省人口
数据的分布式方案。派出所数据库操作通过远程拔号能直接访问本地市局数据库或将与本所相关的数据信息下载本地,在本地进行处理后,再上传到对应的市局服务器上,由市局通过后台的数据更新模块把各派出所所做的增、删、改等反映到市局数据库中。对于异地数据访问可通过公安计算机网利用Oracle提供的分布式数据库技术实现对远程数据库的透明访问。派出所、市局、省厅通过市局间的分布式数据库实现对全省人口信息共享。
数据复制技术
海南省人口管理信息系统为分布式数据系统,数据库服务器多点分布在省厅和各市局。省厅数据库服务器存储管理全省的人口信息,各市局服务器存储管理本市的人口信息,遍布各地的数据库服务器需要及时而有效地交换信息,省厅数据库服务器通过专线和各市局服务器相连进行实时通信。由于分布式数据库的存储和管理分布在多点进行,如何确保各数据库服务器数据信息的完整性是关键问题。本系统采用Oracle的数据复制技术,通过建立数据库链路,配置主群组,定期将各市局数据库的人口数据信息复制到省厅数据库服务器。另外复制技术还用于在分布式系统中分布处理负载,并使流动的工作人员能与主数据站点取得联系。
分布式数据查询和数据更新处理
对远程数据库的表或视图的访问操作,通过数据库链路采用SELECT、INSERT、UPDATE、DELETE等语句对数据进行。其中,数据库链路定义了指向远程数据库的一条路径,由DBA或应用程序开发者或网络服务创建,它对分布式数据库的用户是透明的。
在进行数据访问时,倘若要访问的数据来自同一个表,根据需要直接访问该表或基于该表的视图或快照;如果所要访问的数据来自不同的数据表,可通过连接操作或相应的视图来实现,视图中各数据项的来源有以下几种情况:来自同一数据库中的一个表或多个表;来自同一结点不同数据库中的两个表或多个表;来自不同结点上数据库中的两个或多个表。要查询省厅的数据,则先要建立各市局的数据快照,然后查询该快照。
对于同一结点的数据更新,由于市局和派出所能直接访问,因此直接存取本地数据表;对于不同结点的数据更新,可以直接存取本地数据表,也可创建远程表的可读写视图,用户直接访问这些视图来实现一些复杂的数据访问。
在大学时的分布式数据库读书笔记 拿出来分享
标签: