汽车租赁公司CIS数据库系统的设计
中文摘要
据网络资料:我国目前拥有驾驶证的公民多达3000万,而且,这一数量每年还在以一定比例上升。我们了解到在这批人当中有许多是短期内暂时买不起车辆的,但他们中的绝大部分人需要临时用车,而且也有临时租车的支付能力,因此,经营性租赁有极其巨大的市场需求。作为汽车租赁公司有必要建设一个适合自己发展和服务的数据库系统来完善自己的业务,并且能够及时更新客户、供货商以及市场变化的信息。
目录
一、需求分析的详细描述
二、数据库设计
1.E-R图
2.精确化过程
3.SQL实现
三、数据库应用开发
1.流程图或各功能组成框图
2.主要模块介绍
1)模块功能
2)模块流程图
3.应用开发环境:语言、数据库
4.程序开发过程
四、操作说明
五、参考文献
一、 需求分析的详细描述
中国汽车租赁以80年中国国际信托投资公司用跨国租赁方式为北京市租赁一批汽车作为开始,已经经历了将近二十年的发展。汽车租赁也从仅仅为外事活动和旅游提供服务发展到为寻常百姓服务。投资汽车租赁的企业越来越多,全国大中城市基本都有汽车租赁公司存在,用于租赁的车辆总数不断扩大。
据网络资料:我国目前拥有驾驶证的公民多达3000万,而且,这一数量每年还在以一定比例上升。我们了解到在这批人当中有许多是短期内暂时买不起车辆的,但他们中的绝大部分人需要临时用车,而且也有临时租车的支付能力,因此,经营性租赁有极其巨大的市场需求。
许多汽车租赁公司都看好汽车租赁市场的前景并纷纷投资,如北京今日新概念、浙江联通、上海安吉三公司等等。但是由于汽车的价值较大,汽车租赁公司在租车客户的选择方面采取谨慎做法,对客户采取较为严格的资格审查。目前,个人要想租赁汽车,租赁公司一般要求客户提供租赁公司所在地的户口本、驾驶证、身份证;若为单位租车,则要求提供注册于租赁公司所在地的租车单位营业执照副本、法定代表人的身份证、驾驶证等证件,在必要时,还要求客户提供相应的担保。
为此,作为汽车租赁公司有必要建设一个适合自己发展和服务的数据库系统来完善自己的业务,并且能够及时更新客户、供货商以及市场变化的信息。根据中国汽车租赁的现状和国际汽车租赁的发展经验,中国汽车租赁企业要走的是一条规模化和网络化的道路。
DBS013G汽车租赁公司很清楚地认识到了这些背景和状况,我们需要对变化的市场来设计我们自己的CIS以适应市场的竞争。
如下即为设想方案:
整个CIS系统分为四个部分:客户信息、服务信息、资源信息、供货商信息。
就客户信息而言,我们所需要了解的信息包括:客户的姓名(或单位名)、家庭地址(或单位地址)、联系电话和电子信箱。
对于服务信息,应该说有:车型需求、租车日期、还车日期、价格查询。
公司内部的资源内容,我们觉得可以有如下部分组成:车型、车量状况、租车单价、汽车行驶公里数。
而供货商的信息包括厂商名称、联系电话、车型与汽车数量。
二、数据库设计
以下是三个阶段性报告(E-R图,精确化过程,SQL实现)
1.E-R图,其中有些属性和名称在后来的数据库设计中有所改动.
2.模式求精和范式化过程:
根据E-R图中的实体集和关系图,初步确立了以下几个关系模式:
1).Clients(cid:int,cname:string,caddress:string,cphone:string,email:string,id_number:string)
简化为:R=(I,N,A,P,E,D)
函数依赖集F=(I->NAPED)
已经满足BCNF的条件.
2).Cars(csn:int,type:string,state:string,mile:int,price:int)
简化为:R=(C,T,S,M,P)
函数依赖集F=(C->TSMP,TS->P)
其中TS->P 不满足BCNF条件,分解成(C,T ,S,M)和(T,S,P)后,满足BCNF的条件.
3).Rroviders(pname:string,pphone:string,pcount:int,ptype:string)
简化为:R=(N,P,C,T)
函数依赖集F=(N->PCT),满足BCNF的条件.
4).Reserves(cid:int,csn:int,bdate:datetime,rdate:datetiem)
简化为:R=(I,S,B,R)
函数依赖集F=(IS->BR),满足BCNF的条件.
因此,得到以下5个关系模式:
1).Clients(cid:int,cname:string,caddress:string,cphone:string,email:string,id_number:string)
2).Cars(csn:int,type:string,state:string,mile:int)
3).Rroviders(pname:string,pphone:string,pcount:int,ptype:string)
4).Reserves(cid:int,csn:int,bdate:datetime,rdate:datetiem)
5). Price(type:string,state:string,price:int)
根据以上5个关系模式,在SQL Server创建了数据库taxi,并为每一个关系模式创建了一个表
分别是:client_info,car_info,provider_info,reserve_info,price_info.
3.SQL语句
从SQL Server 导出的sql文件得到的:
/****** Object: Database taxi Script Date: 2004-9-11 14:41:45 ******/
IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'taxi')
DROP DATABASE [taxi]
GO
CREATE DATABASE [taxi] ON (NAME = N'taxi_Data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL$INCE1\data\taxi_Data.MDF' , SIZE = 2, FILEGROWTH = 10%) LOG ON (NAME = N'taxi_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL$INCE1\data\taxi_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)
COLLATE Chinese_PRC_CI_AS
GO
exec sp_dboption N'taxi', N'autoclose', N'true'
GO
exec sp_dboption N'taxi', N'bulkcopy', N'false'
GO
exec sp_dboption N'taxi', N'trunc. log', N'true'
GO
exec sp_dboption N'taxi', N'torn page detection', N'true'
GO
exec sp_dboption N'taxi', N'read only', N'false'
GO
exec sp_dboption N'taxi', N'dbo use', N'false'
GO
exec sp_dboption N'taxi', N'single', N'false'
GO
exec sp_dboption N'taxi', N'autoshrink', N'true'
GO
exec sp_dboption N'taxi', N'ANSI null default', N'false'
GO
exec sp_dboption N'taxi', N'recursive triggers', N'false'
GO
exec sp_dboption N'taxi', N'ANSI nulls', N'false'
GO
exec sp_dboption N'taxi', N'concat null yields null', N'false'
GO
exec sp_dboption N'taxi', N'cursor close on commit', N'false'
GO
exec sp_dboption N'taxi', N'default to local cursor', N'false'
GO
exec sp_dboption N'taxi', N'quoted identifier', N'false'
GO
exec sp_dboption N'taxi', N'ANSI warnings', N'false'
GO
exec sp_dboption N'taxi', N'auto create statistics', N'true'
GO
exec sp_dboption N'taxi', N'auto update statistics', N'true'
GO
use [taxi]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_reserve_info_car_info]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[reserve_info] DROP CONSTRAINT FK_reserve_info_car_info
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_reserve_info_client_info]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[reserve_info] DROP CONSTRAINT FK_reserve_info_client_info
GO
/****** Object: Table [dbo].[reserve_info] Script Date: 2004-9-11 14:41:48 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[reserve_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[reserve_info]
GO
/****** Object: Table [dbo].[car_info] Script Date: 2004-9-11 14:41:48 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[car_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[car_info]
GO
/****** Object: Table [dbo].[client_info] Script Date: 2004-9-11 14:41:48 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[client_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[client_info]
GO
/****** Object: Table [dbo].[price_info] Script Date: 2004-9-11 14:41:48 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[price_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[price_info]
GO
/****** Object: Table [dbo].[provider_info] Script Date: 2004-9-11 14:41:48 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[provider_info]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[provider_info]
GO
/****** Object: Table [dbo].[car_info] Script Date: 2004-9-11 14:41:50 ******/
CREATE TABLE [dbo].[car_info] (
[csn] [int] NOT NULL ,
[type] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[state] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[mile] [int] NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[client_info] Script Date: 2004-9-11 14:41:51 ******/
CREATE TABLE [dbo].[client_info] (
[cid] [int] NOT NULL ,
[cname] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[caddress] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cphone] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[email] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[id_number] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[price_info] Script Date: 2004-9-11 14:41:51 ******/
CREATE TABLE [dbo].[price_info] (
[type] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[state] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[price] [int] NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[provider_info] Script Date: 2004-9-11 14:41:52 ******/
CREATE TABLE [dbo].[provider_info] (
[pname] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[pphone] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[pcount] [int] NOT NULL ,
[ptype] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[reserve_info] Script Date: 2004-9-11 14:41:52 ******/
CREATE TABLE [dbo].[reserve_info] (
[cid] [int] NOT NULL ,
[csn] [int] NOT NULL ,
[bdate] [datetime] NOT NULL ,
[rdate] [datetime] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[car_info] WITH NOCHECK ADD
CONSTRAINT [PK_car_info] PRIMARY KEY CLUSTERED
(
[csn]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[client_info] WITH NOCHECK ADD
CONSTRAINT [PK_client_info] PRIMARY KEY CLUSTERED
(
[cid]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[reserve_info] WITH NOCHECK ADD
CONSTRAINT [PK_reserve_info] PRIMARY KEY CLUSTERED
(
[csn]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[price_info] WITH NOCHECK ADD
CONSTRAINT [IX_price_info] UNIQUE NONCLUSTERED
(
[type],
[state]
) ON [PRIMARY]
GO
CREATE INDEX [IX_car_info] ON [dbo].[car_info]([type], [state]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[reserve_info] ADD
CONSTRAINT [FK_reserve_info_car_info] FOREIGN KEY
(
[csn]
) REFERENCES [dbo].[car_info] (
[csn]
),
CONSTRAINT [FK_reserve_info_client_info] FOREIGN KEY
(
[cid]
) REFERENCES [dbo].[client_info] (
[cid]
)
GO
三、数据库应用开发
1.流程图或各功能组成框图
根据系统的需求分析,整个系统的四个部分分为五个模块。其中客户信息、资源信息、供货商信息分别单独作为一个模块,服务信息分解为订单信息和价格查询两个模块,各个模块分别操作数据库中的一张表。整个系统的工作流程图如下:
开始
结束
管理主界面
车辆信息
客户信息
订单信息
价格信息
供货信息
是否退出
是
否
程序开始后,进入程序主界面,在程序的主界面中,可以选择进入各个单独的模块,进行相应的信息查询和管理。在各个单独的模块中,刚进入显示所有的信息,根据需要可以对相应的信息进行插入,删除,修改以及查询的操作。
2.主要模块介绍
1)系统分为五个主要模块,五个模块的内容虽然不同,但是他们的功能和进行的操作是类似的:
客户信息用来对注册客户的信息进行管理,根据用户的注册情况可以增删客户信息,或者对其进行修改。
车辆信息用来对公司现有的出租车的信息进行管理,购进新的车辆后,可以新加车辆信息,车辆报废后,可以删除相关信息,还可以对车辆的行车里程等进行修改。
订单信息当注册客户网上或者其他方式定车后,添加到数据库中,对错误的订单信息也可以删除,编辑。
价格信息模块没有提供很多的功能,只能对价格进行范围查询,没有提供添加删除功能。
供货商信息模块可以显示各个供货商的信息,可以完成添加,删除,编辑,查询等功能。
2)各个模块的流程图如下图所示:
进入模块
显示所有记录
选择一条记录
删除记录
编辑
增加记录
修改记录
查询
显示结果
重读数据库
退出模块
退出
是
是
是
是
是
否
否
否
否
否
是
否
3.应用开发环境:语言、数据库
应用程序采用Visual C++ 6.0开发,采用的示对话框的形式,后台数据库采用的示SQL Serve 2000。用Visual C++开发数据库有简单、灵活、访问速度快、可扩展性好、可访问不同种类的数据库等特点。用Visual C++6。0进行数据库应用的开发,主要有五种数据库的访问技术:ODBC API,MFC ODBC,DAO,OLE DB和ADO 技术。
我们在程序中采用的是ADO技术来对数据库进行操作。ADO 是目前在Windows环境中比较流行的客户端数据库编程技术。ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等等)和极其简单、易用的编程接口,因而得到了广泛的应用。
ADO技术提供了如同DAO一样的采用对象模型的数据库访问技术,但它提供了比DAO和RDO(远程对象访问)更加灵活的技术以及更加广泛的应用。ADO技术简化了OLE DB的操作,OLE DB的程序中使用了大量的COM接口,而ADO封装了这些COM接口,所以ADO是一种高层的访问技术。
以下是ADO程序的编程模型:
.初始化COM库,引入ADO库定义文件。
.用Connection对象连接所需的数据库。
.利用建立好的连接,通过Connection,Command对象执行SQL命令,或者利用Recordset对象取得结果集。
.使用Connection对象进行事务处理。
.关闭连接,释放对象。
在ADO编程模型中,Connection对象,Command对象,Recordset对象是三个最主要的ADO对象。其中Connection对象代表了打开的,与数据源的连接,代表与数据源进行的唯一会话,在用ADO访问数据库之前,必须先建立一个连接对象,然后才能打开到数据库的连接。Command对象用来执行SQL语句命令,特别是所执行的SQL语句中含有参数是,用Command对象执行比较方便。Recordset对象用来获得进行数据库操作后的结果集,也可以通过结果集的增加,删除,修改来将结果返回到数据库。
在用ADO对象设计应用程序中虽然没有可以供使用的MFC类,但有一些ADO的支持类可以方便地使用ADO对象。利用智能指针_ConnectionPtr、_RecordsetPtr等可以方便的创建连接对象、记录集对象等ADO对象。
程序中使ADO连接SQL Server数据库。SQL Server 2000是微软公司最新版的大型数据库服务器,在经历了SQL Server 6.5和7.0两个版本的尝试后,微软公司终于开始向大规模的业务领域进发了。记得在以前各种关于SQL Server的文章,都会将其定位成中小型应用方面,这种感觉被大家自然的延续到了2000版之中。其实这是一种误解。在过去的很长一段时间中,微软公司凭请了世界上最优秀的数据库专家以及专门搭建了信息量可谓空前的地理信息系统,励精图治,就是为了摘掉扣在自己头上的这顶帽子。有了强大的性能和功能支持,再配合其一向为人称道的易用性,SQL Server可以说成为了开发者进行数据库开发的很好的选择。
4.程序开发过程
程序中直接使用ADO对象,这样可以更容易地控制对数据库的访问。
(1)配置好数据源,保证程序能正确访问数据库。
(2)在VC中用向导新建一个基于对话框的工程。在相应的头文件中导入ADO动态链接库文件,并在程序的初始化函数中初始化COM环境。
(3)添加一个新的对话框,为新生成的对话框类添加相应的成员变量,如ADO对象m_pConnection,m_pRecordset,在对话框的初始化函数中打开连接,并取得结果集。
(4)在新的对话框中,添加控件,并为各个控件添加事件处理函数,完成相应的数据库的操作。
(5)在主对话框中添加控件处理函数,调用刚才的对话框模块。
(6)编译执行,处理错误直到正确。
(7)以后每添加一个模块,重复(3),(4),(5),(6)
(8)后来为了对数据库连接进行验证,并处理不同的数据库,添加了新的对话框,用于输入连接数据库时输入SQL Server服务器的用户名和密码。
四、操作说明
1.本程序在Visual C++6。0下编译通过,Window XP环境下运行通过。
2.首先配置好ODBC数据源,设好SQL Server访问的用户名和密码。程序运行前,确保所需要的数据库已经添加到ODBC数据源系统DSN中,名称为taxi。程序本来是直接用SQL Server的用户名和密码进行连接,但考虑到程序对不同的数据库设置的通用性,在打开每个模块对话框时都会要求输入SQL Server数据库的用户名和密码,进行连接。
3.必须保证数据库及相应表的正确性。现在遇到的问题就是用SQL Server 的SQL导出向导导出的SQL脚本,只能生成相应的数据库和表。但是表中却没有数据记录,这是运行程序时应该注意的。
4.程序中缺少对错误的相应处理。由于各种原因,尤其是涉及到数据库的各种操作,必然会出现各种运行时的错误。例如,输入的数据库的用户名和密码不正确,就不能正确地连接数据库,就会发生错误。还有当向数据库中添加记录,删除记录,修改记录时,也可能会发生各种数据库地操作造成的运行时错误。由于程序的简陋导致对这些错误的处理不是很好。这是运行程序时应该注意的。
5.各个模块对话框的查询只需要查询的时候输入SQL语句的Where子句部分。以客户信息查询为例:需要查询编号为101的客户,只需输入“cid=101”就可以了,查询完成后,相应的编辑框中会显示整个查询的SQL语句。如果对相应的数据库中的列名不清楚可以查看List Control控件中相应的列,在列名后的小括号中就是相应的列在数据库中的列名。
6.各个单独的模块由主界面对话框的相应按钮启动,各个模块都是以模态对话框的形式出现。关闭各模块对话框后,回到主界面对话框。在主界面对话框中,也有一些程序操作的提示。
7.程序中的各个模块以模态对话框的形式出现,因此每次只能处理一个模块。
8.ADO技术是基于COM的,确保能正确导入相应的动态连接库文件。
9.也许程序中还有一些没发现的错误,由于各方面的原因没有得到完善。
10.程序中用到的ADO动态链接库文件在文件夹复制到了DLL文件夹中。
五、参考文献
数据库管理系统 周立柱等译 ,清华大学出版社出版
Visual C++面向对象与可视化程序设计 黄维通 编著,清华大学出版社出版
Visual C++网络与数据库编程 臧桂鹏 肖佳放 顾松东编著,中国电力出版社出版
VC数据库编程实践 韩存兵编著,科学出版社出版
Visual C++6.0 数据库开发与工程实践 求是科技编著,人民邮电出版社出版