PostgreSQL是什么?StackOverflow上开发者最爱和最想要的关系型数据库

PostgreSQL是什么?StackOverflow上开发者最爱和最想要的关系型数据库

大家好,又见面了,我是全栈君。

经常会有人问我PostgreSQL是什么?

这个问题不太好回答,因为PostgreSQL除了可以让你做到几乎所有其他主流关系型数据库能做的事情外,还可以做到很多别的数据库做不到的事情。

如果非要一个简单直接、便于理解的定义,那么你可以理解为一个开源可自由扩充的Oracle

尽管这并不是非常准确。因为PostgreSQL对程序员要更友好一些,下图是来自StackOverflow 2017年的一些统计,参考Developer Survey Results 2017

  • 最想要的数据库

最想要的数据库.png

  • 最爱的数据库

最爱的数据库.png

如果只是说关系型数据库,那么“StackOverflow年度统计中开发者最爱和最想要的关系型数据库”这个结论不难得出。

而对比其中的最热门:

流行度.png

你会发现一个有意思的现象:对你最好的未必是那个大家都知道的

PostgreSQL好在哪里?

在回答了前面的回答之后,这是更多的人会想问的第二个问题。

而对于这颗沧海遗珠,用一句话其实难以尽述。如果非要总结,可以认为有以下几点:

  • 稳定

    PostgreSQL的代码质量是被很多人认可的,经常会有人笑称PG的开发者都是处女座。基本上,PG的一个大版本发布,经过三两个小版本就可以上生产,这是值得为人称道的一个地方。从PostgreSQL漂亮的commit log就可见一斑,[PostgreSQL的COMMIT LOG](https://git.postgresql.org/gitweb/?p=postgresql.git;a=log;h=6912acc04f0bbcfdb799a120618507601e862490)
    
    而得益于PostgreSQL的多进程架构,一个连接的异常并不影响主进程和其他连接,从而带来不错的稳定性。
    
  • 性能

我们内部有些性能上的数据,TPCC的性能测试显示PostgreSQL的性能与商业数据库基本在同一个层面上。

  • 丰富

    PostgreSQL的丰富性是最值得诉说的地方。因为太丰富了,以至于不知道该如何突出重点。最全面的例子,可以找 自带博客外挂光环的 @德哥 。这里只列举几个我认为比较有意思的几点(查询、类型、功能):

    • 查询的丰富

      且不说HASH\Merge\NestLoop JOIN,还有递归、树形(connect by)、窗口、rollup\cube\grouping sets、物化视图、SQL标准等,还有各种全文检索、规则表达式、模糊查询、相似度等。在这些之外,最重要的是PostgreSQL强大的基于成本的优化器,结合并行执行(并行扫瞄、并行JOIN等)和多种成本因子,带来各种各样丰富灵活高效的查询支持。
      
    • 类型的丰富

      如高精度numeric, 浮点, 自增序列,货币,字节流,时间,日期,时间戳,布尔, 枚举,平面几何,立体几何,多维几何,地球,PostGIS,网络,比特流,全 文检索,UUID,XML,JSON,数组,复合类型,域类型,范围,树类型,化 学类型,基因序列,FDW, 大对象, 图像等。
      
      [PS: 这里的数组,可以让用户像操作JAVA中的数组一样操作数据库中的数据,如 item[0][1]即表示二维数组中的一个元素,而item可以作为表的一个字段。]
      
       或者,如果以上不够满足,你可以自定义自己的类型(create type),并且可以针对这些类型进行**运算符重载**,比如实现IP类型的加减乘除(其操作定义依赖于具体实现,意思是:你想让IP的加法是什么样子就是什么样子)。
       
      另外还有各种索引的类型,如btree, hash, gist, sp-gist, gin, brin , bloom , rum 索引等。你甚至可以为自己定义的类型定制特定的索引和索引扫瞄。
      
    • 功能的丰富

      PostgreSQL有一个无与伦比的特性——插件。其利用内核代码中的Hook,可以让你在不修改数据库内核代码的情况下,自主添加任意功能,如PostGIS、JSON、基因等,都是在插件中做了很多的自定义而又不影响任何内核代码从而满足丰富多样的需求。**而PostgreSQL的插件,不计其数**。
      
      FDW机制更让你可以在同一个PostgreSQL中像操作本地表一样访问其他数据源,如Hadoop、MySQL、Oracle、Mongo等,且不会占用PG的过多资源。**比如我们团队开发的OSS\_FDW就用于实现对OSS的读写**。
      

    至于其他的,举个简单的例子,PostgreSQL的DDL(如加减字段)是可以在事务中完成的 [PS: PostgreSQL是Catalog-Driven的,DDL的修改基本可以理解为一条记录的修改]。这一点,相信做业务的同学会有体会。

谈到与商业数据库的对比,这里有一张比较有意思的图,权作消遣:

数据库历史.gif

可以看得出来,PostgreSQL与很多商业数据库还是有一定历史渊源上的,大多是基于System R。

如果觉得不过瘾,再来点干的,看看PostgreSQL与这些数据库大厂这些年的恩爱情仇(图比较大,PG在左边最上面那条线,然后连着中间最上面第二条线)

RDBMS_Genealogy_V5.jpg

如何开始

业务从一个数据库迁移到另外一个数据库,不是一件容易的事。那么,你是否要考虑一下,在新的业务上尝试不同的可能?

关于选型,这篇数据库选型十八摸 之 PostgreSQL – 致 架构师、开发者可能会帮到你。

另外,这里有PG大神@德哥准备的系列的培训资料,和PG入门文档

而更多的资料,在云栖上搜索”postgresql”即可,这里是传送门:更多文章资料

Have fun!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108590.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MiFlash提示“错误代码”为“0xffffffff”[通俗易懂]

    MiFlash提示“错误代码”为“0xffffffff”[通俗易懂]当MiFlash提示“未指定的错误”时,我们可以根据其后的错误代码来寻求问题的解决方法。当MiFlash提示“错误代码”为“0xffffff01”时,表明“MiFlash找不到指定的文件”。对此我们可以通过以下方法来解决:右击“计算机”图标,从弹出的右键菜单中选择“属性”项。从打开的“系统属性”窗口中,点击左上角的“高级系统设置”按钮进入详细设置界面。待打开“系统属性”窗口后,切换到“高级”选项卡,点击“环境变量”按钮打开其设置对话框。从打开的“环境变量”窗口中,从“系统变量”列表中找到“Path

    2022年5月16日
    100
  • android 启动界面修改工具下载,安卓开机画面更改软件

    android 启动界面修改工具下载,安卓开机画面更改软件安卓开机画面修改是第一屏那个LOGO。。。不是动画,不是第二屏…跟品牌没有关系,是安卓系统的关系!!!开机第一屏不是平时常见的图片格式,这个需要你下载个专门修改开机第一屏的软件来修改,具体每个手机不同版本之间的案桌系统的开机第一屏目录也不一样,这个需要刷机一样刷进去,不能手机里自己改,你到机锋网论坛搜索一下吧,里面有,我这里不方便给你具体地址,怕又被百度给审核了记得千万要对应你的手机型号的…

    2022年5月15日
    61
  • linux重启nginx服务_centos7重启服务器命令

    linux重启nginx服务_centos7重启服务器命令连接服务器输入以下命令,如果要重启其他服务把nginx替换即可。servicenginxrestart出现以下页面即为成功

    2022年8月13日
    5
  • mysql的TIMESTAMPDIFF的简单使用「建议收藏」

    mysql的TIMESTAMPDIFF的简单使用「建议收藏」一、首先看TIMESTAMPDIFF在项目中的一个具体使用场景mybatis查询:二、mysql的时间差函数TIMESTAMPDIFF、DATEDIFF的具体用法TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)说明:返回日期或日期时间表达式datetime_expr1和datetime_expr2the之间的整数差…

    2022年5月5日
    297
  • 《JavaScript 模式》读书笔记(4)— 函数1[通俗易懂]

    从这篇开始,我们会用很长的章节来讨论函数,这个JavaScript中最重要,也是最基本的技能。本章中,我们会区分函数表达式与函数声明,并且还会学习到局部作用域和变量声明提升的工作原理。以及大量对API

    2022年3月25日
    43
  • 字节、字、bit、byte的关系

    字节、字、bit、byte的关系字word字节byte位bit,来自英文bit,音译为“比特”,表示二进制位。字长是指字的长度1字=2字节(1word=2byte)1字节=8位(1byte=8bit)一个字的字长为16一个字节的字长是8bps是bitspersecond的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56Kbps、100.0Mbps等等。B…

    2022年5月26日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号