SQL Server數(shù)據(jù)庫基礎的級聯(lián)刪除、級聯(lián)更新與三層架構之窺
一、定義
級聯(lián)刪除是指刪除包含主鍵值的行的操作,該值由其它表的現(xiàn)有行中的外鍵引用。在級聯(lián)刪除中,還刪除其外鍵值引用刪除的主鍵值的所有行。
級聯(lián)更新是指更新主鍵值的操作,該值由其它表的現(xiàn)有行中的外鍵引用。在級聯(lián)更新中,更新所有外鍵值與新的主鍵值相匹配。
三層架構是指一種架構思想。通常他將整個業(yè)務應用劃分為:表現(xiàn)層(UI)、業(yè)務邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的目的是為了“高內(nèi)聚、低耦合”的思想。
二、特點
大家都知道,級聯(lián)刪除與級聯(lián)更新操作,都是指主表的信息刪除或更新后,外鍵表中的相應信息隨主表保持一致,也同樣做出刪除或更新操作,不然就會發(fā)生錯誤,保持數(shù)據(jù)的事務性。
而關于三層架構的分層問題,我們之前就討論過。看似簡單,但是越是往細處想,越是發(fā)現(xiàn)疑點重重,很多知識都掌握的似是而非。
之前,我們談論過,我們的架構設計,一般DAL層是與表一一對應的。這是一種規(guī)則,可以使DAL層與BLL層之間的關系更加清晰、簡潔。但是,我們知道,在實際應用中,真正實現(xiàn)一個邏輯對應一個表是比較困難的,我們的業(yè)務不可能彼此孤立,而只能相對孤立。
因此,我認為:我們在設計之初,大方向依然按照DAL與表一一對應的原則進行設計。這里有一點需要注意:所寫的SQL語句,一定是要放在存儲過程里面的,因為存儲過程是預編譯類型。業(yè)務修改時,我們只需要修改對應存儲過程,實現(xiàn)對修改封閉的原則。
三、比較
通過上面的分析,我們可以得出:級聯(lián)操作與三層機構設計思想是彼此矛盾的。前者只適用于多表間的操作關系,而后者的宏觀路線是單對單。
然而,我認為,通過編寫存儲過程或者觸發(fā)器來實現(xiàn)級聯(lián)操作,這樣可以使得三層架構的設計更加靈活多變、更加具有彈性。
我們來看機房收費系統(tǒng)中的一個功能:充值功能。我們在充值的時候,不僅要更新卡表內(nèi)余額,同時也要增加充值記錄。
我們之前的做法是,在DAL層對應卡表編寫進行更新余額,在充值記錄表中添加相應記錄。然后在BLL層實現(xiàn)他們的協(xié)調(diào)工作。
這樣做有一個很大的弊端,充值的過程是一個順序過程,現(xiàn)更新,在添加記錄。如果中途斷電,那么數(shù)據(jù)就會不完整了。
看下面的例子,首先是數(shù)據(jù)庫關系圖
編寫下面觸發(fā)器,實現(xiàn)起來就非常方便了。
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 劉正權 -- Create date: 2012年5月7日 -- Description: 充值時,更新最新的余額的同時,增加充值記錄 -- ============================================= CREATE TRIGGER trigCharge ON card Update AS BEGIN Update chargerecord set c.ChargeCash=i.ChargeCash from chargerocord c,Deleted d, Inserted i where c.CId=d.id END GO |
四、結(jié)論
我認為,級聯(lián)操作與三層架構或者多層架構的思想是不矛盾的。想反,它使得分層更加靈活多變。
posted on 2012-06-20 09:46 順其自然EVO 閱讀(819) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