SQL Server数据库基础的级联删除、级联更新与三层架构之窥

上一篇 / 下一篇  2012-06-20 09:37:34 / 个人分类:数据库

一、定义

7c%I!fl#\2t9V0  级联删除是指删除包含主键值的行的操作,该值由其它表的现有行中的外键引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

8I@_,L%]ZU#Z051Testing软件测试网6d_G8lm#x

  级联更新是指更新主键值的操作,该值由其它表的现有行中的外键引用。在级联更新中,更新所有外键值与新的主键值相匹配。51Testing软件测试网'b%\(bgNnf

Hs8bGw aD0  三层架构是指一种架构思想。通常他将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的是为了“高内聚、低耦合”的思想。51Testing软件测试网 T,q CbN9q[s

51Testing软件测试网+S9KkMEE"gZ

  二、特点51Testing软件测试网"dP \WSx$H

51Testing软件测试网f&N+J;d"Z@y5v

  大家都知道,级联删除与级联更新操作,都是指主表的信息删除或更新后,外键表中的相应信息随主表保持一致,也同样做出删除或更新操作,不然就会发生错误,保持数据的事务性。51Testing软件测试网j*{ xx8S-u

51Testing软件测试网{[6pj&AZ

  而关于三层架构的分层问题,我们之前就讨论过。看似简单,但是越是往细处想,越是发现疑点重重,很多知识都掌握的似是而非。51Testing软件测试网uOJC|#Ly2p/E

C"m|_5jp0  之前,我们谈论过,我们的架构设计,一般DAL层是与表一一对应的。这是一种规则,可以使DAL层与BLL层之间的关系更加清晰、简洁。但是,我们知道,在实际应用中,真正实现一个逻辑对应一个表是比较困难的,我们的业务不可能彼此孤立,而只能相对孤立。

DQjKq+f0

j~luS|0  因此,我认为:我们在设计之初,大方向依然按照DAL与表一一对应的原则进行设计。这里有一点需要注意:所写的SQL语句,一定是要放在存储过程里面的,因为存储过程是预编译类型。业务修改时,我们只需要修改对应存储过程,实现对修改封闭的原则。51Testing软件测试网+xWl2iaF

51Testing软件测试网|6_z)zfq/a4@Z

  三、比较51Testing软件测试网"\5@N n.VRC

51Testing软件测试网/i"D@y){jn

  通过上面的分析,我们可以得出:级联操作与三层机构设计思想是彼此矛盾的。前者只适用于多表间的操作关系,而后者的宏观路线是单对单。

~)~?I}#X ~0

!]@_+[^B0  然而,我认为,通过编写存储过程或者触发器来实现级联操作,这样可以使得三层架构的设计更加灵活多变、更加具有弹性。51Testing软件测试网 v@[@K^"h

51Testing软件测试网6]0lB1Q5u%@\D_8z{

  我们来看机房收费系统中的一个功能:充值功能。我们在充值的时候,不仅要更新卡表内余额,同时也要增加充值记录。51Testing软件测试网b#g$rwBx,n

5itJ2|F6jv?0  我们之前的做法是,在DAL层对应卡表编写进行更新余额,在充值记录表中添加相应记录。然后在BLL层实现他们的协调工作

&Q~D yLWVI9h'Y5Z051Testing软件测试网+N? nrR.~ B

  这样做有一个很大的弊端,充值的过程是一个顺序过程,现更新,在添加记录。如果中途断电,那么数据就会不完整了。

r#CU'X:cM S]0

^!do4i I7U3s#H,y0  看下面的例子,首先是数据库关系图

`0y$?@3{QG T&v ^0

t_CHQ0

  编写下面触发器,实现起来就非常方便了。

|2R-r2C^{.DR {{z0
SET ANSI_NULLS ON51Testing软件测试网f$\ t:}o9[{
GO51Testing软件测试网*`k9W n gRw
SET QUOTED_IDENTIFIER ON51Testing软件测试网-nK h}xH Jt]
GO51Testing软件测试网/~$f{$jgC:Xjw
-- =============================================
BnDv3y){0-- Author:  刘正权51Testing软件测试网-}%F(Uc$w a
-- Create date: 2012年5月7日51Testing软件测试网pQF bF'f
-- Description: 充值时,更新最新的余额的同时,增加充值记录51Testing软件测试网 j!FK,}M
-- =============================================51Testing软件测试网,zo7x$ZZ)yU
CREATE TRIGGER trigCharge51Testing软件测试网@aM![?6K/Jj
   ON  card
1h rG;Pj \r0   Update51Testing软件测试网X4q@6n&t@mIi
AS51Testing软件测试网8o/f!p-AF Jnzw
BEGIN51Testing软件测试网Z$hk+m"?@b`-E,J
 Update chargerecord set c.ChargeCash=i.ChargeCash51Testing软件测试网^1v7c1YKF#TH
 from chargerocord c,Deleted d, Inserted i51Testing软件测试网:Us5hQ.eQ
 where c.CId=d.id51Testing软件测试网1A@Tsp-Mo
END51Testing软件测试网zL z HH J!hMQ
GO

  四、结论51Testing软件测试网9?8rU"Il6S tM

  我认为,级联操作与三层架构或者多层架构的思想是不矛盾的。想反,它使得分层更加灵活多变。

l6\ ]4~wi ~l:f z G0

TAG:

 

评分:0

我来说两句

Open Toolbar