SQL练习之不破坏应用程序现有查询的修改模式

     当我还是一个菜鸟的时候,当然现在也是,当我的软件需求发生变化时,并且数据库设计同样要求发生变化,我通常会放弃原有的代码(或者对原有的代码进行大改),先在我知道了两个不破坏应用程序现有查询的修改模式,下面就来一个个介绍!

假设你的公司有一张记录在数据库中的设备登记表:

资产标识    描述              收到日期

50430     桌面PC           2016-5-6

50431     19寸监视器     2016-5-7

现在公司再融资之后,进行了扩张,在另一个地方又建立了新的办公室,这个时候如果简单的复制并修改原先的应用和数据库,并且在两个位置独立运行的实例是一种诱人的做法(说简单点就是再建一个用于维护新办公室信息的页面),然后这种做法虽然快速地解决了当前的问题,但是从长远的角度看会引起跟多的问题,这样我们有两个应用程序需要维护(并且这两个应用程序在功能上基本接近),所以这种方法不具有伸缩性,并且随着办公室的增加会使问题变得更加糟糕!

下面是分析列子所需的sql文件:

CREATE TABLE Equipment(
AssetTag varchar(30) not null,
Description varchar(255) null,
RequiredDate datetime null
)
INSERT INTO Equipment VALUES('50430','桌面PC',GETDATE())
INSERT INTO Equipment VALUES('50431','19寸监视器',GETDATE())

代码如下:

SELECT * 
FROM Equipment
image.png

1、通过修改表的方式完成不破坏应用程序现有查询的修改模式  代码如下:

ALTER TABLE Equipment ADD Office varchar(30) null

UPDATE Equipment
SET Office='Headquarter'

SELECT * 
FROM Equipment

这个时候,在表中添加一个新列Office,并且将现在设备表中的每一行数据都被赋值给了现在的办公室。

但是这一点都不符合大多数的实际情况,大所属情况可能是,我们将老办公室的一部分设备(用不到了的)搬到新办公室,然后老办公室被提升为总部(负责管理),这个时候只能手动去修改哪些已经被转移的设备到新的办公室!

现在我们可以插入新办公室的数据行了。然而这个时候问题又来了,原先依赖与这个表的所有查询都需要被重新检查。没有指定列的INSERT操作都会执行失败。因此,如果原来的INSERT语句为:

INSERT INTO Equipment VALUES('50431','19寸监视器',GETDATE())

DBMS会报错:列名或所提供值的数目与表定义不匹配。

但是,如果语句是:

INSERT INTO Equipment(AssetTag,Description,RequiredDate) VALUES('50430','桌面PC',GETDATE())

那么这句INSERT将会执行成功,NULL值将会被输入Office列。

可以看到,即使表以及被修改,还能是原先的查询正常的工作,但是他们会返回来自两个办公数的数据,即使我们只希望返回一个办公室的数据!

2、第二种模式通过代替表的视图来完成不破坏应用程序现有查询的修改模式

另一种方式是把现有的设备数据复制到新设计的设备表中,然后将新表中的每一行数据都归为老办公室的,如果设备有移动,那就做相应数据的更改,代码如下:

CREATE TABLE EquipmentMultiSite(
AssetTag varchar(30) not null,
Description varchar(255) null,
RequiredDate datetime null,
Office varchar(30) null
)

INSERT 
INTO EquipmentMultiSite
SELECT Equipment.*,'Headquarter'
FROM Equipment

SELECT *
FROM EquipmentMultiSite

这里如果如果设备有移动,那就做相应数据的更改!修改之后的数据就是老办公室的设备数据!

现在就可以删除Equipment表,并用一个同名的Equipment视图来替换!

DROP TABLE Equipment
go
CREATE VIEW Equipment AS
SELECT AssetTag,Description,RequiredDate
FROM EquipmentMultiSite 
WHERE Office='Headquarter'
go

这个时候,你会发现应用程序现有的查询,依然能够正常的工作,原先的办公室使用Equipment,不在乎他使用的是表还是视图,老办公室的经理现在应该能够继续利用该数据库的应用程序,但是他仅能操作(增删查该)老办公室的有关的设备。

但是对于新办公室的经理,你还需要做一些工作,你要确保Equipment关联每一个用户,这样的话,你就能为每一个用户以硬编码的方式指定正确的办公室!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

简单分析oracle的数据存储(r2笔记89天)

在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以...

31680
来自专栏用户画像

mysql模拟题三

  9、找回mysql服务器root密码的很重要的一步是跳过权限表的检查启动mysql,该命令是(D)(2分)

13420
来自专栏hanlp学习笔记

使用HanLP增强Elasticsearch分词功能

hanlp-ext 插件源码地址:http://git.oschina.net/hualongdata/hanlp-ext 或 https://github.c...

15320
来自专栏数据和云

Oracle 18c 新特性:动态 Container Map 增强 Application Container 灵活性

盖国强,云和恩墨创始人,Oracle ACE总监,中国地区首位Oracle ACE和ACE总监,曾获评"中国首届杰出数据库工程师"奖,拥有近 20 年的数据库实...

10820
来自专栏FreeBuf

企业安全建设之路:端口扫描(下)

0x00、前言 在企业安全建设过程当中,我们也不断在思考,做一个什么样的端口扫描才能企业业务需求。同时,伴随着企业私有云、混合云以及公有云业务部署环境的不断变...

540100
来自专栏张戈的专栏

DIY网站统计:WordPress排除管理员评论及精准友链数的方法

今天关注了一下网站统计,发现留言 1600+,想想肯定是把我自己的留言也算进去了,感觉太水了,不真实!另外友链数目也不对,明显是把所有链接都加进去了! ? 于是...

34630
来自专栏Linyb极客之路

MySQL 表锁和行锁机制

行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习My...

59330
来自专栏杨建荣的学习笔记

分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)

之前总结过一篇,分分钟搭建MySQL Group Replication测试环境(r11笔记第82天),但是有一个地方还有待改善,那就是那个脚本仅仅支持s...

38670
来自专栏Java Web

SpringBoot技术栈搭建个人博客【项目准备】

总体目标:设计一套自适应/简洁/美观/易于文章管理发布的一个属于我个人的博客,最后一页能展示我个人的简历,因为大三快结束了马上就该去找工作了...哦忘了,最重要...

50380
来自专栏黑白安全

什么是搜索引擎索引和收录?有什么区别?

昨天和一个做网站优化的朋友(SEO 新手)交流,说到了搜索引擎的索引、收录,子凡相信这也是很多入门 SEO 新手都比较容易混淆的两个点,所以我们就一起来看看搜索...

12840

扫码关注云+社区

领取腾讯云代金券