ADOdb的数据字典功能及其它

在新项目中继续使用ADOdb,这个是没什么悬念的了,尝试过php5自带的pdo,感觉一般,对某些数据库的支持更一般。但是数据库结构如何维护这块放不下心,从以往的开发中看,系统开发维护期超过半年之后,如果在数据库schema管理上不下点功夫,在生产服务器和多个测试服务器以及sql结构之间,难免会产生schema不一致的情况,管理情况再差的,连最后一稿schema是哪个、以及schema注释都能丢失。所以,无意中瞥到ADOdb还有一个ADOdb Data Dictionary Library for PHP以后,就想看看这个能否用在多环境数据库schema同步方面,连同自己了解的一些其它情况,记录在这里。

ADOdb Data Dictionary Library for PHP

可以用简单的字符串或者数组的方式记录数据表的结构,然后调用相关功能来生成修改数据库的sql语句,并执行之。应该是在创建数据表方面还是非常方便的,虽然数据类型简单了一些,执行和调用也略显麻烦(抱歉我的确是这么认为的),但在简单的应用中,尤其是数据表修改不是很多的情况下,应该会很好用。

ADOdb XML Schema (AXMLS)

这个其实也是包含在ADOdb中的,其介绍也是直接列在了ADOdb Data Dictionary Library for PHP同一页的下方。在仔细把这段并不多的内容读完之后,我是半喜半忧,喜的是AXMLS这个东西可真好啊,相当于能够把整个数据库的schema xml化了,然后对实体数据库进行更新;忧的方面一是,在最新的ADOdb5.04当中,依然没有完全实现AXMLS中的全部功能,我建了一个简单的xml,其中带有一句:

<opt platform="mysql">TYPE=INNODB</opt>

然后在一个空的数据库上执行,输出sql,发现CREATE TABLE的sql中并没有带上ENGINE=InnoDB,所以就停止了尝试;忧的方面二是这么好的东西,它的官方网站上最新的消息却是2004年6月17号的,一个软件不可能在4年中一点都没有改动,况且那时候还没有php5呢吧。在互联网其它方面来搜索这个AXMLS,发现只是在adodb中有,并没有在其它项目中得到运用,可惜了了。

一些商业软件的实现

很多商业软件的数据库schema管理一般都在case工具中,也有生成sql甚至直接对数据库应用schema变更的功能,比如我以前使用的PowerDesigner,不仅是最好的数据库实体模型设计工具,而且设计完成后,直接连上数据库进行更新。也可以反过来,从实体数据库中分析出数据库模型。

东西是好东西,可用了一段时间不再想用下去了,原因是多方面的,一是Sybase的东西bug总是很多,有时候莫名其妙的错误提示很头疼,二是数据库大了以后,每次连线diff的时候都很慢,最要命的是,它在更改column时喜欢用临时表,然后删除原表建新表,再从临时表中把数据读回来,一旦这个过程由于数据库兼容问题或者其它原因被中断,下次再同步的时候,很有可能数据库结构更新了,而数据却丢失了,因为它有自动删除临时表的选项,并且一般大家还都需要打开这个选项;最后一个原因,这玩意儿既没有Linux版本,我也没有正版的授权,所以能下岗就下岗了。

自己用简单的脚本来实现

其实在实际的应用开发中,数据库相关要修改的地方会很多,不仅有表、索引、视图等数据库本身的元素,还可能会有一些数据的调整和处理,比如将表中的A、B字段去掉,他们的值相加存储在一个新的C字段中,如果说前者应该会有成型的工具能够实现的话,像后面所说的这种数据库,或者更准确一点说是数据调整在任何工具中都不会涉及到的。

反过来想,无论是对数据库如何进行操作,无外乎就是DDL数据库定义语言和DML数据库管理语言,也就是通过大家常说的SQL语句来操作,那么把这些简化为一个SQL语句集合,就可以将开发过程中所有的数据库变动转化为这一系列SQL语句的管理和执行,设计这样一个工具不就得了么?

我现在就是这么作的,在svn中除了有保存数据库最终状态的schema sql文件之外,还专门有一个php文件,用数组记录每一次需要对数据库调整的SQL,然后有一个执行记录表,记录哪些SQL执行过而哪些没有。这个执行记录表在每个数据库实例中都会创建,这样,我只需要简单的调整数据库连接参数,然后就可以通过执行php代码,依次逐个的执行每个SQL了。

有一个缺点,就是SQL语法太依赖具体的数据库类型了,没办法,好在更换数据库的情形并不多,平时尽量写标准的语法吧。另外真要转换数据库的时候,还可以另起炉灶嘛。

其它的开源软件都是怎么实现的呢?

我阅读过的开源软件源码并不多,但软件还是用了一些,在有些软件升级的时候,就会自动将数据库也升级了,他们都是怎么实现的呢?难道说只是在1.0升级到2.0的升级程序upgrade.php中,固定的、一次性执行数据库修改么?

关于同类数据备份和迁移

以前一个朋友用oracle数据库的时候,特别喜欢用tora(他管它叫蛤蟆,因为软件的about页上有只蛤蟆),但我却认为,在同类数据库,尤其是版本、配置相同的数据库之间进行数据转移,方便一点的方法是利用数据库的导出、导入功能,这样不会有DML覆盖范围以外的内容拉下,简单一点的,自己写个小程序,连上两个数据库,这边读来那边写,也不会慢到哪里去,想提前删个索引什么的也好控制。tora一类的工具,应该是在灌初始字典库的时候用最合适。另外,不是还有bcp么?

