`

不破坏现有查询的修改模式

阅读更多

当软件需求发生变化,数据库设计也相应的要做出变化的时候,不一定要抛弃以前的所有SQL语句,通过使用视图来代表已经不存在的表,就能确保现有的查询依然能够正常工作。
例如:假如公司有一张记录,记录了办公室设备的登记情况,
设备登记表:

 标识  描述  购买日期
 50430  PC主机  2008-05-06
 50431  19寸显示器  2008-07-06

现在,如果公司在另外一个地方又建立了一间新的办公室,需要跟踪两套不同办公室的设备。如何办到呢?

方案1,复制数据库
简单的复制数据库、并在每一个办公室运行一个数据库实例是一种较为迅速的解决办法,但从长远来看将会引起更多问题。那将需要有两个应用程序需要维护,两套不容易合并到一起的数据。这种方案不具备伸缩能力,随着新办公室建立的增多将会使问题更糟糕。


方案2,修改表结构
SQL提供了在保留现有数据的同时添加列的命令:
alter table equipment add column office varchar(20);
update equipment set ffice ='Headquarters';

这样就添加了一个新列,并且该列在每一行都赋值为“总部”,现在就可以插入新办公室的数据了。
但问题在于,依赖于这个表的以前所有查询都需要重新检查,没有指定列的insert语句会执行失败,比如以前的insert语句如果是:
insert into equipment values (50432,'Laser Printer',Date '2008-08-06')
就会报错,需要改成:
insert into equipment (assetTag,description,dateAcquired) values (50432,'Laser Printer',Date '2008-08-06')
这样插入数据后,以前的查询依然可以工作,但返回的数据就不止一个办公室了。


方案3,创建代替表的视图
创建一个新表,并把原先的数据复制到新表,
create table equipmentMultiSite
(assetTag integer primary key,
description varchar(100),
acquired date,
office varchar(20) default 'Headquarters');
insert into equipmentMultiSite
  select assetTag,description,dateAcquired,'Headquarters' from equipment;

然后删除原有的equipment表,新建一个视图来代替它,
drop table equipment;
create view equipment as
 select assetTag, description, acquired 'dateAcquired' from equipmentMultiSite where ffice='Headquarters';

因 为查询语句并不关心查询的是表还是视图,所以以前的查询都不必修改就能得到正确的数据,并且插入和更新视图equipment的语句也能影响到具体的表, 只需要注意在操作新的办公室的数据时,用到的是equipmentMultiSite,而不是视图equipment。

分享到:
评论

相关推荐

    FortiGate透明模式

    总之,透明模式是FortiGate的一个强大特性,它不仅简化了网络集成过程,还提供了丰富的安全功能,使得企业能够在不破坏现有网络结构的情况下,加强网络安全防护。通过深入了解和合理配置,网络管理人员可以最大限度...

    java 设计模式试题

    静态工厂模式不能形成继承结构(C),而工厂方法模式可以。另外,静态工厂模式中对象的创建类别和时机通常是混合在一起的,不符合开闭原则。 ### 16. 观察者模式的特点 观察者模式中,观察者角色的更新是被动的(A),...

    设计模式 让你轻松理解设计模式,提高开发效率

    该模式提供了一种在不破坏封装性的前提下捕获一个对象内部状态的方法,使得对象可以在内部状态被更改之后恢复到原先的状态。文章中通过“MM聊天”的例子,展示了备忘录模式如何保存和恢复对象的状态。 ### 总结 ...

    java软件设计模式期末总结

    - **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的状态。 - **访问者模式**:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变...

    java设计模式的应用

    这种模式允许在不修改现有代码的情况下增加新的实现。 - **享元模式**:运用共享技术有效地支持大量细粒度的对象。这种模式通过共享尽可能多的数据来支持大量细粒度的对象。 ##### 2.3 行为型模式 - **模板方法...

    《设计模式》中文版

    - 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 - 观察者模式(Observer):定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于...

    C#设计模式(23种设计模式)

    这种模式非常适合于需要扩展类的实例化逻辑,但不希望修改现有代码的情况。在C#中,可以通过继承和多态来实现工厂方法模式。 #### 5. 原型模式(Prototype) 原型模式通过复制现有的实例来创建新对象,而不是通过...

    设计模式专题---设计模式示例代码(全)(python--c++)

    8. **Memento模式**:Memento模式是用于保存对象状态的一种创建型设计模式,它允许在不破坏封装性的前提下恢复对象到之前的状态。 9. **Flyweight模式**:Flyweight模式属于结构型设计模式,用于减少大量细粒度对象...

    设计模式介绍全22种设计模式的中文教材

    - 寄生构造器模式:与建造者模式相似,但不创建新类型,而是使用现有的类来构造新对象。 2. **结构型模式** 关注如何将类或对象组合成更大的结构,同时保持它们之间的松耦合。包括: - 适配器模式:使两个接口不...

    设计模式精解-GoF23种设计模式解析附C实现源码.pdf

    Memento模式在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。 #### 3.6 Mediator模式 Mediator模式用一个中介对象来封装一系列的对象...

    23种设计模式文档

    19. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的状态。 20. **解释器模式**:给定一个语言,定义它的文法表示,并且提供一个解释器,用于...

    戏说23种设计模式 基于GOF的设计模式

    这种模式在集成第三方库或者旧系统时非常有用,它可以让我们重用现有组件,而不需要修改它们的源代码。 #### 7. 桥接模式(Bridge) 桥接模式是用于分离抽象与实现,使得两者可以独立变化。它通过将抽象部分与它的...

    设计模式学习报告

    - **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 - **观察者模式**:定义对象间的一种一对多的依赖关系,当一个...

    传说中的经典设计模式书

    18. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态,以便在需要时能恢复到之前的状态。 19. **观察者模式**:定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到...

    安全模式修复工具.rar

    当计算机被病毒破坏到无法正常进入安全模式时,这往往意味着病毒或恶意软件已经干扰了系统的关键组件,特别是与启动过程相关的设置。在这种情况下,“安全模式修复工具.rar”就是为了帮助解决这个问题而设计的。 该...

    python实现23种设计模式.设计模式python语言版

    17. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的状态,并在该对象状态改变时恢复。 18. **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    GoF23种经典模式+简单工厂模式讲解还有一篇心得

    17. **备忘录模式**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象的状态。 18. **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变...

Global site tag (gtag.js) - Google Analytics