从一个数据分析师的视角来对比两个关系型数据库。 0.本文是关于什么的?我在一个全球专业服务公司做数据分析师(你肯定听说过的)。我干了大概有10年。10中我处理数据、数据库软件、数据库硬件、数据库用户、数据库程序员以及数据分析方法,所以我对这些东西了解的比较多。我经常遇到对相关内容了解很少的人,虽然他们中的一部分并没有意识到这件事。 这些年里,我已经太多太多次的讨论了 PostgreSQL 和 MS SQL 的问题。IT 行业中一个知名的原则说:如果你准备不只一次的做同一件事,那就让它自动化。本文是我的自动化方法的谈话。 除非另有说明,我指的是PostgreSQL 9.3和MS SQL Server 2014,即使我的经验是在MS SQL Server 2008 R2和2012版。为了公平起见,我将比较最新版的MS SQL Server和PostgreSQL。由于微软的糟糕的文档,我不得不大量的依赖于Google、Stack Overflow以及网络上的用户。因为我对两个数据库的经验不相等,所以我知道像这样的比较不够科学严谨。不过这不是一个学者的练习题,这是现实中的比 较。我尽可能让我对于MS SQL Server的了解正确,因为我们都知道要糊弄整个互联网是不可能的。如果我发现我弄错了什么事情,我会修正的。 我将以一个数据分析师的角度来比较两个数据库。MS SQL Server可能会因为QLTP后台而踢PostgreSQL的屁股(虽然我比较怀疑),不过那些不是我这里要关注的,因为我不是一个OLTP开发者/DBA/系统管理员。 最后,右上角有一个email地址。如果你愿意的话你会用到的,我会尽可能回复的。 免责声明:本文所有观点仅代表我个人。 1. 为什么说 PostgreSQL 比 MS SQL Server 强的多
额,剧透了。本节从数据分析的角度对比这两种数据库。 1.1. 支持 CSV CSV 其实是转移结构化数据(如: 表)的一种标准方式。不论是哪一种数据库,都能用自己专有的格式,把数据导出来。以这种格式存储的数据,其他软件无法读取. 用来做备份或者复制数据还行。如果想从 X 系统, 把数据移植到 Y 系统,那问题就大了。 一个数据分析平台, 既要能读取不同系统的数据, 也要能生成其他系统能读取的分析结果. 也就是说, 要能快速, 稳定, 可重复的, 而且毫无痛苦的读写 CSV. 我再说一次:一个不能很好的处理 CSV 的数据分析平台,就是没用的累赘。 PostgresSQL对CSV的支持在业内是顶尖的。 COPY TO和 COPY FROM命令支持RFC4180(最接近官方标准的文档)中列出的所有规格,也支持很多常见的和不常见的变种和方言。 这些命令运行速度很快而且很强大。 发生一个错误时,它们会给出有帮助性的错误信息。 更重要的是,它们不会默默地损坏、误解、修改数据。 而MS SQL Server既不支持导入也不支持导出CSV文件。 很多人不相信当我告诉他们这一点时。 然后,某一次,他们自己验证了这一点。通常他们的观察是这样的:
如果你不相信,下载这个格式正确的、符合标准的UTF-8编码的CSV文件,用MS SQL Server计算文件中最后一列(共有50列)字符串的平均长度(或者是字符的数量,等等)。继续,试一下。 (你得到的答案将是 183.895。) 当然,事实上,对 PostgreSQL 来说,确定这么做非常简单。最耗费时间的地方是创建保存这些数据的且具有50个字段的数据表。微软本身似乎就很难理解CSV文件;而且打开这样的文件还会引起Access和Excel中断。 痛苦但却是事实的情况是:我了解到近期一些数据库编程人员花费大量的时间和精力编写Python代码,以实现对CSV文件的“清理”,从而让MS SQL服务器可以把这些文件的内容导入到数据库里。但是,这种处理方法不可避免的要更改实际的数据。这就像花费大量金钱购买了Photoshop,然后不 得不编写一些定制的代码来让Photoshop打开JPEG,到头来仅仅发现只是稍稍修改了图片那样让人抓狂。 1.2.人机工程值得一提的是每个数据分析平台都是图灵完备的,这大概意味着任何一个数据分析平台可以做其他数据分析平台做的任何事情。也就不存在“你可以在A软件中做X 这件事而不可以在B软件中做X这件事”。即你可以在任何软件里做任何事情-所不同是难易程度。好的工具让你要做的事情做起来非常简单;差的工具就会让你要 做的事情做起来很难。说到底就是这么回事。 (理论上来讲这一切都是正确的,然而现实中却不是这样的-例如,我了解到没有关系型数据库管理系统(RDBMS)使用3D图形。不过,任意一个关系型数据库管理系统都可以模拟GPU执行任何图形计算。)
诸如此类例子还有很多. 这些问题, 分来开看, 好像没什么. 可是放到一起, 问题就大了. 想要在 MS SQL Server 上面做好一件事, 要比在 PostgreSQL 做的难度大的多. 数据分析师把许多宝贵的时间和精力都花在, 解决各种问题, 手工处理的过程中, 而不是解决真正需要解决的问题. 更正: 有人跟我说, MS SQL Server 有个优势, 是 PostgreSQL 不具备的. 那就是在 SQL 脚本中声明变量. 如:
PostgreSQL 确实不能声明变量. 真心希望它能加上这个实用的功能. |