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

当软件需求发生变化,数据库设计也相应的要做出变化的时候,不一定要抛弃以前的所有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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值