在PostgreSQL上安装并使用扩展模块的教程
安装模块
注意:我的运行环境是Ubuntu10.04和PostgreSQL8.4
首先安装postgresql-contrib包并重启数据库服务器,然后检查contrib目录看是否包含一些可用模块:
sudoapt-getinstallpostgresql-contrib sudo/etc/init.d/postgresql-8.4restart cd/usr/share/postgresql/8.4/contrib/ ls
然后我们创建一个名为module_test的数据库:
supostgres createdbmodule_test
然后我们将模块chkpass,fuzzystrmatch,isn和hstore应用到module_test数据库,执行下面命令即可:
psql-dmodule_test-fchkpass.sql psql-dmodule_test-ffuzzystrmatch.sql psql-dmodule_test-fisn.sql psql-dmodule_test-fhstore.sql
接下来,我们来看看每个模块是如何使用的。
使用chkpass
chkpass模块引入一个新的数据类型“chkpass”这个类型用来存储一个加密的字段,例如密码。使用方法可以从下面的SQL里看到,存入chkpass字段的字符串会自动进行加密:
CREATETABLEaccounts(usernamevarchar(100),passwordchkpass); INSERTINTOaccounts(username,"password")VALUES('user1','pass1'); INSERTINTOaccounts(username,"password")VALUES('user2','pass2');
然后我们可以通过下面的SQL进行身份认证:
SELECTcount(*)fromaccountswhereusername='user1'andpassword='pass1'
其中=操作符使用了eq(column_name,text)方法,该方法由chkpass模块提供用于测试是否相等。chkpass使用Unix的crypt()函数,因此加密效果比较弱,该函数只对字符串的前8位进行加密,只要前8位相同的字符串就被认为是相等的。因此不建议在实际生产环境中使用chkpass模块,建议使用pgcrypto模块。
使用fuzzystrmatch
该模块提供的函数包括:soundx(),difference(),levenshtein()和metaphone()。soundx()和metaphone()是语音算法,将文本字符串转成基于发音的代码字符串。而difference()和levenshtein()则返回数值代表两个输入字符串的相似度。
让我们先看看levenshtein()和metaphone()函数:
SELECTlevenshtein('foodlets','booklets');
该查询返回2,很显然。
metaphone()函数需要两个参数,一个是文本字符串,另外一个是输出代码的最大长度的:
SELECTmetaphone('foodlets',6); SELECTmetaphone('fudlets',6);
如果你试图获取两个字符串的Levenshtein距离,那将返回0:
SELECTlevenshtein('FTLTS','FTLTS');
这意味着两个字符串发音类似。
fuzzystrmatch用在网站实现搜索功能上是非常有用的,而且可用于实现拼写检查和错误关键字纠正,相当于是Google上的“Didyoumean...”
使用isn
该模块提供了存储国际标准数值的数据类型,例如InternationalStandardBookNumbers(ISBN),InternationalStandardMusicNumbers(ISMN),InternationalStandardSerialNumbers(ISSN),UniversalProductCodes(UPC),等等。同时提供了校验函数、类型转换函数等等。
让我们来测试存储图书信息:
CREATETABLEbooks(numberisbn13,titlevarchar(100)) INSERTINTObooks("number",title)VALUES('978-03','Rework');
INSERT语句将会执行错误,因为输入的字符串不是一个有效的ISBN号,而下面的语句就可以正确执行:
INSERTINTObooks("number",title)VALUES('978-0307463746','Rework')
如果要将一个10位的ISBN转成13位的,可以使用isbn13()函数:
INSERTINTObooks("number",title)VALUES(isbn13('0307463745'),'Rework')
使用hstore
你肯定已经听到很多关于NoSQL以及key-value数据库的介绍,使用hstore模块可以让PostgreSQL具备key-value存储的功能。
想象你正在处理一个表格,你对表格力列头的名称和类型处理没有任何思路,而hstore就可以解决你的问题,hstore将key和value都作为文本存储,值可以为NULL,但key不允许。
我们来创建一个使用hstore类型的表,并往表插入一些数据:
CREATETABLEkv_data(idinteger,datahstore) INSERTintokv_datavalues (1,hstore('name','amit')||hstore('city','bangalore')), (2,hstore('name','raghu')||hstore('age','26')), (3,hstore('name','ram')||hstore('age','28'));
你可以创建你自己的key,例如“height”,“favourite_book”等等,而||运算符用于级联并列操作。
现在我们已经有一个表和少量测试数据,接下来看看怎么做查询、更改和删除操作,假设我们要查询city为bangalore的数据,可以使用如下SQL语句:
SELECT*fromkv_datawheredata->'city'='bangalore'
要获取表中的平均年龄可以使用如下语句:
SELECTavg((data->'age')::integer)agefromkv_data;
这里的::integer用于将文本数据转成整数,以便可以使用数学函数。
要根据姓名进行排序,方法是:
SELECT*fromkv_dataorderbydata->'name'desc
将所有城市更改为delhi:
UPDATEkv_dataSETdata=data||('city'=>'delhi');
然后删除age这个键:
UPDATEkv_datasetdata=delete(data,'age')
或者删除名为amit的记录:
DELETEfromkv_datawheredata->'name'='amit'
虽然这不是一个真正的key-value存储服务器,但hstore还是提供了做为NoSQL数据库足够的灵活性。
其他有用的模块
这里还有几个你可能会用到的模块:
- Pgcrypto提供了哈希和加密函数,支持SHA,MD5,Blowfish,AES等算法
- Citext增加了大小写敏感的文本数据类型,数据使用小写存储
- Uuid-ossp提供了全局唯一标示符的函数
- Pg_trgm增加了基于trigram匹配的字符串查找函数