分享

木舟| 数据库与软件(第六单元) | 2022年“二次学习微视频”12

 木舟u2497sll0j 2022-09-16 发布于上海
(建议在WIFI环境下观看)

PPT及讲稿

现代社会,我们使用计算机等设备将信息保存在各类存储设备中。但在信息系统中,我们一般使用数据库来存储数据,本视频将介绍数据库和软件设计的相关知识。

信息系统中流转的数据的存储和处理常常借助数据库来实现。数据库系统包括数据库和数据库管理系统,其中数据库提供了数据存储的场所,数据库管理系统包含有各类应用程序,提供了数据的查询、保存、修改、删除等操作。数据库有很多种,其中关系型数据库是常见的一种。

关系型数据库中的数据可以看作是一张张的“二维表”,也称为数据表,每个数据表都有单独的名字,即“表名称”。数据表中的每一行称为一个“记录”,每一列称为一个“字段”。

以学生数据库为例,它包含多个二维数据表,如这里的高一综合实践表、成绩表以及健康指数表等。在成绩表中,字段名有“学籍号”“姓名”以及各科成绩等,下面的每一行记录了一名同学的相关数据。在健康指数表中,也包含有“学籍号”“身高”等字段,下面的每一行记录了一名同学的健康数据。我们看到,这两个表中的“学籍号”字段,在两个表中都有,且对于某位同学来说是唯一的,这个字段可以称为“关键字段”,通过这个“学籍号”字段,可以将多个表关联起来,这也是关系数据库名称的由来。

数据库共有四项基本操作,我们以智能停车系统的部分场景为例,进行简单的说明。
一是增加记录。在车辆入场时,需要增加增加一个新的记录用以保存车牌号码和入场时间。但要注意,这时候这个新增加记录的其它字段暂时是空的。
二是查询记录。我们在查询车辆位置时,系统按照我们输入的车牌号,在数据库中查找对应的记录,并将其中的停车位置信息返回给查询机显示。
三是修改记录。当车辆驶入某一车位后,系统采集获得车位号码。此时,修改对应的停车记录,将原先的空白停车位置字段更新为车位号码。
四是删除记录。可以依据车牌号码,删除对应的某一条记录;也可以删除所有记录。但在一般的智能停车系统中,一条记录会保留较长时间,不会离场即删除。

接下来我们以一个示例看看数据库的基本操作。“王先生驾驶车牌号为沪BACD34 的车辆于2022328:00:00入场。在离开前,他查询了车辆所停车位。并于当天的12:10:00离场。”我们建立一个关系型数据库,并将其中的一个二维数据表的名称定义为“cars”,在这个数据表中,设计几个字段,其中用car_plate表示车牌号码 checkin_time表示入场时间 checkout_time表示出场时间等。

