《图书馆管理系统的设计与实现论文.doc》由会员分享,可在线阅读,更多相关《图书馆管理系统的设计与实现论文.doc(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、图书管理系统设计及实现摘 要本系统主要完成对图书仓库库存管理,包括图书入库、出库、库存,员工信息,供应商信息以及密码管理等六个方面。系统可以完成对各类信息浏览、查询、添加、删除、修改、报表等功能。 系统核心是入库、库存与出库三者之间联系,每一个表修改都将联动影响其它表,当完成入库或出库操作时系统会自动地完成库存修改。查询功能也是系统核心之一,在系统中即有单条件查询与多条件查询,也有精确查询与模糊查询,系统不仅有静态条件查询,也有动态生成条件查询,其目都是为了方便用户使用。系统有完整用户添加、删除与密码修改功能,并具备报表打印功能。 系统采用Microsoft Office中Access 200
2、0来设计数据库,并使用当前优秀开发工具Delphi 6.0 ,它有着最为灵活数据库结构,对数据库应用有着良好支持。 论文主要介绍了本课题开发背景,所要完成功能与开发过程。重点说明了系统设计重点、设计思想、难点技术与解决方案。关键字:数据库,SQL语言,Delph 6,数据库组件,仓库管理目 录第一章 引言 1.1 课题来源 1.2 开发工具选择 1.3 所做主要工作 第二章数据库开发工具 2.1 Delphi 6.0 简介 2.2 Delphi 6.0 控件 2 ADO数据访问组件 2.2.2 数据控制类DataControl 2.2.3 数据访问类DataAccess 2.2.4 SQL语言
3、在Delphi中应用 第三章 系统总体设计 3.1 系统需求分析 3.2 系统概要设计 3.2.1 系统结构设计 3.2.2 数据库设计 3.2.2.1 ER图设计 3.2.2.2 数据库表格设计 3.3系统详细设计 第四章 系统应用程序设计 4.1 系统窗体模块组成4.2 数据模块窗体设置4.3 主窗体功能模块实现4.4 入库、出库窗体模块实现4.5 查询功能实现4.6 系统登陆窗体模块实现4.7 用户管理功能实现 4.7.1 用户管理主窗体 4 密码修改窗体模块实现 4.7.3 用户注册窗体模块实现 4.7.4 用户注销窗体模块实现 结束语 致谢 参考文献 第一章 引 言 1.1 课题来源
4、随着社会经济迅速发展与科学技术全面进步,计算机事业飞速发展,以计算机及通信技术为基础信息系统正处于蓬勃发展时期。随着经济文化水平显著提高,人们对生活质量及工作环境要求也越来越高。书籍做为人类精神食粮,在现代社会中越来越受到重视,大量书籍出现在市场上,人们有了各种各样不同选择。及此同时,为了管理大量图书,图书仓库也大量出现,仓库管理问题也就提上了日程。随着图书大量增加,其管理难度也越来越大,如何优化仓库日常管理也就成为了一个大众化课题。在计算机飞速发展今天,将计算机这一信息处理利器应用于仓库日常管理已是势必所然,而且这也将为仓库管理带来前所未有改变,它可以带来意想不到效益,同时也会为企业飞速发展
5、提供无限潜力。采用计算机管理信息系统已成为仓库管理科学化与现代化重要标志,它给企业管理来了明显经济效益与社会效益。主要表达在:极大提高了仓库工作人员工作效率,大大减少了以往入出存流程繁琐,杂乱,周期长弊端。基于仓库管理全面自动化,可以减少入库管理、出库管理及库存管理中漏洞,可以节约不少管理开支,增加企业收入。仓库管理操作自动化与信息电子化,全面提高了仓库管理水平。随着我国改革开放不断深入,经济飞速发展,企业要想生存、发展,要想在激烈市场竞争中立于不败之地,没有现代化管理是万万不行,仓库管理全面自动化、信息化则是其中极其重要部分。为了加快仓库管理自动化步伐,提高仓库管理业务处理效率,建立仓库管理
6、系统已变得十分心要。入库、库存、出库还是现在企业图书仓库管理常规基本模式,虽然,最近又出现了很多新管理模式,如:基于零库存思想沃尔玛特管理方式,但这些新思想在中国大部分企业管理中还是难以实现。所以如何设计好仓库管理系统,尽可能地减少仓库管理重复性与低效性就成为当前最为重要问题。图书仓库管理核心是入库、库存与出库之间联系,如何处理好三者之间关系是系统最为关键部分。另外,员工信息与供应商信息管理也是仓库管理中一个必不可少部分,它提供着及入库与出库相关地一些信息,使得整个系统更加完整,更加实用。通过对仓库管理日常工作详细调查,搜集了大量资料,从系统结构组织,功能实现,技术要求以及可行性等多方面进行考
7、虑,认为本课题是一个适应现今图书仓库管理需求计算机信息管理系统,具有一定实际开发价值与使用价值。1.2 开发工具选择自Java诞生以来,随着Internet技术普及与应用需求变化,以第四代语言为主应用开发产品发生了较大变化,它们不仅已成为人们开发应用开发工具,而且很多产品已发展成为一种强有力应用开发环境。这些新型开发工具通常以一种集成软件包形式提供给开发人员,被称为Studio(工作室)或Suite(程序组)。例如,微软Visual Studio 6.0,Borland公司Delphi 6.0等数据库辅助开发工具。现在,市场上可以选购应用开发产品很多,流行也有数十种。目前在我国市场上最为流行、
8、使用最多、最为先进可用作企业级开发工具产品有:Microsoft公司Visual Basic 6.0版Microsoft公司Visual C+6.0版Borland公司Delphi 6.0版在目前市场上这些众多程序开发工具中,有些强调程语言弹性及执行效率;有些则偏重于可视化程序开发工具所带来便利性及效率得高,各有各优点与特色,也满足了不同用户需求。然而,语言弹性与工具便利性是密不可分,只有便利工具,却没有弹性语言作支持,许多特殊化处理动作必需要耗费数倍工夫来处理,使得原来所标榜效率提高优点失去了作用;相反,如果只强调程语言弹性,却没有便利工具作配合,会使一些即使非常简单界面处理动作,也会严重地
9、浪费程序设计师宝贵时间。而Delphi是一个非常理想选择。Delphi 6 是操作系统中快速应用开发环境最新版本。它也是当前Windows平台上第一个全面支持最新Web服务快速开发工具。无论是企业级用户,还是个人开发者,都能够利用Delphi 6 轻松、快捷地构建新一代电子商务应用。Delphi 6 是惟一支持所有新出现工业标准RAD环境,包括XML(扩展标记语言)/XSL(可扩展样式语言),SOAP(简单对象存取协议)与WSDL(Web服务器描述语言)等。Delphi 6 是可视化快速应用程序开发语言,它提供了可视化集成开发环境,这一环境为应用程序设计人员提供了一系列灵活而先进工具,可以广泛
10、地用于种类应用程序设计。在Delphi 6 集成开发环境中,用户可以设计程序代码、运行程序、进行程序错误调试等,可视化开发方法降低了应用程序开发难度。Delphi基础编程语言是具有面向对象特性Pascal语言,即Object Pascal 。Object Pascal具有代码稳定、可读性好、编译速度快等优点,并将面向对象概念移植到了Pascal语言中,使这种基础语言有了新发展空间。使用Delphi 6.0 ,我们几乎可以作任何事情,还可以撰写种各种类型应用程序,动态链接库(DLL)、CON、或CORBA对象,CGI/ISAPI程序,Microsoft Back Office应用程序。程序规模小
11、到简单个人数据库应用,大到复杂企业多层次分布式系统,都可以使用Delphi进行开发,其友好集成开发界面,可视化双向开发模式,良好数据库应用支持高效程序开发与程序运行,备受广大程序开发人员好评。尤其是Delphi对数据库应用强大支持,大大提高了数据库应用软件开发效率,缩短了开发周期,深受广大数据库应用程序设计人员喜爱。Delphi为数据库应用开发人员提供了丰富数据库开发组件,使数据库应用开发功能更强大,控制更灵活,编译后程序运行速度更快。1.3 本文所做工作引言部分介绍了本系统课题来源以及对数据库开发工具选择。第二章介绍了数据库发展,关系数据库,数据库体系结构,并系统介绍了SQL语言,为设计与理
12、解应用程序做了铺垫。第三章系统介绍了Delphi 6.0及其部分控件,SQL语言在Delphi 6.0中应用,以及Access等。第四章是本文主体,按照软件工程要求,从需求分析开始,经过概要设计最后到详细设计,完成对整个系统设计。第五章根据第四章设计结果利用Access 2000与Delphi 6.0进行了具体窗体与应用程序设计。总结部分介绍了设计体会与编程体会,并指出了系统设计中不足与改进方向第二章 数据库开发工具2.1 Delphi 6.0 简介Delphi类可以粗略地分成两部分:一部分是组件类,这些组件类通常以某种方式出现在组件面板上,当用户从组件面板上点取一个类图标后,在程序中就自动生
13、成了该类对象(非可视组件除外);另一部分是功能类,这此功能类对象通常出现在程序代码中,起着不可代替作用,但是这些功能类在组件面板上是找不到。在Delphi中,每一个类祖先都是Tobject类,整个类层次结构就像一棵倒挂树,在最顶层树根即为Tobject类。这样,按照面向对象编程基本思想,就使得用户可用Tobject类这个类型代替任何其它类数据类型。实际上在Delphi类库中,Tobject类派生出了为数相当众多子类,它们形成了一个庞大体系,通常情况下,如果不自行开发组件,就不必了解整个类体系结构,只用到类层次树叶结点就足够了。凡是做过程序开发人都知道从来没有单纯数据应用程序,也就是说,数据库应
14、用程序必须与用户界面(可以是图形界面,也可以是命令接口)元素相结合,只讲界面或只讲数据库本身都构不成数据库应用程序,因而用Delphi 6.0开发数据库应用程序就隐含着界面开发。Delphi6中VCL组件可用图3-1来说明。组件在Delphi程序开发中是最显眼角色。大家知道,在编写程序时一般都开始于在组件面板上选择组件并定义组件间相互作用。但也有一些组件不在组件面板上,例如Tform与Tapplication(典型非可视组件)。组件是Tcomponents派生出来子类,可以流形式存放在DFM文件中,具有事件与Publish属性。窗口组件类是窗口化可视化组件类,在Delphi类库中占有最大份额。
15、在实际编程中,窗口组件类对象都有句柄,可以接受输入焦点与包含其它组件。图形组件及窗口组件并列,是另一大类组件。图形组件不是基于窗口,因而不能有窗口句柄,不能接受输入焦点与包含其它组件。从图8-43中可以看出,图形组件基类是TgraphicControl,在实际编程中,它们必须寄生于它们宿主窗口组件类对象,由它们拥有者负责其显示,而且它们还能触发一些与鼠标活动相关事件。图形控件最典型例子是Tlabel与TspeedButton。由此可以看出图形组件功能很弱,有读者会问图形组件用处何在呢?其实使用图形组件最大好处在于节省资源,正是因为它们功能较弱,所以使用系统资源就要少。在一个应用程序中,如果能在
16、不影响其功能前提下合理大量地使用图形组件,将会大减少程序对系统资源消耗。非可视组件是及可视组件相并列另一类组件,非可视组件在程序运行中是不可见(除各种对话框组件之外,事实上有人认为对话框组件不能归入非可视组件,应该是另一种介于可视及非可视之间组件)。2.2 Delphi 6.0 控件用Delphi6开发数据库应用,重点是与各种数据库组件打交道,当然也要使用其它一些组件,现在就我在系统设计中所使用重要组件给及简单介绍。2 ADO数据访问组件ADO数据对象(Active Data Objects)实际是一种提供访问各种数据类型链接机制。ADO设计为一种极简单格式,通过ODBC方法同数据库接口中,可
17、以使用任何一种ODBC数据源,即不止适合于SQL Server、Oracle、Access等数据库应用程序,也适合于Excel表格、文本文件、图形文件与无格式数据文件。ADO是基于OLE-DB之上技术,因此ADO通过其内部属性与方法提供统一数据访问接口方法。ADO使您客户端应用程序能够通过OLE DB提供访问与操作在数据库服务器中数据。ADO支持用于建立C/S与Web应用程序主要功能。其主要优点是易于使用、高速度、低内存支出与占用磁盘空间较少。ADO同时具有远程数据服务(RDS)功能,通过RDS可以在一次往返过程中实现将数据从服务器移动到客户端应用程序与Web页、在客户端对数据进行处然后将更新
18、结果返回服务器操作。Delphi 6.0继续对MicrosoftADO访问能力支持。这种能力是通过一组新组件实现,这些组件是在企业版ADO组件页中,在组件面版ADO页上可以找到这些组件。利用在前面章节提到TdataSet抽象类,ADO组件可以不通过BDE而直接实现ADO连接。这意味着只需要很少代码就可以实现该连接并且性能得到提高。利用ADO数据访问组件,可以只使用ADO结构及数据库取得联系并对其中数据进行操作,而在这些过程中完全不需要使用BDE。大多数ADO连接与数据集组件都是及基于BDE连接与数据集组件相类似。TADOConnection组件及基于BDE应用程序中Tdatabase组件类似。
19、TADOTable及Ttable,TADOQuery及Tquery,以及TADOStoreProc与TstoredProc之间都具有这种类似对应关系。使用这些ADO组件方式及我们常使用数据访问组件(基于BDE)都有许多相同之处。TTADODataSet没有直接BDE对应组件,但它提供了许多及Ttable与Tquery相同功能。同样,TADOCommand也没有相对应BDE组件,它是在Delphi/ADO环境中完成特定功能组件。Delphi 6.0通过ADO数据集访问组件,可以不借助BDE数据引擎而是通过微软OLEDB来访问更为广泛数据库中数据。ADO数据集访问组件及常用数据访问组件是并列关系。
20、在系统中我主要使用是ADOTablet与ADOQuery两个组件。2.2.2 数据控制类DataControl数据控制类负责数据库数据显示,并把用户对数据修改传回。这里绝大多数组件,如DBText, DBEdit, DBMemo, DBImage, DBListBox, DBComboBox, DBCheckBox, DBRadioGroup, DBLookupListBox, DBLookupCombox, DBCtrGrid功能与对应非数据感知组件相同,如TEdit框,TRadioGroups单选按钮组等,只不过在显示数据库数据时要用而已。在系统中主要使用数据网格控件DBGrid与数据库导
21、航器控件DBNavigator。2 数据访问类DataAccess数据库应用系统中数据访问是一个首要问题,包括单用户与 C/S系统,都必须联系一些数据库与数据表文件。Delphi 6 提供了专门用于数据访问基类控件。主要包括数据源控件DataSource、客户数据集控件ClientDataSet、数据集提供器控件DataSetProvider等等。Tdatabase:当一个基于BDE数据库应用程序需要一个永久数据库连接时,需要定制向一个数据库服务器连接时,需要事务控制与特殊数据库别名时就得用到Tdatabase对象。特别是当连接到一个远程SQL数据库服务器时,如果要利用BDE进行数据库事务处理
22、,那么,TDatabase对象威力就表达出来了。在一个应用程序中为每一个数据库连接显示声明Tdatabase对象要根据需要而定,不是必需。对一个数据库连接,如果没有显示声明并实例化TDatabase对象,系统就会产生一个带有默认属性TDatabase对象。TdataSource对象用于在DataSet对象(包括Tquery,TstoredProc,Ttable等)与数据感知组件之间提供一个连接纽带,以便在窗体上显示数据库中数据,在数据库中导航定位及编辑数据集中数据。如果一个DataSet对象中数据想在数据感知组件中显示与修改,它就必须与TdataSource对象相联系。同样,一个数据感知组件如
23、果想与数据源相联系以便显示与操纵数据,就必须以TDataSource对象为中介。用Delphi6作数据库应用开发概括来说如下:先利用数据存取组件与实际数据库建立连接,并用Tsession对象与Tdatabase对象管理这些连接。然后以Tdatasource对象为中介,用数据感知组件向用户显示数据库内容并接受用户查询与修改等操作。2 SQL语言在Delphi中应用在Delphi中使用SQL语言非常方便,一般来说,都是通过Tquery组件来使用SQL语言。可以在TQuery组件SQL属性中设置SQL语句。设计程序时,在该组件属性对话框中选择SQL属性,单击带省略号按钮,就可以打开String Li
24、st Editor对话框,然后我们就可以在对话框中添加SQL语句。还可以使用DelphiSQL Builder来自动生成SQL语句,这样可以避免手工编写SQL而可能造成语法错误。静态SQL语句在程序设计时便已固定下来,它不包含任何参数与变量。动态SQL语句,也被称作参数化语句,在其中间包含着表示字段名或表名参数,例如下面语句是一条动态SQL语句:Select * From Students Where StudentCode =: StudentCode;其中变量StudentCode便是一个参数变量,它由一个冒号引导,在程序运行过程中,必须要为该参数赋值,该条SQL语句才能正确执行,每次运行
25、应用程序时可以为该参数变量赋予不同值。为参数赋值有三种方法:根据参数在SQL语句中出现顺序,设置TQuery部件Params属性值为参数赋值。直接根据SQL语句中各参数名字,调用ParamByName方法来为各参数赋值。将TQuery部件DataSource属性设置为另一个数据源,这样将另一个数据源中及当前TQuery部件SQL语句中参数名相匹配字段值赋给其对应参数。利用这种方法也能实现所谓连接查询,创建主要明细型数据库应用。在程序运行过程中,要想设置TQuery部件SQL属性,必须首先调用Close方法,关闭TQuery部件,然后再调用Clear方法清除SQL属性中现存SQL命令语句, 最后
26、再调用Add方法为SQL属性设置新SQL命令语句。例如:Query1.Close 关闭Query1)Query1.SQL.Clear 清除SQL属性中SQL命令语句Query1.SQL.Add(Select * From Students);Query1.SQL.Add( Where Name =Lucy );在为TQuery部件设置SQL属性时调用Close方法总是很安全,如果TQuery部件已经被关闭了,调用Close方法时不会产生任何影响。在应用程序中为SQL属性设置新SQL 命令语句时,必须要调用Clear方法以清除SQL属性中现存SQL命令语句,如果不调用Clear方法,便调用Add
27、方法向SQL属性中设置SQL命令语句,那么新设置SQL命令语句会追加在现存SQL命令语句后面, 在程序运行时常常会出现出乎意料查询结果甚至程序无法运行下去。在这里要特别注意,一般情况下TQuery部件SQL属性只能包含一条完整SQL语句,它不允许被设置成多条SQL语句。当然有些数据库服务器也支持在TQuery部件SQL属性中设置多条SQL语句,只要数据库服务器允许这样,我们在编程时可以为 SQL 属性设置多条SQL语句。在为TQuery部件设置完SQL属性属性值之后,也即编写好适当SQL程序之后,可以有多种方式来执行SQL程序。在设计过程中,设置完TQuery部件SQL属性之后将其Active
28、属性值置为True, 这样便可以执行SQL属性中SQL程序,如果应用中有及TQuery部件相连数据浏览部件( 如TDDGrid TDBEdit等)那么在这些数据浏览部件中会显示SQL程序执行结果。在应用程序运行过程中,通过程序调用TQuery部件Open方法或ExecSQL 方法可以执行其SQL属性中SQL程序。Open方法与ExecSQL方法是不一样。Open方法只能用来执行SQL语言查询语句(Select命令), 并返回一个查询结果集,而ExecSQL方法还可以用来执行其它常用SQL语句(如INSERT, UPDATE, DELETE等命令),例如:Query1.Open (这样会返回一个
29、查询结果集)如果调用Open方法,而没有查询结果时,会出错。此时应该调用ExecSQL 方法来代替Open方法。如:Query1.ExecSQL (没有返回结果)当然在设计应用程序时,程序设计人员是无法确定TQuery部件中SQL 语句是否会返回一个查询结果。对于这种情况应当用TryExcept模块来设计程序。在 Try 部分调用Open方法,而在Except部分调用ExceSQL方法,这样才能保证程序正确运行。Delphi中用ADOQuery来使用SQL语句同样十分方便。在ADOQuery组件中首先通过ConnectionString属性值来联接数据源,然后就通过双击SQL属性值来写入SQL
30、语句。在Delphi中调用数据库,就可以调用ADOQuery组件,通过修改其中SQL属性中SQL语句来实现对数据库各项操作。值得注意是,ADOQuery组件只有在激活情况下才可以被正确地使用,这样就提出了一个问题,也就是说,在每次修改ADOQuery组件SQL属性时都必须先行进行关闭,待清除掉SQL中所有SQL语句后才可以添加新SQL语句。而且,在每一次修改完成以后,还应该记得重新将ADOQuery激活。其它使用方法及TTQuery有许多相似之处。第三章 系统总体设计软件系统总体设计大约要经历可行性分析与项目开发计划,需求分析,概要设计,详细设计,编码,测试以及维护等七个阶段。可行性分析与项目
31、开发计划在前面已经叙述,下面所要做是进行软件需求分析,概要设计与详细设计。编码过程将在下一节论述,而测试与维护过程不在本文叙及。3.1 系统需求分析在经过前一阶段分析之后,我确定了我开发课题为图书仓库管理。现在所要做是要准确定义系统必须做什么以及系统必须具备功能。软件需求分析中我采用结构化分析方法(Structured Analysis,简称SA),SA是面向数据流进行需求分析方法,像所有软件分析方法(如面向对象分析方法、IDEF方法等等)一样,SA也是一种建模活动,它使用简单易读符号,根据软件内部数据传递、变换关系,自顶向下逐层分解,描绘满足功能要求软件模型。在系统中我采用数据流图(DFD)
32、这种半形式化描述方式表达需求。它是一种功能模型,以图形方式描绘数据在系统中流动与处理过程,只反映系统必须完成逻辑功能。它有四种基本图形符号: :箭头,表示数据流; :圆或椭圆,表示加工; :双杠,表示数据存储; :方框,表示数据源点或终点。为了表达较为复杂问题数据处理过程,用一张数据流图是不够,要按照问题层次结构进行逐步分解,并以一套分层数据流图反映这种结构关系。在这里我一共使用了三层数据流图,即顶层图,0层图与1层图(也是底层图)。在多层数据流图中,顶层流图仅包含一个加工,它代表被开发系统,它输入流是该系统输入数据了,输出流是该系统输出数据;底层流图是指其加工不需要再做分解数据流图,中间层流
33、图表示对其上层父图细化,它每一步加工可能继续细化成子图。经过对系统分析首先得到系统顶层DFD,如下:一步细化得到系统0层DFD,如下:再进一步细化每一个数据加工功能,得到系统1层DFD图。在这里只给出有关入库管理与出库管理1层数据流图,它们是系统关鍵部分,也是主要部分。通过以上对数据流图分析之后,我们已大体地了解了系统功能与目标,接下来所要做就是系统功能模块划分与数据库设计,也就是系统概要设计。3.2 系统概要设计在软件需求分析阶段,搞清楚了软件“做什么”问题,形成了目标系统逻辑模型。现在我们所要做就是要把软件“做什么”逻辑模型变换为“怎么做”物理模型,即着手实现软件需求。首先,我们需要描述是
34、系统总体系结构。3 系统结构设计系统概要设计中最重要就是系统模块化。模块化是指解决一个复杂问题时自项向下逐层把软件系统划分成若干个模块过程。每个模块完成一个特定功能,所有模块按某种方法组织起来,成为一个整体,完成整个系统所要求功能。将系统划分为多个模块是为了降低软件系统复杂性,提高可读性、可维护性,但模块划分不能是任意,应尽量保持其独立性。也就是说,每个模块只完成系统要求独立子功能,并且及其他模块联系最少且接口简单,即尽量做到高内聚低耦合,提高模块独立性,为设计高质量软件结构奠定基础。在系统概要设计中我采用结构化设计(Structure Design,简称SD),SD以需求分析阶段产生数据流图
35、DFD为基础,按一定步骤映射成软件结构。我首先将整个系统化分为几个小问题,小模块,在系统中,我设计了用户管理、库存管理、入库管理、出库管理、员工管理与供应商管理6个小模块。然后,进一步细分模块,添加细节。比如,用户管理我又将其分为用户注册、用户注销、密码修改;库存管理分为库存记录查询、库存记录修改、库存记录打印等等。以下就是系统结构图:(在这里为了表达方便我将结构图分开来表达。) 在得到系统第一层功能模块图后,经过进一步地细化,得一系统子功能模块图:3 数据库设计在信息世界中,信息从客观事物出发流经数据库,通过决策机构最后又回到客观世界,信息这一循环经历了三个领域:信息世界,数据世界,现实世界
36、。现实世界事物反映到人头脑中,人大脑对它有个认识过程,经过分析(选择、命名、分类等)进入信息世界。这些信息再进一步加工、编码,然后进数据世界,而软件系统开发工作需要考虑这两个方面问题,也就是要考虑系统开发所需要数据,以及如何对这些数据进行操作。这两个问题贯穿了整个软件系统开发过程,这也就是数据库设计问题,软件设计一个核心。3.1 ER图设计在系统设计开始,我首先考虑是如何用数据模型来数据库结构及语义,以对现实世界进行抽象。目前广泛使用数据模型可分为两种类型,一种是独立于计算机系统“概念数据模型”,如“实体联系模型”;另一种是直接面向数据库逻辑结构“结构数据模型”。在本系统中我采用“实体联系模型
37、”(ER模型)来描述数据库结构及语义,以对现实世界进行第一次抽象。ER模型直接从现实世界抽象出实体类型及实体间联系,然后用ER图来表示数据模型。它有两个明显优点:接近于人思维,容易理解;及计算机无关,用户容易接受。但ER模型只能说明实体间语义联系,不能进一步说明详细数据结构,它只是数据库设计第一步。ER图是直观表示概念模型工具,它有四个基本成分: 矩形框,表示实体类型(考虑问题对象)。 菱形框,表示联系类型(实体间联系)。 椭圆形框,表示实体类型与联系类型属性。对于关键码属性,在属性名下划一横线。直线,联系类型及其涉及实体类型之间以直线连接。本系统为图书仓库管理,主要管理图书入库、出库以及库存
38、等事项。仓库根据需要可以查询图书供应商信息,同时还需要了解在入库与出库中员工参及情况。依据仓库管理实际情况,考虑了多方面因素以后,确定系统ER图如下:(为了表达方便,在这里我没有在一张图上表达出所有关系,而是用一张总体ER图,与几张实体属性关系图来表达数据库结构。)在该数据库中,我设计了三个实体,分别是库存、员工与供应商以及两个联系类型入库与出库。在本系统中库存是核心,也是基本,没有了库存其它也就没有什么意义了。员工记录添加是考虑到责任问题,也就是说,在仓库管理实际运用中,出现了责任不清现象,特别是由于仓库进出图书数量都比较大时产生了一系列问题,所以在设计数据库时,我特别考虑到这一点,加入了员
39、工记录这一实体。供应商信息添加主要出于对图书来源问题思考。通过添加供应商信息可以比较清楚地了解图书进货渠道,从图书质量到供应商信誉都可以进行了解,同时可以为以后图书进购提供一定有用信息。入库联系类型将库存信息、供应商信息与员工信息联系在一起,可以方便地实现三个实体之间联接,而出库联系类型则将库存信息与员工信息较好地联接起,同时这两个联系类型又都具有各自特有属性。下面就是各实体及联系类型属性图:(带#号属性为关键字段)4.2.2.2 数据库表格设计在完成系统ER图之后,需要将ER模型转化为关系模型,也就是说,要设计出数据库所需要表格。在这里,我选用是关系数据库。因为关系数据库中二维表格可以很清楚
40、地描述数据之间联系。在这里不得不提到一个概念范式。其实在上一节ER图设计中,已经运用了范式思想,不仅如此,在数据库表格设计中更离不开范式思想,它是数据库设计基础,如果不注意这个问题将会导致一系列问题出现。我在系统中定义表格都严格地按照范式思想与要求去完成,数据库中所有表格都达到了三范式要求。根据系统ER图,针对本系统特点,在对所搜集数据进行规范化之后,定义了如下六张表格,分别是库存信息表,入库信息表,出库信息表,员工信息表,供应商信息表与密码信息表。通过对这六张表格操作可以较好地完成系统设计各项功能,六张表格之间有着不同程度联系。(说明:在以下数据表中,K代表主键,#代表外键,字段值不为空。)
41、BookRecord 表(库存信息表)字段名称 数据类型 说明K BookID 数字 图书编号BookName 文本 图书名Author 文本 作者Publisher 文本 出版社PubDate 日期/时间 出版日期Price 货币 价格BookType 文本 图书类型Number1 数字 库存数量Addation 文本 备注图3.13 库存信息表库存信息表主要用于记录仓库中现存放所有图书详细信息,包括图书编号、书名、作者、出版社、图书类型等有关图书各类信息,它即是该数据库主表,也是系统主界面主要内容。在该表中图书编号是主键,它按图书入库先后次序来编写,每当有图书入库,系统自动给出图书编号,这
42、样我们按图书编号来查找图书是比较方便。考虑到编号比较难于记忆,所以使用了出版社与图书类型两个字段,在系统中我提供了出版社与图书类型分类查找,而且全部采用自动生成,每当系统中有新出版社类型与图书类型,弹出菜单会自动添中新类型,这样就可以比较方便地实现按出版社与按图书类型查找。此外,库存数量也是一个比较关键字段,该字段是在系统初始化时就给定,每当有图书入库或出库操作,系统就会自动修改图书库存数量,以保持数据一致性。做为备注有一点说明,我数据库中备注数据类型是文本,而不是备注类型,主要考虑到该字段长度并不大,而且在Delphi中文本数据类型处理也比较方便一点。Employee 表(员工信息表)字段名
43、称 数据类型 说明K EmployeeID 数字 员工编号EmployeeName 文本 员工姓名Sex 文本 性别BornDate 日期/时间 出生日期Grade 文本 职称WorkDate 日期/时间 工作日期Telephone 文本 联系 Address 文本 图3.14 员工信息表员工信息表主要用于记录有关员工各类信息,包括姓名、职称、出生日期、联系 、 等。它主要用来为系统提供员工有关信息,因为在系统中,入库与出库操作均及员工有着一定联系,在查询入库信息与出库信息时,有时需要查找有关此项记录有关员工信息,在系统中我是通过入库记录及员工记录(出库记录与员工记录)之间联接查询来完成。另外
44、,作为一个仓库也有必要了解其所属员工一些基本情况,以便查询。Shopkeeper 表(供应商信息表)字段名称 数据类型 说明K ShopkeeperID 数字 供应商编号ShopkeeperName 文本 供应商姓名Address 文本 地址PostNo 数字 OfficePhone 文本 办公 HomePhone 文本 住宅 Email 文本 E-mailPayType 文本 付款方式 图3.15 供应商信息表供应商信息表主要用于记录有关供应商各类信息,包括姓名、地址、 、付款方式等。它主要用来为系统提供供应商有关信息,在系统中入库记录是及供应商记录相联系,通过入库记录可以查找相关供应商信息
45、。在供应商信息中,考虑当实际情况,我特别加入了Email与付款方式这两个字段,因为在当今信息世界中,多种多样通讯方式与多种多样付款方式是必然,是数据库中必须及以记录。InRecord 表(入库信息表)字段名称 数据类型 说明K InID 数字 入库编号# BookID 数字 图书编号# EmployeeID 数字 员工编号# ShopkeeperID 数字 供应商编号Number 数字 入库数量BuyDate 日期/时间 入库日期 图3.16 入库信息表OutRecord 表(出库信息表)字段名称 数据类型 说明K OutID 数字 出库编号# BookID 数字 图书编号# Employee
46、ID 数字 员工编号Number2 数字 出库数量OutDate 日期/时间 出库日期 图3.17 出库信息表入库信息表主要用于记录有关入库详细信息,包括入库数量、入库日期以及图书、员工、供应商三方编号,以便查询。出库信息表主要用于记录有关出库详细信息,包括出库数量、出库日期以及图书、员工编号。出库信息表与入库信息表一样,其实它们都属于联系类型,系统通过这两个表可以联接上其它表为用户提供多种条件联接查询。值得提出一点是入库记录与出库记录添加不仅仅是单表操作,由于它们都及库存记录相联系,所以,无论您是添中入库记录还是添加出库记录,都必须同时修改库存记录,以保持数据一致性,否则将引发系统出错而这些我都让其在系统中自动完成。无论您是添加入库记录,还是添加出库记录,系统都将自动修改库存中图书数量,而且,在您出库数量大于库存数量时,系统还会自动提示错误,这样就可以防止一定错误发生。在入库信息表与出库信息表中我还定义了几个外键,它提供了一种表示几个关系联系方法。比如,系统中