数据库课程设计——火车票售票系统
摘要
數(shù)據(jù)庫課程設(shè)計的題目,設(shè)計了一個火車票售票系統(tǒng),實現(xiàn)了列車信息查詢,車票查詢及購買,訂單查詢,個人信息管理等功能,數(shù)據(jù)是從12306爬取的真實數(shù)據(jù)。
項目鏈接
前端項目鏈接:https://github.com/ccclll777/db_design_web
后端項目鏈接:https://github.com/ccclll777/db_design_service
如果覺得有幫助,請點個star吧
題目簡述
火車票售票系統(tǒng)
- 車次管理(車次,起止地點,到達時間,開車時間)
- 坐席管理(車廂號,座位號)
- 售票(直達,換乘)改簽,退票
- 余票查詢
- 訂單查詢
- 用戶管理
開發(fā)環(huán)境與技術(shù)
- 開發(fā)工具
工具:WebStorm ,IntelliJ IDEA
Mysql8.0.12 Tomcat 8.0 Maven Git Redis - 前端技術(shù)棧
HTML+CSS+Javascript
前端框架:Vue.js+ElementUi - 后端技術(shù)棧
Spring Boot為框架
MyBatis操作數(shù)據(jù)庫
Redis進行用戶信息緩存
Maven作為項目構(gòu)建工具
需求分析
1.用戶登錄注冊
用戶注冊登陸后可以使用系統(tǒng)的所有功能,如添加乘客,購買車票,查詢訂單等等
2.系統(tǒng)需要提供基礎(chǔ)的列車信息查詢:
根據(jù)車次查詢列車是否正常運行,以及查看列車的基本信息(如列車類型,始發(fā)站,終點站,開車時間,到達時間,運行時間,車廂數(shù)等等)
根據(jù)車次,查詢列車經(jīng)停站信息(包含這趟列車每一個經(jīng)停車站的車站名,到達時間,開車時間,運行時間等信息)
3.系統(tǒng)需要提供根據(jù)車次查詢列車詳細信息的功能:
根據(jù)始發(fā)站和終點站,查詢可以滿足自己行程要求并且正常運行的列車(可以根據(jù)開車時或者運行時間進行排序),并且可以進一步查看中間經(jīng)過的的車站信息,以及開車時間,到達時間等。
系統(tǒng)需要提供接續(xù)換乘一次的查詢,根據(jù)輸入的出發(fā)站和終點站,可以查詢換乘一次滿足條件的列車,并且可以根據(jù)開車時間或總運行時間進行排序。
4.車票購買
在查詢到符合自己出行條件的列車后,可以查詢列車的剩余座位以及購買車票。
首先添加乘客(添加需要購買車票的乘客)——>進行座位選擇(為每一位乘客選擇座位)——>訂單支付——>購票成功
接續(xù)換乘車票購買流程類似,只不過在選座時,需要選擇兩趟列車的座位。
5.系統(tǒng)需要提供用戶的個人信息修改功能以及修改密碼功能。
6.用戶可以給除自己以外別的乘客購買車票,所以提供添加乘客的功能,每個用戶下都可以添加多個乘客,從而為別的乘客購買車票。
7.系統(tǒng)提供訂單的查詢功能,可以查詢到與自己有關(guān)的所有訂單,比如所有訂單,未支付訂單,未出行訂單。
8.未支付訂單針對下單但是沒有支付的訂單,可以在規(guī)定的時間內(nèi)進行支付操作,如果在規(guī)定時間內(nèi)沒有完成操作,則訂單會作廢,變成未完成支付的訂單。
9.未出行訂單針對已經(jīng)支付但是沒有出行的訂單,可以在未出行訂單中查看自己的出行計劃。未出行訂單可以進行改簽操作,改簽相同出發(fā)站和終點站的其他列車。
10.未出行訂單還可以進行退票操作,從而取消訂單。
數(shù)據(jù)庫概念設(shè)計
本系統(tǒng)中一共6個實體集,分別是,用戶實體,乘客實體,列車信息實體,列車經(jīng)停信息實體,訂單實體,列車座位信息實體
(1)用戶實體:
保存注冊系統(tǒng)的用戶的信息,主碼為用戶電話號碼,用來作為每一個用戶的唯一標(biāo)記,同時電話號碼也作為登錄系統(tǒng)的用戶名來使用。其中存在用戶自定義的完整性約束:用戶類型(0為學(xué)生,1為成人,2為管理員),性別(0為女性,1為男性)
(2)乘客實體:
每個用戶下可以添加多個乘客信息,然后為多個乘客購票。
(3)列車信息實體:
列車信息存儲了列車整體信息,每一趟列車都有一條自己的總的列車信息,表示這趟列車是正常運行,或者是停開的。列車編號作為列車的主碼(由于列車編號相同的列車,由于開車方向的不同,在途中可能改變車次,但是列車編號是固定不變的)
(4)列車經(jīng)停信息實體:
每個列車都有經(jīng)停信息表,存儲了列車停靠的不同車站,以車站編號排序。
(5)列車座位信息表,為了簡化系統(tǒng)設(shè)計的難度,統(tǒng)一固定車次為D,G開頭的列車設(shè)置特等座,一等座和二等座三個座位類型,其他類型的車設(shè)置軟臥,硬臥,硬座三個座位類型。并且如果座位類型相同,則車廂的座位數(shù)以及布局是相同的。比如:特等座一節(jié)車廂18座,一排2座,一等座一節(jié)車廂52座,一排4座,二等座一節(jié)車廂85座,一排5座。軟臥一節(jié)車廂36個位置,一列2個位置,分為上下鋪。硬臥一節(jié)車廂66個位置,一列3個位置,分為上中下鋪。硬座一節(jié)車廂120個位置,一排6個座位。
列車座位信息的主碼為列車編號,車廂編號。外碼為列車編號,參照列車信息實體。
當(dāng)車廂號固定時,說明座位類型已經(jīng)固定,具體的位置是根據(jù)座位號對于相應(yīng)一排的座位數(shù)求模運算得到的,比如特等座5號為5/2 +1 =3 3排
5%2 = 1 A座
(6)訂單信息實體:
存儲了系統(tǒng)中所有的訂單信息,訂單信息實體的主碼為訂單編號,外碼為用戶電話號碼(用戶實體主碼),乘客身份證號碼(乘客實體主碼),列車編號(列車信息主碼).
整體E-R圖為:
說明:
(1)每個用戶可以添加多個乘客
(2)每個用戶可以擁有多個訂單
(3)每個訂單屬于一個乘客
(4)每個訂單擁有一趟列車的信息
(5)每個訂單擁有一個列車的座位信息
(6)每個訂單擁有兩個列車經(jīng)停的車站信息
(7)每個列車有多個經(jīng)停的車站
(8)每個列車擁有多個車廂的座位信息
E-R圖向關(guān)系模式的轉(zhuǎn)化
(1)實體轉(zhuǎn)化為關(guān)系模式
用戶(電話號碼,密碼,身份證號,郵箱,真實姓名,用戶類型,性別,地址)
乘客(乘客身份證號,乘客真實姓名,乘客電話號碼,乘客類型,地址)
列車信息(列車編號,車次,列車類型,列車車廂數(shù),列車始發(fā)站,列車終點站,列車開車時間,列車到達時間,列車到達日期,列車運行時間,列車狀態(tài))
列車座位信息(編號,車廂號,座位類型,座位數(shù))
列車經(jīng)停信息(車次,車展編號,車站名,到達時間,總運行時間,開車時間)
訂單信息(訂單編號,出發(fā)站編號,到達站編號,車廂號,座位編號,訂單創(chuàng)建時間,訂單狀態(tài),開車時間)
(2)聯(lián)系轉(zhuǎn)化為關(guān)系模式
用戶擁有乘客(用戶電話號碼,乘客身份證號碼)
用戶擁有訂單(用戶電話號碼,訂單編號)
乘客擁有訂單(乘客身份證號碼,訂單編號)
訂單擁有列車(訂單編號,列車編號)
訂單擁有座位(訂單編號,車廂號,座位號)
列車信息擁有列車經(jīng)停站信息(列車編號,車次,車站編號)
列車擁有座位(列車編號,車廂號)
(3)實體與聯(lián)系進行合并,E-R圖中的一對一與一對多的聯(lián)系,通過參照完整性與關(guān)系模式進行合并,并進行一定修改,合并。
用戶(電話號碼,密碼,身份證號,郵箱,真實姓名,用戶類型,性別,地址)
乘客(用戶電話號碼,乘客身份證號,乘客真實姓名,乘客電話號碼,乘客類型,地址)
列車信息(列車編號,車次,列車類型,列車車廂數(shù),列車始發(fā)站,列車終點站,列車開車時間,列車到達時間,列車到達日期,列車運行時間,列車狀態(tài))
列車座位信息(列車編號,車廂號,座位類型,座位數(shù))
列車經(jīng)停信息(列車編號,車次,車站編號,車站名,到達時間,總運行時間,開車時間)
訂單信息(訂單編號,用戶電話號碼,乘客身份證號碼,列車編號,出發(fā)站編號,到達站編號,車廂號,座位編號,訂單創(chuàng)建時間,訂單狀態(tài),開車時間)
數(shù)據(jù)庫邏輯設(shè)計
數(shù)據(jù)庫物理結(jié)構(gòu)設(shè)計
(1)用戶表:
在用戶表中,由于查詢以及更新的條件都是用戶電話號碼,所以將用戶電話設(shè)置為主碼,會相應(yīng)的建立索引,提高查詢的效率。
(2)乘客表:
主碼為用戶電話號碼以及乘客身份證號碼,由于有許多查詢以這兩個為條件,所以設(shè)置成主碼增加查詢效率。雖然在更新時比較耗時,但是更新的頻率比查詢的頻率少很多。
(3)列車信息表:
以列車編號為主碼,會自動建立索引,提高查詢效率。
(4)列車經(jīng)停信息表:
這個表的查詢量較大,但插入,刪除,更新的操作較小,所以在這個表上建立一定的索引時非常合算的。
由于需要根據(jù)車次以及列車編號查詢列車經(jīng)停信息,所以可以在車次與列車編號上建立普通索引即可,提高查詢效率。
在根據(jù)出發(fā)站以及到達站進行對符合條件的列車進行檢索時,需要用到車站名稱,所以應(yīng)該在車站名稱上建立普通索引
(5)列車座位表:
列車座位表的主碼是列車編號以及車廂號,會自動建立索引,查詢時也會以這兩個為條件,所以不用在增加其他索引。
(6)訂單表:
由于訂單表的插入頻率以及查詢頻率都很高,而建立索引會降低插入的效率,而不建立索引會降低查詢的效率,所以需要在兩者之間進行取舍。
由于訂單表的主碼為訂單編號,會自動建立唯一索引。
用戶電話號碼,和乘客身份證號碼作為外碼,常常成為查詢的條件,所以應(yīng)該在外碼上建立普通索引。
在查詢剩余車票信息時,需要先在訂單列表中查詢某輛車在某個時間的那一段路程已經(jīng)被訂購過。查詢時的條件需要有出發(fā)車站編號,到達車站編號,列車編號,訂單狀態(tài),開車日期 。
所以可以考慮在出發(fā)車站編號,到達車站編號,列車編號,訂單狀態(tài),開車日期上建立普通索引。提高查詢效率。畢竟查詢的次數(shù)要遠遠多余訂票的次數(shù),所以查詢的次數(shù)會多余插入的次數(shù),用空間來換取更快的效率,還是可以接受的。
項目整體結(jié)構(gòu)
說明:
(1)用戶首先進行賬號的注冊,然后進行登錄操作
登錄之后進入主頁,然后有不同的板塊進行選擇
(2)列車信息查詢板塊:
列車信息:可以查詢所有正常運行的列車信息
列車時刻表:可以根據(jù)車次查詢列車的經(jīng)停信息,
列車查詢:可以根據(jù)出發(fā)站和到達站查詢符合條件的列車
接續(xù)換乘:可以根據(jù)出發(fā)站和到達站查詢換乘一次能到達的列車
(3)車票查詢及購買板塊:
余票查詢:可以根據(jù)出發(fā)站和到達站查詢符合條件的列車并且查看余票以及訂購車票(跳轉(zhuǎn)到車票購買界面)
車票購買:添加乘客后,可以為乘客選座,然后支付,購票成功。
接續(xù)換乘:可以根據(jù)出發(fā)站和到達站查詢換乘一次能到達的列車,然后進行購票,跳轉(zhuǎn)到接續(xù)換乘車票購買界面。
接續(xù)換乘車票購票:添加乘客后,為乘客進行選座操作,然后支付,購票成功
(4)訂單信息板塊:
全部訂單:查詢用戶名下的全部訂單狀態(tài)
未支付訂單:查詢用戶名下全部未支付的訂單,然后可以進行訂單的支付操作
未出行訂單:可以查詢到已經(jīng)支付,但是還未出行的訂單,可以進行退票以及改簽操作。
訂單改簽:進行重新的選座已經(jīng)支付操作。
(5)個人信息板塊:
查看個人信息:查看用戶的個人信息。
修改個人信息:修改用戶的個人信息
修改密碼:修改登錄密碼
查看乘客信息:查看此用戶名下的所有乘客。
添加乘客:為此用戶名下添加乘客,之后可以為該乘客購票
界面截圖
(1)列車信息查詢界面
(2)列車時刻表查詢
(3)列車查詢
(4)接續(xù)換乘查詢
(5)余票查詢以及購買
(6)訂單列表
關(guān)鍵sql語句設(shè)計
(1)根據(jù)車次查詢列車所有經(jīng)停站信息
select b.station_no as 車站編號 ,b.station_name as 車站名, b.train_number as 車次 , b.start_time as 開車時間, b.arrive_time as 到達時間 , b.running_time as 歷時 from train_parking_station(列車經(jīng)停站信息表) as a ,train_parking_station as b where a.train_number = '車次' and a.train_no = b.train_no order by b.station_no(2)根據(jù)起始站,目的站查詢符合條件的列車
select C.train_no as 列車編號 ,C.train_number as 車次 ,C.station_name as 起始站 ,D.station_name as 目的站 , C.station_no as 起始站編號 , D.station_no as 目的站編號 ,C.start_time as 開車時間 , D.arrive_time as 到達時間, C.running_time as 到起始站已運行時間 ,D.running_time as 到目的站已運行時間 from train_parking_station(列車經(jīng)停站信息表) as C ,train_parking_station as D where C.train_no = D.train_no and C.station_name ='濟南西'and D.station_name = '上海虹橋' and C.station_no < D.station_no and C.train_no in(select train_no from train_info where train_running_type = '正在運行')(3)根據(jù)起始站,目的站查詢符合條件的列車
select C.train_no as 列車編號 ,C.train_number as 車次 ,C.station_name as 起始站 ,D.station_name as 目的站 , C.station_no as 起始站編號 , D.station_no as 目的站編號 ,C.start_time as 開車時間 , D.arrive_time as 到達時間, C.running_time as 到起始站已運行時間 ,D.running_time as 到目的站已運行時間 from train_parking_station(列車經(jīng)停站信息表) as C ,train_parking_station as D where C.train_no = D.train_no and C.station_name ='濟南西'and D.station_name = '上海虹橋' and C.station_no < D.station_no and C.train_no in(select train_no from train_info where train_running_type = '正在運行')(4)根據(jù)起始站,目的站查詢換乘的列車
select A.train_no as 列車-1編號 ,A.train_number as 列車-1車次, D.train_no as 列車-2編號 ,D.train_number as 列車-2車次, A.station_no as 起始站編號,A.station_name as 起始站名稱, B.station_no as 列車-1換乘站編號 , B.station_name as 列車-1換乘站名稱 ,C.station_no as 列車-2換乘站編號,D.station_no as 目的站編號, D.station_name as 目的站名稱,A.start_time as 列車-1發(fā)車時間 , B.arrive_time as 列車-1到達時間, C.start_time as 列車-2發(fā)車時間 ,D.arrive_time as 列車-2到達時間 from train_parking_station as A , train_parking_station as B , train_parking_station as C ,train_parking_station as D where A.station_name = '哈爾濱' and D.station_name = '廣州' and B.station_name = C.station_name and A.train_no = B.train_no and C.train_no = D.train_no and B.train_no <> C.train_no and B.arrive_time < C.arrive_time and A.station_no <B.station_no and C.station_no<D.station_noand A.train_no in (select train_no from train_info where train_running_type = '正在運行')and C.train_no in (select train_no from train_info where train_running_type = '正在運行')(5)根據(jù)起始站編號,目的站編號,列車編號查詢列車途中經(jīng)停車站
select A.train_no as 列車編號, A.train_number as 車次 ,A.station_name as 起始站 ,B.station_name as 目的站, A.station_no as 經(jīng)停站-1編號 , B.station_no as 經(jīng)停站-2編號 ,A.start_time as 開車時間 , B.arrive_time as 到達時間,A.running_time as 到經(jīng)停站-1已運行時間 ,B.running_time as 到經(jīng)停站-2已運行時間 from train_parking_station as A ,train_parking_station as B where A.station_no between '起始站編號' and '目的站編號'and B.station_no between '起始站編號' and '目的站編號'and A.train_no = '列車編號' and A.train_no = B.train_no and B.station_no = A.station_no +1 order by A.station_no ,B.station_no(6)根據(jù)起始站編號,目的站編號,列車編號,日期查詢在這一段行程中已經(jīng)被占用的座位
參考文獻
【1】Database Systems Concepts (第六版) ,Abraham, Silberschatz等著,機械工業(yè)出版社,2013
【2】數(shù)據(jù)庫系統(tǒng)概論(第五版) ,王珊、薩師煊 ,高等教育出版社,2014
【3】Spring Boot開發(fā)實戰(zhàn) 陳光劍編著
【4】Spring Boot+Vue全棧開發(fā)實戰(zhàn) 王松著
【5】vue.js2 尤雨溪著
總結(jié)
以上是生活随笔為你收集整理的数据库课程设计——火车票售票系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1856_
- 下一篇: 全国高校大学招标公告信源地址大全分享