在模拟车辆入场时,数据库操作前,并不存在车牌号为BACD34”的车辆记录。操作后,在系统中增加了一条包含车牌号和入场时间的记录。在结构化查询语言中,增加记录的命令格式是“Insert into 表名(字段名1,字段名2,... values (1, 2,...)”,迁移到这个示例中,就应该是“Insert into cars(car_plate,checkin_time) values('BACD34', '2022-03-02 8:00:00')”

如果我们要查询这台车辆的记录,可以在系统中输入车牌号,系统就会显示这个记录。在结构化查询语言中,查询记录的命令格式是“Select 列名称 from 表名称 where 列名称 = 某值”,迁移到这个示例中,就应该是“Select  car_plate   from cars  where  car_plate='沪BACD34

在模拟车辆出场时,数据库操作前,车牌号为BACD34”的车辆记录的“checkout_time”(出场时间)是空的。车辆出场后,该字段被填入了相应的内容。这个过程其实是是修改了这条记录。在结构化查询语言中,修改记录的命令格式是“Update 表名 set 字段名 = where <条件>”,迁移到这个示例中,就应该是“Update cars set checkout_time='2022-03-02 12:10:00' where car_plate= 'BACD34'”

模拟删除车辆记录,操作前,有两条记录,删除后,第二条记录将消失。在结构化查询语言中,删除记录的命令格式是“Delete from 表名 where <条件>”。我们要注意,命令格式中的“where”是个条件语句,在这里以及前面的几个操作中不能省略。比如在这里如果用这个语句“Delete from cars”是错误的,可能会导致删除整个二维数据表的错误,正确的语句应该是“Delete from cars where car_plate= 'ABCD12' ”075806

我们继续以智能停车场系统为例,看看该系统中的数据处理。如前所述,车辆入场、停车入位、智能寻车等场景,各自实现了相应的功能,对应的是数据库中的增加、修改、查询等操作,这些都属于信息系统中针对数据库的操作。而在车辆出场时,需要根据收费规则,计算停车费用。这就要求“设计算法、编写程序来实现”。

比如,某停车场停车费用计算规则如下:每小时10元,不足1小时的部分按照1小时计算;超过8小时,未超过24小时的按照8小时计算;超过24小时,超过部分按照上述标准重新计算。
我们可以根据这个要求,设计如下算法。程序开始,定义变量t1用于保存车辆入场时间,变量t2保存车辆出场时间,变量t,用(t2- t1)并対差值向上取整,作为整个的停车时长。
然后用”t//24”的表达式,求取超过24小时的天数,并保存在days变量中。这里大家注意,如果停车时长不到24小时,days变量的值是0
天数计算好后,剩余小于24小时的停车时长用”t%24”来计算,并将结果保存在left_t变量中。接下来用一个分支结构,当left_t小于8成立时,计算停车费一是left_t乘以10。当left_t小于8不成立时,也就是超过了8小时,按照停车场的计费规则,停车费用一就应该是按8小时计算,也就是80.
然后将停车费一加上根据天数计算的停车费用,作为整个的停车费。最后,显示输出停车费。程序结束。

在智能停车系统中要实现这个算法,其实涉及到软件设计的问题。按照内部逻辑结构,一般可以将软件划分为三个逻辑层次,分别是用户界面、业务逻辑和数据访问。
在用户界面层,其作用是提供各种终端设备上用户的输入、输出、查询等界面。如输入车牌号码、输出停车费用等。
在业务逻辑层,其作用是负责核心的业务处理。如计算停车费用、查询停车位等。
在数据访问层,其作用是负责操作数据库,按照设计的格式向数据库发送指令,进行数据访问。如对停车信息表进行相关操作(增、查、改、删)。

具体到智能停车系统,它的软件的逻辑层次如图,用户界面为了满足不同人员的使用,还会细分为移动终端界面”“停车场管理员界面自动查询界面等。这些用户直接接触到的部分功能的实现,需要与业务逻辑层以及数据访问、数据库之间进行数据交换,形成一个整体,作为软件部分,满足各类用户对信息系统的使用需求。

如果要开发一个模仿智能停车系统收费功能的软件,我们可以基于用户需求,设计网页作为用户界面,然后设计算法,编写计算收费的程序,最后是设计数据访问的文件并与数据库进行连接。
在用户界面层,我们可以设计两个网页文件,一个用于“显示车辆的停车记录”,一个用于“显示车辆停车查询结果”。在业务逻辑层是这样两个用Python编写的程序,上面这个用于计算停车费,下面这个用于连接网页模板和数据库,起到桥梁的作用。在数据访问层的db.py也是一个Python编写的程序,负责连接数据库,进行数据访问。
整个过程在设计上是由用户到界面到业务逻辑再到数据库,从数据调用上,是双向的,特别是反应到用户界面上的数据流动,是从数据库到逻辑层,再到用户界面的,大家需要注意这个过程。

接下来我们以“计算停车费”的这个Python程序为例,进行简单的解读。
首先这里是通过一个自定义函数cal_parking_hours来计算停车时长,其中这行语句中“ seconds/3600”是将“时间单位'秒’转为小时”,math.ceil是用math的库函数ceil来实现“向上取整”。
在下面这里也是用一个自定义函数cal_parking_fee来计算停车费用,大家注意这里这个函数的程序代码并没有编写,需要我们完善,同时这里的变量t就是调用前面那个自定义函数cal_parking_hours的返回值。

解读了程序,我们再回顾我们前面关于计算停车费用的算法设计流程图。大家可以发现,在这个算法中,计算停车时长以及向上取整的部分已经编写完成,我们需要编写的就是基于这个时长,来计算停车费用,也就是这里的黄色区域。其中,用到了一个双分支结构。

针对这部分算法,我们可以这样编写程序。首先用t整除24来求得“超过24小时的天数”,并保存在变量days中。然后用t取模24来求得“剩余24小时的时长”,并保存在变量left_t中。接下来用if语句对left_t进行判断,不满8小时的直接用left_t*10计算停车费,满8小时及以上的按照80元计算。分支结束后,将天数的费用和一天内的费用相加,求得总费用。在这段代码中,一大家要注意分支语句的格式,特别是“缩进”处理和“else:”后面不能再添加条件且要用一个冒号。
同时还要注意计算总费用的这行语句,它是在分支结构的外面,应该和if语句对齐,不能缩进到分支结构的语句里面。

编写好程序代码后,我们再回头看这个Python程序,将刚才编写的程序代码添加进去,就可以正常计算停车费用了。

接下来我们看看整个停车收费系统的程序与数据调用过程。当使用者在用户界面点击“计算按钮”后,用户界面调用计算停车费的程序,并取出入场和出场时间,在页面上显示。同时,计算停车费的程序会调用其中的计算停车费用的函数(也就是刚才我们完善的),这个函数会和计算停车时长的函数之间进行数据互动,前面我们已经介绍过。之后计算停车费用的函数会将计算结果返回给前面的程序,并由程序将计算结果传送到用户界面上显示出来。这样就完成了整个数据的调用过程。

同学们,在信息社会,信息系统功能的实现,其实是通过事先设计的算法,对数据进行加工,以获得符合需要的数据结果。在这个过程中,需要用到数据库、软件设计等相关知识,希望同学们在日常使用信息系统时,试着分析其运行机理,从而更好的理解信息系统和信息社会,相信大家都是最棒的。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多