出租车管理系统实验课程设计文档格式.docx
《出租车管理系统实验课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《出租车管理系统实验课程设计文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
司机信息表
定义了司机有关信息
司机编号姓名性别地址身份证号驾驶证号发证时间驾龄
租赁表
定义了租赁的有关信息
司机编号车牌号期限开始日期截止日期租赁费车保费
违章表
定义了违章的有关信息
司机编号姓名扣分违章时间
违章地点
出车记录表
定义了每天哪些司机的出车情况
司机编号车牌号出车日期
4.2概念结构设计
4.2.1概念结构设计的方法
概念设计阶段我采用自底向上的方法,即自顶向下的进行需求分析,然后再自底向上的进行概念结构设计。
对已经细化到无法再分的阶段逐步集成在一起,最终合成一个全局概念模式。
4.2.2概念结构设计的步骤
第一步是进行局部视图的设计:
由于高层的数据流图只能反映系统的概貌,而中层流图能较好的反映系统中各局部应用的子系统组成。
因此我们先逐一的设计分E-R图。
第二步是进行视图的集成:
各子系统的E-R图设计好之后,下一步就是要将所有的分E-R图合成一个系统的总E-R图,一般有两个方式,多个分E-R图一次集成,另一种是一次集成两个分E-R图。
我想采用一次集成两个分E-R图的方式。
图4-1出车记录E-R图
图4-2出租车E-R图
图4-3司机R-R图
图4-4租赁E-R图
图4-5违章E-R图
图4-6总体概念结构E-R图
4.3逻辑结构设计
E-R图向关系模型的转换
将上述总体概念结构E-R图转化成关系模型,根据这个关系写出数据依赖,确定数据依赖。
司机与出租车是一对一的关系,司机、出租车与租赁是一对一的关系,司机与违章是一对一的关系。
司机(司机编号,姓名,性别,地址,身份证号,驾驶证号,发证时间,驾龄)
出租车(车牌号,入户时间,车型,颜色,出租情况,营业时间)
租赁表(司机编号,车牌号,期限,开始日期,截止日期,租赁费,车保费)
出车记录表(司机编号,车牌号,出车日期)
违章表(司机编号,姓名,扣分,违章时间,违章地点)
4.4物理设计
物理表结构如下
表4-7司机表(Driver)
列标示
数据类型
长度
约束
列意义
DriverNumber
char
6
主键
司机编号
Name
10
不为空
姓名
Sex
bit
默认
性别
Address
varchar
40
地址
IDumber
20
身份证号
LincenseNumber
驾驶证号
CertificateDate
datetime
发证时间
DriverAge
tinyint
驾龄
表4-8出租车表(Taxi)
TaxiNumber
车牌号
StartDate
入户时间
TaxiShape
车型
Color
颜色
RentSituation
出租情况
BusinessTime
营业时间
表4-9租赁表(Rent)
LimitTime
期限
开始日期
EndDate
截止日期
RentFee
float
租赁费
ProtectionFee
Float
车保费
表4-10违章表(Violate)
Points
扣分
ViolateDate
违章时间
ViolateAddress
违章地点
表4-11出车记录表(Notes)
DriveDate
出车日期
4.5数据库的实施
4.5.1.创建表
/*创建数据库*/
CREATEDATABASETAXI/*数据库名*/
ON
(
NAME=TAXI_DATA,
FILENAME='
D:
\MicrosoftSQLServer\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\TAXI.mdf'
SIZE=10MB,
MAXSIZE=100MB,
FILEGROWTH=10%
)
LOGON
NAME='
TAXI_log'
/*日志*/
\MicrosoftSQLServer\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\TAXI_Log.ldf'
FILEGROWTH=1MB
/*创建基本表*/
/*创建司机表*/
USETAXI
CREATETABLEDriver
DriverNumberchar(6)NOTNULLPRIMARYKEY,/*司机编号*/
Namechar(10),/*姓名*/
SexbitNOTNULL,/*性别*/
Addressvarchar(40)NOTNULL,/*地址*/
IDNumberchar(18)NOTNULL,/*身份证号*/
licenseNumberchar(10)NOTNULL,/*驾驶证号*/
CertificateDatedatetimeNOTNULL,/*发证时间*/
DriverAgetinyintNOTNULL/*驾龄*/
/*创建出租车表*/
CREATETABLETaxi
TaxiNumberchar(6)NOTNULLPRIMARYKEY,/*车牌号*/
StartDatedatetimeNOTNULL,/*入户时间*/
TaxiShapechar(10)NOTNULL,/*车型*/
Colorchar(10)NOTNULL,/*颜色*/
RentSituationbitNOTNULLDEFAULT1,/*出租情况*/
BusinessTimetinyintNOTNULL/*营业时间*/
/*创建租赁表*/
CREATETABLERent
DriverNumberchar(6)NOTNULL,/*司机编号*/
TaxiNumberchar(6)NOTNULL,/*车牌号*/
LimitTimetinyintNOTNULL,/*期限*/
StartDatedatetimeNOTNULL,/*开始日期*/
EndDatedatetimeNOTNULL,/*截止日期*/
RentFeefloatNOTNULL,/*租赁费*/
ProtectionFeefloatNOTNULL,/*车保费*/
PRIMARYKEY(DriverNumber,TaxiNumber)
/*创建违章表*/
CREATETABLEViolate
Namechar(10),/*姓名*/
PointstinyintNOTNULL,/*扣分*/
ViolateDatedatetimeNOTNULL,/*违章时间*/
ViolateAddressvarchar(40)NOTNULL/*违章地点*/
/*创建出车表*/
CREATETABLENotes
DriverNumberchar(6)NOTNULL,/*司机编号*/
TaxiNumberchar(6)NOTNULL,/*车牌号*/
DriverDatedatetimeNOTNULL/*出车日期*/
4.5.2.创建主要视图
视图是从一个或多个表导出的表。
视图是数据库的用户使用数据库的观点。
司机和出租车是主要的实体,而这两个实体的信息又在不同的表中,作为出租车公司对司机和出租车有时关心的数据又是不同的,即使是相同的数据,也可能又不同的操作。
有时候仅有的表的列属性名是不能满足需求的,于是根据不同的需求,在物理的数据库上定义他们对数据库所要求的数据结构。
(1)创建Driver_VIEW视图,包含司机所有的信息
GO
CREATEVIEWDriver_VIEW(司机编号,姓名,性别,地址,身份证号,驾驶证号,发证时间,驾龄)
AS
SELECT*FROMDriver
GO
(2)创建Taxi_VIEW视图,包含出租车的所有信息。
CREATEVIEWTaxi_VIEW(车牌号,入户时间,车型,颜色,出租情况,每天营业时长)
SELECT*FROMTaxi
(3)创建Rent_VIEW视图,包含租赁的所有信息。
CREATEVIEWRent_VIEW(司机编号,车牌号,期限,开始日期,截止日期,租赁费,车保费)
SELECT*FROMRent
(4)建租赁表平均租赁费视图Violate_VIEW_AVG,列名为平均租赁费,试图中列名为RentFee_avg。
CREATEVIEWViolate_VIEW_AVG(平均租赁费)
SELECTAVG(RentFee)
FROMRent
4.5.3.创建索引
索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。
(1)为Driver表的姓名创建唯一索引Driver_name
CREATEUNIQUEINDEXDriver_name
ONDriver(Name)
(2)根据Rent表的司机编号和车牌号创建复合索引。
CREATEINDEXRent_IND
ONRent(DriverNumber,TaxiNumber)
4.5.4.创建表字段的约束关系
数据完整性包括实体完整性,域完整性和参照完整性。
租赁表中的期限的取值肯定要有一定的范围,违章表中的扣分也有范围,租赁表的截止日期必须在开始日期的之后,都可以通过CHECK约束来实现,这就体现了域的完整性。
租赁表中的司机编号和车牌号都由司机表和出租车表中对应,当删除或修改司机表中的司机编号和出租车表中的车牌号也应当对应修改租赁表中的司机编号和车牌号,这体现了表与表之间的参照完整性。
(1)添加Rent表中期限的约束条件。
ALTERTABLERent
ADDCONSTRAINTLimitTime_constraintCHECK(LimitTime>
=0ANDLimitTime<
=10)
(2)添加Violate表中扣分的约束条件。
ALTERTABLEViolate
ADDCONSTRAINTPoints_constraintCHECK(Points>
=0ANDPoints<
=12)
(3)在Rent表中的TaxiNumber列添加外键约束,参照Taxi表中的列
ALTERTABLERent
ADDCONSTRAINTFK_TaxiNumberFOREIGNKEY(TaxiNumber)REFERENCESTaxi(TaxiNumber)
(4)在Rent表中添加日期的约束。
4.5.5.创建存储过程
存储过程分为系统存储过程、扩展存储过程和用户存储过程。
存储过程可以接收参数、返回表格或标量结果和消息,执行存储过程后,就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。
当给定了一个司机的编号或出租车的车牌号时想直接返回该司机或该出租车的信息情况,不需要任何参数,或者使用给定的参数返回信息。
(1)创建返回000001司机的信息情况。
CREATEPROCEDUREdriver_info
AS
SELECT*FROMDriverWHEREDriverNumber='
000001'
/*执行存储过程driver_info*/
EXECUTEdriver_info
/*或者*/
driver_info
(2)创建返回出租车的信息情况。
CREATEPROCEDUREtaxi_info
SELECT*FROMTaxiWHERETaxiNumber='
010001'
/*执行存储过程taxi_info*/
EXECUTEtaxi_info
(3)从Rent表中查询指定司机编号的租赁信息
CREATEPROCEDURErent_info@numberchar(6)
AS
SELECT*FROMRentWHEREDriverNumber=@number
/*执行存储过程rent_info*/
EXECUTErent_info'
000002'
(4)从Violate表中查询指定司机编号的违章情况
CREATEPROCEDUREviolate_info@numberchar(10)='
SELECTPointsAS'
扣分'
FROMViolateWHEREDriverNumber=@number
/*执行存储过程*/
EXECUTEviolate_info/*参数私用默认值*/
EXECUTEviolate_info'
/*传递给@number的实参为*/
4.5.6.创建触发器
当查询一个表中是否存在信息时,或者向表中添加数据时,想显示有无要查的信息或想知道到底有没有执行,可以用触发器对相应的表做更改和显示操作与否。
(1)在Drivr表上创建触发器,每次修改操作时,定义一个变量,让它显示插入成功。
CREATETRIGGERdriver_update
ONDriverAFTERUPDATE
BEGIN
DECLARE@strchar(20)
SET@str='
修改成功'
PRINT@str
END
/*对Driver表更新信息*/
UPDATEDriverSETIDNumber='
372929199106033619'
WHEREDriverNumber='
000004'
(2)当修改Driver表中的司机编号时,修改Rent表中对应的司机编号,同时修改Violate表和Notes表中的司机编号。
CREATETRIGGERrent_update1
DECLARE@old_numberchar(6),@new_numberchar(6)
SELECT@old_number=DriverNumberFROMdeleted
SELECT@new_number=DriverNumberFROMinserted
UPDATERentSETDriverNumber=@new_numberWHEREDriverNumber=@old_number
UPDATEViolateSETDriverNumber=@new_numberWHEREDriverNumber=@old_number
UPDATENotesSETDriverNumber=@new_numberWHEREDriverNumber=@old_number
/*对Taxi表更新信息*/
UPDATEDriversetDriverNumber='
000009'
查看三个表中的变化。
4.5.7.创建用户定义的函数和表值函数
当用户在编程时常常需要将一个或多个T-SQL语句组成子程序,以便反复调用。
这就要用到用户定义的标量值函数和表值函数。
标量值函数返回一个标量值,表值函数返回一个整表。
当想计算得出Rent表中出租车的平均车保费时可以创建一个标量值函数,当想通过给定的司机编号查询已经创建好的Driver_VIEW视图上给定司机编号的相关信息时可以创建一个返回整个表或视图的表值函数来实现。
(1)创建用户定义函数,实现计算出租车的平均车保费。
CREATEFUNCTIONProtectorFee()RETURNSint
BEGIN
DECLARE@feeint
SELECT@fee=
(
SELECTavg(ProtectionFee)FROMRent
)
RETURN@fee
END
/*调用定义的ProtectionFee函数。
*/
DECLARE@feeint
SELECT@fee=dbo.ProtectorFee()
SELECT@feeAS'
出租车的平均租赁费'
(2)创建一个表值函数,实现查询给定司机编号的相关信息。
CREATEFUNCTIONfn_view(@numberchar(6))
RETURNStable
ASRETURN
SELECT司机编号,姓名,性别,地址,身份证号,驾驶证号FROMTAXI.dbo.Driver_VIEW
WHERE司机编号=@number
/*调用定义好的标志函数*/
SELECT*FROMfn_view('
000003'
4.5.8.创建数据库的安全管理角色
数据库的安全性管理是数据库服务器应实现的重要功能和之一。
对用户登录进行身份验证,当用户登录到数据库系统时,系统对该用户的账户和口令进行验证,包括确认用户账户是否有效以及能否访问数据库系统。
对用户进行的操作进行权限控制,当用户登录到数据库后,只能对数据库中的数据在允许的权限内进行操作。
(1)创建SQLServer登录名sql_tao,密码为123456。
CREATELOGINsql_tao
WITHPASSWORD='
123456'
DEFAULT_DATABASE=TAXI
/*将sql_tao用户添加到sysadmin固定服务器角色中。
EXECsp_addsrvrolemember'
sql_tao'
'
sysadmin'
(2)创建数据库用户david
CREATEUSERdavid
FORLOGINsql_tao
WITHDEFAULT_SCHEMA=dbo
/*将david用户添加到sysadmin固定数据库角色中db_owner。
EXECsp_addrolemember'
db_owner'
david'
(3)在TAXI数据库上的用户david授予创建表的权限*/
GRANTCREATETABLETOdavid
/*在TAXI数据库上的用户yangyang授予Driver表操作的权限*/
GRANTUPDATE,INSERTONDriverTOyangyang
WITHGRANTOPTION
五.实验总结
对于这次综合实验,上网看了比较多资料,可以说对我们所学知识