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