TODO: 这个文档我会不断更新
PSI作为一款应用,随着时间的过去,会面临如下的挑战:
1、PHP代码如何升级?
2、数据库如何升级?
下面的方法,都是在客户没有自己做修改定制的前提下(客户自己做了修改定制,我基本上就无解)。
1、PHP代码升级,这个容易,下载新PHP代码,再删除原来部署的PHP代码,再部署新版本的PHP代码。
在:\web\Public\Scripts\PSI\Const.js 这个文件中,记录当前PHP代码的版本。在JS中通过PSI.Const.VERSION就能获得。
把PHP代码的版本记录在JS文件中,很奇葩,好吧,我承认。因为当时我决定记录版本信息了,头脑一短路,就选了写代码最方便的方式,存在JS中了。不过考虑到JS代码基本要配合这PHP代码一起用,这样来记录版本,也算马马虎虎。
2、数据升级,是比较麻烦的事情。
2.1 需要记录数据库版本,为此我增加了一个表 t_psi_db_version,具体格式见数据库设计文档,这里不多说,通过这个表,就能获得当前数据库的版本。
2.2 但是这个不够,因为如果t_psi_db_version被破坏,还是会出问题。
2.3 这样追溯下去,总的有个版本号得信任。这个能信任的是\web\Public\Scripts\PSI\Const.js 中记录的版本号。
2.4 取得JS中的PSI.Const.VERSION的值,如果这个值不是预定范围内的值(什么是预定范围内,目前我还没有仔细设计),就根本不让登录界面出现。
2.5 增加一个模块“系统升级”
下面说说,系统升级的升级算法。
假设是四个版本状态:V1、V2、V3、V4
当前PSI.Const.VERSION 的值是 V2
2.5.1 判断数据库是否是V2状态,怎么判断?办法是穷举法。一个表一个表地判断表结构是否正确。
经过穷举法,得出数据库版本如果是V3、V4,那么就不能升级数据库,而是提醒用户PHP代码版本过低。
经过穷举法,得出数据库版本如果是V2,则提示用户不用升级。
经过穷举法,得出数据库版本是V1(当然了,比V1版本更低的V0,也没问题),就可以开始升级。
2.5.2 数据库升级
第一种情况:需要增加表,这个最容易,直接执行对应的SQL语句即可。(其实,也有问题的,其中的数据怎么来?)
第二种情况:需求删除表,这个只是理论上存在,我自己都没想出来对应的场景。
第三种情况:表增加字段。
第四种情况:表删除字段。
如果仅仅是调整结构,那就执行SQL倒是简单,但实际问题,没这么简单。
举个眼前就会发生的业务例子来说明这个问题:
1、目前商品只有一个计量单位,客户也投入使用了,录入了数据。
2、产品升级,商品支持一个计量单位,也支持采购是一种计量单位,销售是另外一种计量单位。
这种情况下,新增的表字段,数据从哪里来? 我目前还没有好的办法来处理这样的情形
2015-3-9补充:
借助网址维护离线这中方法,当新增字段缺少数据的时候,与之对应的模块均“offline", 但不涉及该字段的模块,依然可以使用。 当管理员通过后台把缺少的数据补充后,该模块就重新“online”。
end of 2015-3-9补充
在变更表的时候,有个小技巧:
假如要变更t_goods这个表,先创建一个和t_goods表结构完全一样的表,名字为: t_goods_[时间戳],例如 t_goods_2015030522360101 ,然后把t_goods表里面的数据完全copy到新的表里面。
SQL语句是:
CREATE TABLE 新表
SELECT * FROM 旧表