??? 個人重構版的機房收費系統正在緊鑼密鼓的進行著,雖然不是很難的東西,但是有時候小毛病還是很多。程序正在代碼實現中,拋下程序不談,先來總結下數據庫的設計。
1、數據完整性
???? 約束、規則、默認值等能夠較好的保證數據的完整性,為了保證系統數據的完整性,設計時使用了主鍵、外鍵、Check約束,同時使用規則和默認值來保證數據的正確性。使用主鍵時約束了一列,把表中的一列作為主鍵,創建主鍵約束的表中數據不能為空,且不能重復,表的索引默認的是主鍵約束的列;使用主鍵約束了同一個表中的兩列,受約束后的表中的數據是按照第一個設置主鍵的列的排序規則進行排序的,保證了兩個列中數據不能為空且不能重復,同時也符合第二范式。
??? 主鍵約束不會存在太大的問題,主要是外鍵約束。外鍵約束保證了數據的完整性,在對數據庫操作時它會級聯觸發保證數據的完整性,但是外鍵約束的創建要基于唯一約束、非空約束或主鍵約束,被約束的外鍵表中的列必須保證非空且唯一。
??? 主要操作步驟不在詳述,前篇博客已有總結。
2、業務規則
??? 好的數據庫能夠減少程序開發者寫代碼的時間,而在數據庫設計時巧妙的運用觸發器在保證業務規則的同時也減少了編寫復雜代碼的時間。雖然在保證數據完整性上,觸發器的效率要低于約束,但觸發器在處理業務邏輯上擁有者得天獨厚的便利,因為它能夠自動觸發,實現級聯修改。觸發器按大類可分為DDL、DML和登陸觸發器,具體劃分如下圖:
?
??? 在使用DML數據操作語言類數據庫時,它會在觸發器表中生成相應的Deleted、Inserted表,這兩個表分別保存要刪除行的數據、要增加行的數據,在使用觸發器時也可以應用這兩個表中的數據。
??? 與SQL2000不同的是SQL2008在創建觸發器時,是在相應的表下創建,當然也可直接在查詢中運行創建語句來創建。如下圖:
??? 為了完善業務邏輯,系統在設計時用了Insert類型的觸發器,在表中插入數據時,修改另一表中數據,主要語句如下:
?
use [ChargeSystem] go /*表充值記錄觸發器,能夠觸發修改Student中余額主要實現的是當為某學生充值金額時,自動將充值金額增加到學生的余額中*/ if OBJECT_ID('chargesystem.trChargeAdd','TR') is not null drop trigger chargesystem.trChargeAdd; go create trigger trChargeAdd on tblchargelog for insert as /*將增加的充值金額,增加到學生余額中*/ update S set stu_Balance=(S.stu_Balance+I.ch_Chargecash) from tblstudent as s inner join Inserted as I on S.stu_Cardid=I.ch_CardID Go /*上面語句中的Inner join查詢是將on后面符合條件的Inserted表中的行加入到tblstudent表中*/
?
??? 為了保證數據庫的安全性,防止
SQL
注入的情況發生,我們在使用結構化查詢或者操作時,應用使用參數,使用參數化查詢或操作代替字段拼接,能夠防止
SQL
注入的情況。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