参考

如何为网站添加sitemap文件

什么是sitemap?简单的说,就是一个xml文件,定义了你网站“主要栏目”的结构,以方便搜索引擎更好的建立索引和抓取文件。是对一些从其他页面不怎么链接得到的页面尤其有用,更详细的信息可以查阅Wikipedia上的说明

Google是支持sitemap的,Google帮助中的How do I create a Sitemap file?一文列举了一些生成sitemap的方式和工具,我采取的是第一种——sitemap protocol方式,详细说明在这里,英文好的朋友可以直接去啃,不用看我在下面罗嗦了。

第一步,准备工作

由于Google Sitemap Generator是使用python语言编写的,所以需要python 2.2以上的版本支持,其余的要求如要有文件的访问权等等不再详述。由于我的操作系统是Ubuntu,所以python支持也没问题。

http://www.sourceforge.net/project/showfiles.php?group_id=137793&package_id=153422下载Google Sitemap Generator的程序文件,在本机建一个目录把它解压缩。

第二步,创建配置文件

把刚才解压缩得到的example_config.xml文件另存为config.xml,并编辑之:

<site base_url=”http://www.example.com/” store_into=”/var/www/docroot/sitemap.xml.gz” verbose=”1″ >

其中base_url是网站地址,store_into是sitemap文件的地址,最好使用绝对路径,于是上面的内容修改为:

<site base_url=”http://www.fwolf.com/” store_into=”/home/fwolf/sitemap.xml.gz” verbose=”1″ >

接下来修改** MODIFY or DELETE **开头的sitemap生成方式定义部分,要删除掉不打算使用的生成方式,按照xml语法标签来分,生成方式有以下几种:

  • url,网页地址,附加定义为最后修改时间,更新周期,优先级,个人认为这种方式比较麻烦。
  • urllist,通过一个包含网页地址列表的文件,可以定义文件优先级,个人认为这种方式还不如直接使用urllist文件省事。
  • directory,文件地址,附加定义为文件、对应网址、默认索引页,个人认为这种方式比较适合我们,因为在本机一般都会有一套比较完整的网站文件,用他们来生成sitemap再合适不过了。
  • accesslog,网站日志文件,有必要么?
  • sitemap,sitemap节点文件,主要用于把多个分散的sitemap文件集合起来。

在这里我们删除掉其他的方式,只保留directory方式,并对其进行修改,结果如下:

<directory path=”/home/fwolf/website” url=”http://www.fwolf.com/” default_file=”index.html” /> <directory path=”/home/fwolf/website/wordpress” url=”http://www.fwolf.com/blog” default_file=”index.php” /> <directory path=”/home/fwolf/website/bnt” url=”http://www.fwolf.com/bnt” default_file=”index.php” /> <directory path=”/home/fwolf/website/dokuwiki” url=”http://www.fwolf.com/dokuwiki” default_file=”index.php” />

注意一般简单的网站只要有一个directory就可以了,但也可以有多个directory段,仅当你的网站是用子目录来划分栏目,也就是对应到本机不一定放在一个目录下调试的情况下才建议使用。可以用default_file来定义首页文件。

接下来修改FILTERS段,索引文件过滤部分。过滤规则是自上而下匹配的,匹配动作action有两种drop和pass,drop明确不索引文件,pass则是索引文件(但也有可能被后面的规则排除),匹配规则type可以是wildcard或者regexp,wildcard是使用通配符*和?来匹配文件,regexp自然就是正则表达式了。注意默认的匹配动作是drop不索引文件,所以要想简单的索引所有文件,这一段留空就可以了。

<filter action=”drop” type=”wildcard” pattern=”*/cert/*” />

这里我只简单的屏蔽掉信息产业部备案文件保存的那个目录,注意pattern是要和完整的网址进行匹配,略微不同于apache conf文件中的rewrite规则写法。

第三步,运行Google Sitemap Generator

很简单,./sitemap_gen.py –config=config.xml 就可以了,生成的sitemap文件会保存在刚才定义的store_into目录中,要想解压缩查看的话,用gunzip -d sitemap.xml.gz解开就可以了。一定要仔细查看这个sitemap文件,并根据它的内容,再去修改config.xml,反复直到满意为止。

最后,登录Google Webmaster Tools提交你的sitemap文件即可。

Google Sitemap Generator生成的sitemap文件中还是存在很多不必要的文件的,比如dokuwiki和wordpress的源文件、说明文档有上千个,手工和用FILTERS来去除我觉得都不是很方便, 所以再介绍一种更简单的添加sitemap的方式,就是纯文本文件,例如:

http://www.fwolf.com/ http://www.fwolf.com/blog/ http://www.fwolf.com/bnt/ http://www.fwolf.com/dokuwiki/

上述内容保存为sitemap.txt,然后上传到网站根目录,就可以到Google Webmaster Tools里面提交了,使用地址http://www.fwolf.com/sitemap.txt,注意每行一个网址,不能有其他任何内容,最好放在网站的根目录下。相对于使用Google Sitemap Generator生成sitemap.xml来说,我觉得这种纯文本文件的方式更简单、实用,包含的内容也更容易控制,应该更适合小型网站使用。

Update @ 2008-07-10

推荐一个不错的WordPress插件,用来管理和生成Sitemap:Google (XML) Sitemaps Generator for WordPress,我现在也在用它。