在做機(jī)房收費(fèi)系統(tǒng)個(gè)人版的時(shí)候又一次的遇到了數(shù)據(jù)庫(kù)設(shè)計(jì)方面的內(nèi)容,還記得第一次機(jī)房收費(fèi)系統(tǒng)的時(shí)候,數(shù)據(jù)庫(kù)的設(shè)計(jì)基本上是邊敲邊設(shè)計(jì)的,搞得特別的亂,也不符合編程的規(guī)范。既然我們現(xiàn)在已經(jīng)是專(zhuān)業(yè)人士了,那么就應(yīng)該采取一些專(zhuān)業(yè)的手段來(lái)設(shè)計(jì),并且一個(gè)
在做機(jī)房收費(fèi)系統(tǒng)個(gè)人版的時(shí)候又一次的遇到了數(shù)據(jù)庫(kù)設(shè)計(jì)方面的內(nèi)容,還記得第一次機(jī)房收費(fèi)系統(tǒng)的時(shí)候,數(shù)據(jù)庫(kù)的設(shè)計(jì)基本上是邊敲邊設(shè)計(jì)的,搞得特別的亂,也不符合編程的規(guī)范。既然我們現(xiàn)在已經(jīng)是專(zhuān)業(yè)人士了,那么就應(yīng)該采取一些專(zhuān)業(yè)的手段來(lái)設(shè)計(jì),并且一個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)的好壞直接影響到后臺(tái)數(shù)據(jù),對(duì)軟件的運(yùn)行效率也是密切聯(lián)系的。下面就分享下這次做數(shù)據(jù)庫(kù)的心得。
ER模型
在自學(xué)考試中,學(xué)習(xí)過(guò)有關(guān)ER模型方面的知識(shí),這是被廣泛被采用的概念模型設(shè)計(jì)方法,就是所謂的圖形的方式來(lái)展示用戶需求中各方面的聯(lián)系,這與Use Case是不一樣,用例圖只是單一的展示了用戶的需求,沒(méi)有加入任何的關(guān)系操作,而ER模型在此基礎(chǔ)上引入了聯(lián)系的基本元素。
基本元素
實(shí)體:一個(gè)數(shù)據(jù)對(duì)象,指應(yīng)用中可以區(qū)別的客觀存在的事物
聯(lián)系:表示多個(gè)實(shí)體間的關(guān)系
屬性:實(shí)體的某一特性
操作方法
1.分析需求
下面機(jī)房收費(fèi)系統(tǒng)中用戶的描述
學(xué)生:可以上機(jī),查看自己的余額,查看自己的上機(jī)記錄,還有自己的充值記錄,并且可以自己修改自己的密碼。
值班教師:我是機(jī)房的值班老師,由我來(lái)管理學(xué)生的上機(jī)情況,我的職責(zé)是負(fù)責(zé)同學(xué)上機(jī),并且可以幫助
同學(xué)注冊(cè),充值和退卡,也可以管理學(xué)生的上機(jī)情況。當(dāng)然了也可以查看今天收取金額的情況。
管理員:我可以管理值班教師,比如添加和刪除值班教師,查看他們的工作記錄,并且我也可以
把近段時(shí)間來(lái)的金額進(jìn)行匯總結(jié)賬,只能由我來(lái)設(shè)置學(xué)生上機(jī)消費(fèi)的金額信息信息
2.設(shè)計(jì)局部ER模型
2.1 確定局部結(jié)構(gòu)的范圍
我們從用戶的需求中,然后根據(jù)用戶的不同職責(zé)來(lái)劃分出范圍(學(xué)生、值班教師、管理員)
2.2 定義實(shí)體
這就需要從每一個(gè)局部的結(jié)構(gòu)中概括出一些實(shí)體類(lèi)型
比如學(xué)生這個(gè)職責(zé)范圍內(nèi)的實(shí)體(學(xué)生、上機(jī)情況、余額情況、密碼等)
2.3 定義聯(lián)系
為實(shí)體與實(shí)體之間根據(jù)需求分析的結(jié)果,考察是否存在聯(lián)系
2.4 分配屬性
最后根據(jù)需求分析的結(jié)果,為每一個(gè)實(shí)體定義自己的特性,例如學(xué)生的屬性有——姓名、卡號(hào)、性別等
下面是學(xué)生ER圖的連接http://my.csdn.net/my/album/detail/1764165
3.設(shè)計(jì)全局ER模型
3.1 確定公共實(shí)體
當(dāng)分別設(shè)計(jì)完局部的ER圖后,就可以把局部合并成為全局,在合并的過(guò)程中也要合并實(shí)體,因?yàn)椴煌?/p>
的類(lèi)別范圍內(nèi)查找的實(shí)體可能會(huì)重復(fù)。
3.2 合并局部ER模型
在確定完公共實(shí)體后,就可以根據(jù)公共的實(shí)體來(lái)合并局部的ER圖
下面是合并完后全局ER圖的連接http://my.csdn.net/my/album/show/274159
通過(guò)ER模型我們就能夠很清楚的了解到軟件項(xiàng)目中包括的實(shí)體,以及實(shí)體與實(shí)體之間的聯(lián)系,就能夠從宏觀上
把握軟件的架構(gòu)。
關(guān)系模型
所謂的關(guān)系模型簡(jiǎn)單的說(shuō)就是我們數(shù)據(jù)庫(kù)中一張一張的表,當(dāng)然了數(shù)據(jù)庫(kù)中的數(shù)據(jù)也有自己的設(shè)置規(guī)則
1.1 實(shí)體參照性規(guī)范
主鍵值不能為空,否則主鍵就起不到惟一標(biāo)識(shí)的作用
1.2參照完整性原則
在數(shù)據(jù)表中的外鍵值不是空值就是定于其他表的主鍵值
1.3 用戶定義完整性規(guī)則
為了方便用戶的管理,用戶還可以自己制定相應(yīng)的數(shù)據(jù)約束
ER模型到關(guān)系模型的轉(zhuǎn)變
在ER模型中有:實(shí)體、聯(lián)系和屬性,我們知道在數(shù)據(jù)庫(kù)中有記錄、字段和表名
這些都是相互對(duì)應(yīng)的,下面就說(shuō)一下如何來(lái)從ER模型來(lái)轉(zhuǎn)變?yōu)殛P(guān)系模型
轉(zhuǎn)變
1.1 實(shí)體轉(zhuǎn)換為模型
1.2 若實(shí)體間聯(lián)系是1:1,則可以在兩個(gè)實(shí)體間加入任何一個(gè)實(shí)體的主鍵值
1.3 若實(shí)體間聯(lián)系是M:N,則可以把兩個(gè)實(shí)體的主鍵提取出來(lái)重新組合成新的關(guān)系
最后機(jī)房收費(fèi)系統(tǒng)后的關(guān)系模型如下:
教師(教工號(hào)、水平、年齡、性別、姓名、狀態(tài)) |
學(xué)生(卡號(hào)、學(xué)號(hào)、班級(jí)、年級(jí)、性別、姓名、系、密碼、狀態(tài)) |
退款記錄(學(xué)生卡號(hào)、教工號(hào)、值班教師、退款日期,退款金額,退款人員、退款時(shí)間) |
收取金額(學(xué)生卡號(hào)、教工號(hào)、值班教師,收取日期、收取金額、收款人) |
基本數(shù)據(jù)(教職工號(hào)、臨時(shí)用戶費(fèi)用、遞增時(shí)間、至少上機(jī)時(shí)間、準(zhǔn)備時(shí)間、最少金額) |
值班記錄(教工號(hào)、值班教師、值班日期、值班時(shí)間、下機(jī)日期) |
充值記錄(學(xué)生卡號(hào)、充值教師、充值金額、充值日期、充值時(shí)間) |
上機(jī)記錄(學(xué)生卡號(hào)、上機(jī)日期、上機(jī)時(shí)間、下機(jī)日期、下機(jī)時(shí)間) |
日結(jié)賬單(教工號(hào)、上次余額、本日消費(fèi)金額、本日充值金額、本日退款金額、日期) |
周結(jié)賬單(教工號(hào)、上周余額、本期消費(fèi)金額、本期充值金額、本期退款金額、日期) |
優(yōu)化
1 消除重復(fù)
我們看到教師查看收取金額記錄和學(xué)生的充值記錄是重復(fù)的,所以需要去除重復(fù)來(lái)消除冗余。
2.三范式
1NF:表中的列是不可以在分的(原子性)
例如一張員工信息的表(姓名、住址、電話號(hào)碼),但是員工的電話號(hào)碼又分為住址號(hào)碼和手機(jī)號(hào)碼,所以就違反了1NF
要修改的話,要不就把電話號(hào)碼的屬性拆分為住址號(hào)碼和手機(jī)號(hào)碼,要不就強(qiáng)制員工直流一個(gè)號(hào)碼
2NF:表中不存在重復(fù)的記錄(即表中的行是不可以重復(fù)的)
我們就拿上面機(jī)房收費(fèi)系統(tǒng)設(shè)計(jì)出來(lái)的表為例,學(xué)生信息表(學(xué)號(hào)、姓名、班級(jí)、系別)。如果這樣設(shè)計(jì)的話,我們可以知道一個(gè)系里面大概有1000多名學(xué)生,那么這個(gè)字段就會(huì)在這站張表中重復(fù)1000多次,而且還有班級(jí)這個(gè)字段也是同樣的道理
這樣做的話就會(huì)造成
數(shù)據(jù)冗余:一站表中多次出現(xiàn)了重復(fù)的記錄
更新異常:若要調(diào)整表中系別的字段的話,所有的系別都需要更新,有可能出現(xiàn)同一個(gè)學(xué)生出現(xiàn)在不同的系里面
插入異常:如果學(xué)校新開(kāi)一個(gè)系別,如果沒(méi)有學(xué)生的話,那么這個(gè)系別無(wú)法保存進(jìn)去
要改的話把系別和學(xué)生信息區(qū)別開(kāi)來(lái)(系別號(hào)、系別)和(學(xué)號(hào)、系別號(hào)、姓名、性別),然后這兩張表通過(guò)系別號(hào)來(lái)進(jìn)行連接
3NF:一個(gè)表中的列不依賴(lài)與另一個(gè)表中的非主鍵的列
其實(shí)數(shù)據(jù)庫(kù)的要求就是要遵從概念單一化"一事一地"原則,即一個(gè)關(guān)系模式描述一個(gè)實(shí)體或者實(shí)體間的一種聯(lián)系。通過(guò)三范式的約束后,我們來(lái)看一下最后的數(shù)據(jù)庫(kù)
教師(教工號(hào)、系別號(hào)、年齡、性別、姓名、狀態(tài)) |
系(系別號(hào)、系) |
學(xué)生(卡號(hào)、學(xué)號(hào)、班級(jí)、年級(jí)、性別、姓名、系、密碼、狀態(tài)) |
退款記錄(學(xué)生卡號(hào)、教工號(hào)、值班教師、退款日期,退款金額,退款人員、退款時(shí)間) |
基本數(shù)據(jù)(教職工號(hào)、臨時(shí)用戶費(fèi)用、遞增時(shí)間、至少上機(jī)時(shí)間、準(zhǔn)備時(shí)間、最少金額) |
值班記錄(教工號(hào)、值班教師、值班日期、值班時(shí)間、下機(jī)日期) |
充值記錄(學(xué)生卡號(hào)、充值教師、充值金額、充值日期、充值時(shí)間) |
上機(jī)記錄(學(xué)生卡號(hào)、上機(jī)日期、上機(jī)時(shí)間、下機(jī)日期、下機(jī)時(shí)間) |
日結(jié)賬單(教工號(hào)、上次余額、本日消費(fèi)金額、本日充值金額、本日退款金額、日期) |
周結(jié)賬單(教工號(hào)、上周余額、本期消費(fèi)金額、本期充值金額、本期退款金額、日期) |
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com