PostgreSQL 到底比其他的强了在哪里了
最近听到一个说法,传统的关系型数据库分为两种,PostgreSQL 和Others,听上去有些刺耳,但为什么会有这么个说法,是吹牛皮吹大了,还是别的数据库,真的是别的数据库。
提出这个说法的一个依据就是 extension APIS, 学过POSTGRESQL 的一开始都会被他的 extension 弄了乱七八糟,但在进去后,发现extension 真xx的是一个好东西,数据库有了这东西,等同于玩游戏开了外挂,只要你有需求,各种外挂都能挂上。这在别的数据库还真是没有,如果以此来说,倒也有几分道理。或者嗓门在大一点,可以说这彻底改变了玩数据库的方式。
Extension 主要的工作就是将一个外部的软件的功能添加到postgresql,以类似函数的方式,每个extension 绑定了一个相关的object,这是从postgresql 9.1 开始的提供的官方的API去扩展任何数据库模块的标准做法。
这与MYSQL 的plugin 不一样的地方是,postgresql 是动态的加载这些objects 到postgres 的系统空间中。(当然有些需要加载库,注:库不是数据库,而是程序方面的一个概念)
那到底你可以extend点什么到postgres 中
1 type system and operators
2 user defined functions and aggregates
3 storage system and index
4 write ahead logging and relication
5 transaction engine
6 background worker processes
7 background workder processes
8 query planner and query executor
9 configuration and database metadata
看完上面的几个点,你有几个想法,我的第一个想法就是POSTGRESQL 实际上真是一个“开源”数据库。可以看看上边的list 只要你愿意,你有开发的天赋,你完全可以开发一些适合你公司自己的业务需求的数据库功能。即使同为开源的其他数据库,也是不大可能让你这么干的。开源如果仅仅等于省钱,那和安装盗版数据库除了法律上的不同,我想也就那么回事。而POSTGRESQL 的开源,不等同于免费,而是彻底的开放,只要你有能耐。如同去成年人的玩具店,你是愿意买个乐高,还是买个电子玩具车。Postgresql 是乐高毋庸置疑,我想没有几个人会原因抱怨乐高最后拼装的东西差劲,因为那样貌似在说自己的创造力和构造力不行。
举例通过extension postgresql 对非结构化的数据的支持,算是传统数据库里面的优等生,XML ,FULL-TEST SEARCH , JSON, JSONB 等都是没有问题
因为可以更方便的处理非结构数据,POSTGRESQL 和 MONGODB 之间也有些不大好的新闻,例如某国外大媒体,直接用 Postgresql 替换mongodb的“传闻”。
同时,例如HLL的extension 创造了一种新的数据类型hll,即HyperLogLog数据结构。HyperLogLog是一种固定大小、类似于集合的结构,用于具有可调精度的不同值计数。例如,在1280字节中,hll可以估计数百亿个不同值的计数,只有几个百分比的错误,
当然extension 的能量也不仅仅如此,postgresql 为什么也能承担地理方面的专业处理功能,不还是插件 PostGIS. 更关键的是,插件就可以扩展功能的思路,和其他数据库,等待版本更新,或者安装plug-in,或者直接给你一个功能包。这不是功能上的差别,这是整体软件架构思路的不同。(参见25000行某数据库的吐槽)
更有意思的是通过fdw系列的插件,POSTGRESQL 可以从任意的数据库上读取数据,目前读取ORACLE, SQL SERVER , MYSQL, MONGODB 等等都不是问题,当然除此以外还有类似cstore_fdw 它是一个postgres扩展,它可以智能地将数据和查询分布在多个节点上,这样就可以扩展数据库并提高查询速度。
各种插件的功能导致POSTGRESQL 貌似没有不行的,包含 模糊查询走索引的插件,包含查看数据库底层数据库存储的插件,监控语句的执行效率的插件,太多的插件导致没有什么人能全部知晓或掌握。
最后虽对最上边的说法觉得有点“意思”,因为做人还是要谦虚点,但你要说他那么说,也有些道理。