現(xiàn)代社會,,我們使用計算機等設(shè)備將信息保存在各類存儲設(shè)備中,。但在信息系統(tǒng)中,我們一般使用數(shù)據(jù)庫來存儲數(shù)據(jù),,本視頻將介紹數(shù)據(jù)庫和軟件設(shè)計的相關(guān)知識,。信息系統(tǒng)中流轉(zhuǎn)的數(shù)據(jù)的存儲和處理常常借助數(shù)據(jù)庫來實現(xiàn)。數(shù)據(jù)庫系統(tǒng)包括數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng),,其中數(shù)據(jù)庫提供了數(shù)據(jù)存儲的場所,,數(shù)據(jù)庫管理系統(tǒng)包含有各類應(yīng)用程序,提供了數(shù)據(jù)的查詢,、保存,、修改、刪除等操作,。數(shù)據(jù)庫有很多種,,其中關(guān)系型數(shù)據(jù)庫是常見的一種。關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)可以看作是一張張的“二維表”,,也稱為數(shù)據(jù)表,,每個數(shù)據(jù)表都有單獨的名字,即“表名稱”,。數(shù)據(jù)表中的每一行稱為一個“記錄”,,每一列稱為一個“字段”。以學(xué)生數(shù)據(jù)庫為例,它包含多個二維數(shù)據(jù)表,,如這里的高一綜合實踐表,、成績表以及健康指數(shù)表等。在成績表中,,字段名有“學(xué)籍號”“姓名”以及各科成績等,,下面的每一行記錄了一名同學(xué)的相關(guān)數(shù)據(jù)。在健康指數(shù)表中,,也包含有“學(xué)籍號”“身高”等字段,,下面的每一行記錄了一名同學(xué)的健康數(shù)據(jù)。我們看到,,這兩個表中的“學(xué)籍號”字段,,在兩個表中都有,且對于某位同學(xué)來說是唯一的,,這個字段可以稱為“關(guān)鍵字段”,,通過這個“學(xué)籍號”字段,可以將多個表關(guān)聯(lián)起來,,這也是關(guān)系數(shù)據(jù)庫名稱的由來,。數(shù)據(jù)庫共有四項基本操作,我們以智能停車系統(tǒng)的部分場景為例,,進行簡單的說明,。一是增加記錄。在車輛入場時,,需要增加增加一個新的記錄用以保存車牌號碼和入場時間,。但要注意,這時候這個新增加記錄的其它字段暫時是空的,。二是查詢記錄,。我們在查詢車輛位置時,系統(tǒng)按照我們輸入的車牌號,,在數(shù)據(jù)庫中查找對應(yīng)的記錄,,并將其中的停車位置信息返回給查詢機顯示。三是修改記錄,。當(dāng)車輛駛?cè)肽骋卉囄缓?,系統(tǒng)采集獲得車位號碼。此時,,修改對應(yīng)的停車記錄,,將原先的空白停車位置字段更新為車位號碼。四是刪除記錄,??梢砸罁?jù)車牌號碼,,刪除對應(yīng)的某一條記錄;也可以刪除所有記錄,。但在一般的智能停車系統(tǒng)中,,一條記錄會保留較長時間,不會離場即刪除,。接下來我們以一個示例看看數(shù)據(jù)庫的基本操作,。“王先生駕駛車牌號為滬BACD34 的車輛于2022年3月2日8:00:00入場,。在離開前,,他查詢了車輛所停車位。并于當(dāng)天的12:10:00離場,?!蔽覀兘⒁粋€關(guān)系型數(shù)據(jù)庫,并將其中的一個二維數(shù)據(jù)表的名稱定義為“cars”,,在這個數(shù)據(jù)表中,,設(shè)計幾個字段,,其中用car_plate表示“車牌號碼”,、 checkin_time表示“入場時間”、 checkout_time表示“出場時間”等,。在模擬車輛入場時,,數(shù)據(jù)庫操作前,并不存在車牌號為“滬BACD34”的車輛記錄,。操作后,,在系統(tǒng)中增加了一條包含車牌號和入場時間的記錄。在結(jié)構(gòu)化查詢語言中,,增加記錄的命令格式是“Insert into 表名(字段名1,字段名2,...) values (值1, 值2,...)”,,遷移到這個示例中,就應(yīng)該是“Insert into cars(car_plate,checkin_time) values('滬BACD34', '2022-03-02
8:00:00')”,。如果我們要查詢這臺車輛的記錄,,可以在系統(tǒng)中輸入車牌號,系統(tǒng)就會顯示這個記錄,。在結(jié)構(gòu)化查詢語言中,,查詢記錄的命令格式是“Select 列名稱 from 表名稱 where 列名稱 = 某值”,遷移到這個示例中,,就應(yīng)該是“Select car_plate from cars where car_plate='滬BACD34’”,。在模擬車輛出場時,數(shù)據(jù)庫操作前,,車牌號為“滬BACD34”的車輛記錄的“checkout_time”(出場時間)是空的,。車輛出場后,,該字段被填入了相應(yīng)的內(nèi)容。這個過程其實是是修改了這條記錄,。在結(jié)構(gòu)化查詢語言中,,修改記錄的命令格式是“Update 表名 set 字段名 = 值 where <條件>”,遷移到這個示例中,,就應(yīng)該是“Update cars set checkout_time='2022-03-02 12:10:00' where car_plate=
'滬BACD34'”,。模擬刪除車輛記錄,操作前,,有兩條記錄,,刪除后,第二條記錄將消失,。在結(jié)構(gòu)化查詢語言中,,刪除記錄的命令格式是“Delete from 表名 where <條件>”。我們要注意,,命令格式中的“where”是個條件語句,,在這里以及前面的幾個操作中不能省略。比如在這里如果用這個語句“Delete from cars”是錯誤的,,可能會導(dǎo)致刪除整個二維數(shù)據(jù)表的錯誤,,正確的語句應(yīng)該是“Delete from cars where car_plate= '滬ABCD12' ”。075806我們繼續(xù)以智能停車場系統(tǒng)為例,,看看該系統(tǒng)中的數(shù)據(jù)處理,。如前所述,車輛入場,、停車入位,、智能尋車等場景,各自實現(xiàn)了相應(yīng)的功能,,對應(yīng)的是數(shù)據(jù)庫中的增加,、修改、查詢等操作,,這些都屬于信息系統(tǒng)中針對數(shù)據(jù)庫的操作,。而在車輛出場時,需要根據(jù)收費規(guī)則,,計算停車費用,。這就要求“設(shè)計算法、編寫程序來實現(xiàn)”,。比如,,某停車場停車費用計算規(guī)則如下:每小時10元,不足1小時的部分按照1小時計算,;超過8小時,,未超過24小時的按照8小時計算,;超過24小時,超過部分按照上述標(biāo)準(zhǔn)重新計算,。我們可以根據(jù)這個要求,,設(shè)計如下算法。程序開始,,定義變量t1用于保存車輛入場時間,,變量t2保存車輛出場時間,變量t,,用(t2- t1)并対差值向上取整,,作為整個的停車時長。然后用”t//24”的表達(dá)式,,求取超過24小時的天數(shù),,并保存在days變量中。這里大家注意,,如果停車時長不到24小時,,days變量的值是0。天數(shù)計算好后,,剩余小于24小時的停車時長用”t%24”來計算,,并將結(jié)果保存在left_t變量中。接下來用一個分支結(jié)構(gòu),,當(dāng)left_t小于8成立時,,計算停車費一是left_t乘以10,。當(dāng)left_t小于8不成立時,,也就是超過了8小時,按照停車場的計費規(guī)則,,停車費用一就應(yīng)該是按8小時計算,,也就是80.然后將停車費一加上根據(jù)天數(shù)計算的停車費用,作為整個的停車費,。最后,,顯示輸出停車費。程序結(jié)束,。在智能停車系統(tǒng)中要實現(xiàn)這個算法,,其實涉及到軟件設(shè)計的問題。按照內(nèi)部邏輯結(jié)構(gòu),,一般可以將軟件劃分為三個邏輯層次,,分別是用戶界面、業(yè)務(wù)邏輯和數(shù)據(jù)訪問,。在用戶界面層,,其作用是“提供各種終端設(shè)備上用戶的輸入,、輸出、查詢等界面,。” 如輸入車牌號碼,、輸出停車費用等。在業(yè)務(wù)邏輯層,,其作用是“負(fù)責(zé)核心的業(yè)務(wù)處理,。” 如計算停車費用、查詢停車位等,。在數(shù)據(jù)訪問層,,其作用是“負(fù)責(zé)操作數(shù)據(jù)庫,按照設(shè)計的格式向數(shù)據(jù)庫發(fā)送指令,,進行數(shù)據(jù)訪問,。” 如對停車信息表進行相關(guān)操作(增、查,、改,、刪)。具體到智能停車系統(tǒng),,它的軟件的邏輯層次如圖,,用戶界面為了滿足不同人員的使用,還會細(xì)分為“移動終端界面”“停車場管理員界面”和“自動查詢界面”等,。這些用戶直接接觸到的部分功能的實現(xiàn),,需要與業(yè)務(wù)邏輯層以及數(shù)據(jù)訪問、數(shù)據(jù)庫之間進行數(shù)據(jù)交換,,形成一個整體,,作為軟件部分,滿足各類用戶對信息系統(tǒng)的使用需求,。如果要開發(fā)一個模仿智能停車系統(tǒng)收費功能的軟件,,我們可以基于用戶需求,設(shè)計網(wǎng)頁作為用戶界面,,然后設(shè)計算法,,編寫計算收費的程序,最后是設(shè)計數(shù)據(jù)訪問的文件并與數(shù)據(jù)庫進行連接,。在用戶界面層,,我們可以設(shè)計兩個網(wǎng)頁文件,一個用于“顯示車輛的停車記錄”,,一個用于“顯示車輛停車查詢結(jié)果”,。在業(yè)務(wù)邏輯層是這樣兩個用Python編寫的程序,上面這個用于計算停車費,,下面這個用于連接網(wǎng)頁模板和數(shù)據(jù)庫,,起到橋梁的作用,。在數(shù)據(jù)訪問層的db.py也是一個Python編寫的程序,負(fù)責(zé)連接數(shù)據(jù)庫,,進行數(shù)據(jù)訪問,。整個過程在設(shè)計上是由用戶到界面到業(yè)務(wù)邏輯再到數(shù)據(jù)庫,,從數(shù)據(jù)調(diào)用上,,是雙向的,特別是反應(yīng)到用戶界面上的數(shù)據(jù)流動,,是從數(shù)據(jù)庫到邏輯層,,再到用戶界面的,大家需要注意這個過程,。接下來我們以“計算停車費”的這個Python程序為例,,進行簡單的解讀。首先這里是通過一個自定義函數(shù)cal_parking_hours來計算停車時長,,其中這行語句中“ seconds/3600”是將“時間單位'秒’轉(zhuǎn)為小時”,,math.ceil是用math的庫函數(shù)ceil來實現(xiàn)“向上取整”。在下面這里也是用一個自定義函數(shù)cal_parking_fee來計算停車費用,,大家注意這里這個函數(shù)的程序代碼并沒有編寫,,需要我們完善,同時這里的變量t就是調(diào)用前面那個自定義函數(shù)cal_parking_hours的返回值,。解讀了程序,,我們再回顧我們前面關(guān)于計算停車費用的算法設(shè)計流程圖。大家可以發(fā)現(xiàn),,在這個算法中,計算停車時長以及向上取整的部分已經(jīng)編寫完成,,我們需要編寫的就是基于這個時長,,來計算停車費用,,也就是這里的黃色區(qū)域。其中,,用到了一個雙分支結(jié)構(gòu),。針對這部分算法,我們可以這樣編寫程序,。首先用t整除24來求得“超過24小時的天數(shù)”,,并保存在變量days中,。然后用t取模24來求得“剩余24小時的時長”,并保存在變量left_t中,。接下來用if語句對left_t進行判斷,不滿8小時的直接用left_t*10計算停車費,,滿8小時及以上的按照80元計算,。分支結(jié)束后,將天數(shù)的費用和一天內(nèi)的費用相加,,求得總費用,。在這段代碼中,一大家要注意分支語句的格式,,特別是“縮進”處理和“else:”后面不能再添加條件且要用一個冒號,。同時還要注意計算總費用的這行語句,它是在分支結(jié)構(gòu)的外面,,應(yīng)該和if語句對齊,不能縮進到分支結(jié)構(gòu)的語句里面,。編寫好程序代碼后,,我們再回頭看這個Python程序,將剛才編寫的程序代碼添加進去,,就可以正常計算停車費用了,。接下來我們看看整個停車收費系統(tǒng)的程序與數(shù)據(jù)調(diào)用過程。當(dāng)使用者在用戶界面點擊“計算按鈕”后,,用戶界面調(diào)用計算停車費的程序,,并取出入場和出場時間,在頁面上顯示,。同時,,計算停車費的程序會調(diào)用其中的計算停車費用的函數(shù)(也就是剛才我們完善的),這個函數(shù)會和計算停車時長的函數(shù)之間進行數(shù)據(jù)互動,,前面我們已經(jīng)介紹過,。之后計算停車費用的函數(shù)會將計算結(jié)果返回給前面的程序,并由程序?qū)⒂嬎憬Y(jié)果傳送到用戶界面上顯示出來,。這樣就完成了整個數(shù)據(jù)的調(diào)用過程,。同學(xué)們,在信息社會,,信息系統(tǒng)功能的實現(xiàn),,其實是通過事先設(shè)計的算法,對數(shù)據(jù)進行加工,以獲得符合需要的數(shù)據(jù)結(jié)果,。在這個過程中,,需要用到數(shù)據(jù)庫、軟件設(shè)計等相關(guān)知識,,希望同學(xué)們在日常使用信息系統(tǒng)時,,試著分析其運行機理,從而更好的理解信息系統(tǒng)和信息社會,,相信大家都是最棒的,。
|