数据库重构6之结构重构1

结构重构正如其名,它改变了数据库schema的结构。

实现结构重构时,需要考虑一些常见问题:

  1. 避免触发器循环。如果一个原来的列值发生了改变,新列需要同步更新的话,但是这个更新不应该再次触发对原来列的更新。这样可能导致无限循环或者错误的结果。

  2. 修复被破坏的视图。视图定义通常与其他视图或者表的定义耦合在一起,进行结构重构时,可能会破坏视图。

  3. 修复被破坏的触发器。触发器与表定义耦合在一起,因此像列改名或移动列这样的结构性变更可能会破坏触发器。

  4. 发现被破坏的存储过程。存储过程会调用其他存储过程并访问表、视图和列。

  5. 发现被破坏的表。表与其他表的列是通过命名习惯间接耦合在一起的。也就是不同的表存在同名的列,列改名是需要统一修改。

  6. 确定转换期。结构重构需要一个转换期,以支持多应用和新旧schema。

以Oracle为例,以下代码可以找出被破坏的触发器:

SELECT Object_Name, Status FROM User_Objects WHERE Object_Type='TRIGGER' AND Status='INVALID';

以下代码可以发现被破坏的存储过程:

SELECT Object_Name, Status FROM User_Objects WHERE Object_Type='PROCEDURE' AND Status='INVALID';

以下代码可以找出所有列名包含“CUSTOMERNUMBER”的表:

SELECT Table_Name,Column_Name FROM User_Tab_Columns WHERE Column_Name LIKE '%CUSTOMERNUMBER%';

1 删除列

从现有的表中删除一个列。

https://i-blog.csdnimg.cn/blog_migrate/6c3c6a5deb7eee5dfe61fd30cb66803b.gif

动机

应用“删除列”的首要原因是为了重构数据库的表设计,或者是由于外部应用重构引起的,例如该列已不再使用。

可能的折中

被删除的列可能包含有价值的数据,数据需要保留下来。可以使用“移动数据”将数据移到其他表中。

Schema更新技巧

  1. 选择一种删除策略。通常只需要使用ALTER TABLE命令的DROP COLUMN选项。

  2. 删除列。有时候数据量很大,为了将影响降到最低,可以在使用最少的时间进行。另一种策略是将列标识为未使用,可以通过ALTER TABLE命令的SET UNUSED选项来实现,然后在非峰值时间删除这些未使用的列。

  3. 重建外键。如果FavoriteColor是主键的一部分,必须同时删除其他表中作为外键连接到Customer的对应列。还需要重建这些表上的外键约束。这种情况下,可能需要考虑先进行“引入替代键”或“用自然键取代替代键”重构,再进行“删除列”重构,以此来简化工作。

物理删除该列的另一种策略是通过引入一个不引用FavoriteColor的视图来隐藏它,这可以通过“用视图封装”重构来完成。

在转换期,必须为Customer.FavoriteColor提供一个注释,说明它不久就会被删除。在转换期结束时,通过ALTER TABLE命令删除该列,代码如下:

COMMENT ON Customer.FavoriteColor 'Drop date = September 14 2007';

-- On September 14 2004

ALTER TABLE Customer DROP COLUMN FavoriteColor;

如果使用SET UNUSED选项,代码如下:

ALTER TABLE Customer SET UNUSED COLUMN FavoriteColor;

ALTER TABLE Customer DROP UNUSED COLUMNS;

数据迁移技巧

最简单的方法就是创建一个临时表,其中包含源表的主键和要删除的列,然后将相应的数据迁移到这个新的临时表中。可以选择其他方法来保留数据,例如外部文件。

下面的代码创建了一个临时表,它包含Customer表的主键和FavoriteColor列,以及列中的数据。

CREATE TABLE CustomerFavoriteColor AS SELECT CustomerID, FavoriteColor FROM Customer;

访问程序更新技巧

必须确定并更新所有引用Customer.FavoriteColor的外部程序。需要考虑的问题包括:

  1. 重构代码,使用替代数据源。

  2. 简化SELECT语句。某些外部程序可能包含读取该列的查询,但随后又忽略了返回的值。

  3. 重构数据库的插入和更新。某些外部程序可能在插入数据库时将“假值”放入该列,这种代码需要删除。或者在插入或更新数据库时没有修改FavoriteColor列。另外,可能在应用中使用SELECT * FROM CUSTOMER 来获得一定数量的列,并通过位置引用从结果集中取出列的值。这样的应用代码可能被破坏,因为结果集现在少了一列。通常,SELECT *都不是一个好方法。但是,实际上这里的问题是使用了位置引用,这也是需要考虑重构的。

下面的JAVA代码演示了如何删除对FavoriteColor的引用。

 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-742227/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24945919/viewspace-742227/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值