qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          SQL Server數(shù)據(jù)庫(kù)基礎(chǔ)的級(jí)聯(lián)刪除、級(jí)聯(lián)更新與三層架構(gòu)之窺

          一、定義

            級(jí)聯(lián)刪除是指刪除包含主鍵值的行的操作,該值由其它表的現(xiàn)有行中的外鍵引用。在級(jí)聯(lián)刪除中,還刪除其外鍵值引用刪除的主鍵值的所有行。

            級(jí)聯(lián)更新是指更新主鍵值的操作,該值由其它表的現(xiàn)有行中的外鍵引用。在級(jí)聯(lián)更新中,更新所有外鍵值與新的主鍵值相匹配。

            三層架構(gòu)是指一種架構(gòu)思想。通常他將整個(gè)業(yè)務(wù)應(yīng)用劃分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的目的是為了“高內(nèi)聚、低耦合”的思想。

            二、特點(diǎn)

            大家都知道,級(jí)聯(lián)刪除與級(jí)聯(lián)更新操作,都是指主表的信息刪除或更新后,外鍵表中的相應(yīng)信息隨主表保持一致,也同樣做出刪除或更新操作,不然就會(huì)發(fā)生錯(cuò)誤,保持?jǐn)?shù)據(jù)的事務(wù)性。

            而關(guān)于三層架構(gòu)的分層問題,我們之前就討論過。看似簡(jiǎn)單,但是越是往細(xì)處想,越是發(fā)現(xiàn)疑點(diǎn)重重,很多知識(shí)都掌握的似是而非。

            之前,我們談?wù)撨^,我們的架構(gòu)設(shè)計(jì),一般DAL層是與表一一對(duì)應(yīng)的。這是一種規(guī)則,可以使DAL層與BLL層之間的關(guān)系更加清晰、簡(jiǎn)潔。但是,我們知道,在實(shí)際應(yīng)用中,真正實(shí)現(xiàn)一個(gè)邏輯對(duì)應(yīng)一個(gè)表是比較困難的,我們的業(yè)務(wù)不可能彼此孤立,而只能相對(duì)孤立。

            因此,我認(rèn)為:我們?cè)谠O(shè)計(jì)之初,大方向依然按照DAL與表一一對(duì)應(yīng)的原則進(jìn)行設(shè)計(jì)。這里有一點(diǎn)需要注意:所寫的SQL語句,一定是要放在存儲(chǔ)過程里面的,因?yàn)榇鎯?chǔ)過程是預(yù)編譯類型。業(yè)務(wù)修改時(shí),我們只需要修改對(duì)應(yīng)存儲(chǔ)過程,實(shí)現(xiàn)對(duì)修改封閉的原則。

            三、比較

            通過上面的分析,我們可以得出:級(jí)聯(lián)操作與三層機(jī)構(gòu)設(shè)計(jì)思想是彼此矛盾的。前者只適用于多表間的操作關(guān)系,而后者的宏觀路線是單對(duì)單。

            然而,我認(rèn)為,通過編寫存儲(chǔ)過程或者觸發(fā)器來實(shí)現(xiàn)級(jí)聯(lián)操作,這樣可以使得三層架構(gòu)的設(shè)計(jì)更加靈活多變、更加具有彈性。

            我們來看機(jī)房收費(fèi)系統(tǒng)中的一個(gè)功能:充值功能。我們?cè)诔渲档臅r(shí)候,不僅要更新卡表內(nèi)余額,同時(shí)也要增加充值記錄。

            我們之前的做法是,在DAL層對(duì)應(yīng)卡表編寫進(jìn)行更新余額,在充值記錄表中添加相應(yīng)記錄。然后在BLL層實(shí)現(xiàn)他們的協(xié)調(diào)工作

            這樣做有一個(gè)很大的弊端,充值的過程是一個(gè)順序過程,現(xiàn)更新,在添加記錄。如果中途斷電,那么數(shù)據(jù)就會(huì)不完整了。

            看下面的例子,首先是數(shù)據(jù)庫(kù)關(guān)系圖

            編寫下面觸發(fā)器,實(shí)現(xiàn)起來就非常方便了。

          SET ANSI_NULLS ON
          GO
          SET QUOTED_IDENTIFIER ON
          GO
          -- =============================================
          -- Author:  劉正權(quán)
          -- Create date: 2012年5月7日
          -- Description: 充值時(shí),更新最新的余額的同時(shí),增加充值記錄
          -- =============================================
          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é)論

            我認(rèn)為,級(jí)聯(lián)操作與三層架構(gòu)或者多層架構(gòu)的思想是不矛盾的。想反,它使得分層更加靈活多變。

          posted on 2012-06-20 09:46 順其自然EVO 閱讀(820) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 永吉县| 荣昌县| 宾阳县| 南和县| 安塞县| 航空| 民和| 冕宁县| 达尔| 莲花县| 陆川县| 石屏县| 金华市| 招远市| 巴南区| 区。| 林西县| 兴安盟| 扶沟县| 汉阴县| 和硕县| 普兰县| 镇雄县| 盐边县| 芜湖市| 五常市| 昭觉县| 千阳县| 周口市| 永春县| 隆子县| 扬州市| 黔西县| 深州市| 格尔木市| 茂名市| 新竹市| 尚义县| 高要市| 乌鲁木齐县| 吐鲁番市|