《2022年数据库产品开发的关键步骤_数据库设计参照 .pdf》由会员分享,可在线阅读,更多相关《2022年数据库产品开发的关键步骤_数据库设计参照 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【 现代信息技术】数据库产品开发的关键步骤数据库设计邓尧伟( 武汉大学武汉430072)摘要 本文结合图书馆数据产品开发的问题, 概括 , 总结了一些数据库设计方面的理论与经验, 对数据库的设计与开发具有一定的实用参考价值。关键词 图书馆数据库设计开发1 DBMS 的支持和数据库设计的关系目 前,流 行 的 DBM S 有 ORACLE 、SYBASE 、 SQLSERVER等。一个 好 的DBMS , 能为开发者提供许多便利, 但是 , 很多数据库应用系统开发者不重视数据库设计的原因 ,也正是因为他们太信赖DBMS,认为购入一个功能强大的DBM S后数据库设计 就不 再 困难、也不再 重 要
2、了。事实上 ,DBMS 只是给用户为已采用的数据库提供一个平台 , 而如何合理使用这个平台, 则完全取决于用户的安排。例如, 我们开发一个金融、证券类文献全文的专业数据库, 该数据库是以二维表为基本管理单元、支持所有关系代数操作的关系型DBM S, 而我们要在这个平台上利用DBM S 提供的功能 , 设计一个适用的数据库, 就牵涉到数据表的设计、索引的策略、存贮过程设计等方面的内容,任何一个方面的设计失误, 都将影响到系统的性能。2数据库设计中几个关键方面2. 1命名的规范规范化的命名, 不仅增加了数据字段的可读性 , 而且为合作开发提供了可能。不同的 DBMS 对对象的命名有不同的要求,因此
3、, 数据库中的各种对象的命名、后台程序的代码编写应采用大小写敏感的形式, 各种对象命名长度最好不要超过30 个字符 , 这样便于应用系统适应不同的数据库。2. 2数据类型的选择关于数据类型的选择问题,是一般数据库开发类书籍首先提到的问题,但这些书籍一般只是对这些数据类型作简要介绍, 很少提及它对数据库性能的影响。其实,数据类型的合理选择对于数据库的性能和操作具有很大的影响。Identify字段不要作为表的主键与其它表关联 ,这将 会 影响 到 该表 的 数据 迁 移。T ext 和 Image 字段属指针型数据, 主要用来存放二进制大型对象(BLOB)。这类数据的操作相比其它数据类型较慢, 因
4、此要避开使用。日期型字段的优点是有众多的日期函数支持 ,因此 , 在日期的大小比较、加减操作上非常简单。但是, 在按照日期作为条件的查询操作也要用函数,相比其它数据类型速度上就慢许多 ,因为用函数作为查询的条件时, 服务器无法用先进的性能策略来优化查询而只能进行表扫描遍历每行。2. 3逻辑数据库和表的建立数据库的逻辑设计, 包括表与表之间的关系是优化数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础。目前主要应用的数据库表的设计方法,是标准化的数据库逻辑设计法,它包括用多的、有相互关系的窄表来代替很多列的长数据表。它具有以下优点:由于表窄 , 因此13第 22 卷
5、第 89期 高校 图 书 馆 工 作2002 年第 3 期名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - 可以使排序和建立索引更为迅速;由于多表, 所以多簇的索引成为可能;便于建立更窄更紧的索引 ;每个表中可以有少一些的索引 , 因此可以提高insert ( 插入 ) 、 update( 更新 ) 、delete ( 删除 ) 等语句的速度 , 因为这些操作在索引多的情况下会对系统性能产生很大的影响 , 而这些操作又是操作数据库
6、所需要大量用到的语句;更少的空值和更少的多余值 ,增加了数据库的紧凑性。但是标准化也会带来一些负面的影响: 它增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能, 因此在这两者之间需要权衡考虑。提到数据库表的设计,就涉及到减少数据冗余的问题。减少数据库冗余的设计思路产生于 20 世纪 70 年代 , 它是促使 DBM S 进步的重要动力之一。但是,减少数据冗余的同时 , 也相应增加了程序开发的难度。在20世纪 80 年代末期 , 我们在一台只有80MB 硬盘的机器上开发图书馆管理系统, 为了节省空间 ,特意在书名和著者字段上设计了溢出处理( 即超
7、过一定长度的书名及著者放到另外一个表中 ) , 但软件开发的难度却因此增加了许多。同样 , 在计算机发展的早期, 为了节省 2 个字节的日期存储空间,而酿成了令全球为之头痛的2000 年问题。今天的世界已进入软件主导的计算机时代。因此,最容易理解、应用开发工作量最少、维护最简单的数据库结构才是最好的。只要数据完整性、 一致性不受威胁 , 有些冗余 , 已根本不成问题。换言之 , 最节 省软件成本 ( 而 不是硬件成本) 的是最好的。2. 4索引的选择与设计创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。大型数据库有两种索引即簇索引和非簇索引 , 一个没有簇索引的表
8、是按堆结构存储数据 , 所有的数据均添加在表的尾部,而建立了簇索引的表, 其数据在物理上会按照簇索引键的顺序存储,一个表只允许有一个簇索引 , 因此 , 根据 B 树结构 , 可以理解添加任何一种索引均能提高按索引查询的速度, 但会降低插入、 更新、 删除操作的性能,尤其是当填充因子(Fill Factor)较大时。 下面, 我们先来讨论一下如何对簇索引和非簇索引进行选择。簇索引是行的物理顺序和索引的顺序是一致的。 一个表只能是有一个簇索引。由于 update,delete 语句要求相对多一些的读操作 , 因此簇索引常常能加速这样的操作。在至少有一个索引的表中, 你应该有一个簇索引。在下面的几
9、个情况下,你可以考虑用簇索引。第一 ,某列包括的不同值的个数是有限的 (但不是极少的) 。第二 ,对经常需要返回一定范围内值的列可以使用簇索引, 比如用between, , = , , = 等等来对列进行操作的列上。如以下的查询语句: select*from 采购表 where采 购 日 期 betw een 5/ 1/ 2001 and 6/ 1/2001 。第三 ,对查询时返回大量结果的列可以使用簇索引。 如以下的查询语句: SELECT*FROM书目表WHERE分类号 = I247. 5当有大量的行正在被插入表中时, 要避免在本表一个自然增长( 例如 ,identity列)的列上建立簇索
10、引。 如果你建立了簇的索引,那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后, 表的最后一个数据页。当一个数据正在被插入(这时这个数据页是被锁定的) , 所有的其他插入行必须等待直到当前的插入已经结束。一个非簇的索引就是行的物理次序与索引的次序是不同的。在一个表中可以有多个非簇索引 ,你可以在以下几个情况下考虑使用非簇索引。第一 ,在有很多不同值的列上可以考虑14第 22 卷第 89 期高校 图 书 馆 工 作2002 年第 3 期名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
11、- - - 第 2 页,共 3 页 - - - - - - - - - 使用非簇索引。例如:一个姓名列在一个著者 表中 ,查询语句为:select*from著 者表where 姓名 = 三毛第二 , 查询语句中用order by 子句的列上可以考虑使用非簇索引了解了如何选择簇索引和非簇索引后,我们要将目光关注到在哪些列上建立索引的问题。首先 , 检查你的查询语句的where 子句, 因为这是查询优化器重要关注的地方。包含在 where 里面的每一列( column)都是可能的侯选索引 , 为能达到最优的性能, 考虑在下面给出的例子: 对于在where子句中给出了 colum nl 这个列。那么
12、 , 下面的两个条件可以提高索引的优化查询性能,第一 : 在表中的 colum nl 列上有一个单索引; 第二 : 在表中有多索引 , 但是colum nl是第一个索引的列。避免定义多索引而columnl 是第二个或后面的索引 ,这样的索引不能优化服务器性能。例如 , 我们在书目数据库中有一个著者表, 包含有著者号、著者名、国别、朝代等列, 那么 , 当我们执行“ SELECT著者号 , 著者名 from 著者表” 这样的查询语句时, 对以下列所建立的索引将对优化器有用; 著者号 ,著者名 + 国别。我们应该尽量考虑使用窄的索引在一个或两个列上 ,因为窄索引比多索引和复合索引更有效。用窄的索引
13、, 在每一页上将会有更多的行和更少的索引级别( 相对与多索引和复合索引而言 ) , 这将推进系统性能。有用的 索 引 会 提 高select语 句 的 性 能,包 括inser t, update, delete。但是 , 一个表的内容的改变 , 将会影响索引 , 因此 , 每一个 insert,update,delete语句将会使性能下降一些。实践表明 ,不要在一个单表上用大量的索引, 不要 在共享的列上( 指在多表中用了参考约束) 使用重叠的索引。2. 5游标的使用游标提供了对特定集合中逐行扫描的手段, 一般使用游标逐行遍历数据, 根据取出的数据不同条件进行不同的操作。尤其对多表和大表定义
14、的游标( 大的数据集合) 循环很容易使程序进入一个漫长的等待甚至死机。因此 ,我们应该尽量避免使用游标,而改用其它的实现方法。例如, 我们要统计图书馆书目数据库中各大类的图书情况, 或许你会用到游标的方法遍历数据库, 然后再根据 条 件 来 判 断 统 计。 但 如 果 我 们 采 用SELECTsum( * )fro m书目库where left( 分类号 , 1) = A ; SELECT sum ( *) from书目库 where left (分类号 , 1) = B这样逐类统计的方法,将极大地提高程序的运行效率。参考文献1. 水木清华BBS 站数据库( database) 版 T e
15、lnet: 202. 112.58.2002.( 美) Steph en W ynkoop著, 张蓉 ,张燕 , 赵红梅等译.SQL Server 7.0 开发指南 ,电子工业出版社3.林凯 , 赵晓华 . 面向对象的关系数据库设计, http:/ /www.ruis 让你的SQL运行得更快 .http:/ / 作者简介 邓尧伟 , 馆员 , 现在广州大学图书馆技术部工作, 武汉大学图书情报学院研究生进修班学员。 收稿时间 2001- 09-10( 敬卿编发 )15邓尧伟 :数据库产品开发的关键步骤数据库设计名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -