导读:本文带大家一起了解PostgreSQL的起源、特性以及使用案例。
如今随着NoSQL、Aiot等高密集型大数据分析等需求越来越多,之前被认为是学术派的PostgreSQL开始被越来越多的企业与开发者采用。它有着很多商用数据库的特性,却有着开源数据库的性价比,包括强大的性能和良好的用户社区。
下面的文章内容,将涵盖PostgreSQL的发展简史和相关技术特性。我们现在开始。
INGRES-最早的关系数据库系统
Postgres 起源于 20 世纪 80 年代中期加州大学伯克利分校的学术研究,最初由伯克利分校的数据库研究员 Michael Stonebraker 创建。
Michael Stonebraker(图源:mit)
1973年这一年,美国结束了对越南战争的介入,英国摇滚乐队“深紫”发行了《Smoke on the Water》。人们留着法拉·福塞特 (Farrah Fawcett) 的发型,而计算机技术正在改变企业的运营方式。
众多企业正在推动数据库管理系统(DBMS) 的开发,利用它们来维护有关、、客户、供应商、员工、库存、供应品、产品订单和服务请求的有关信息。
此时在加州大学伯克利分校的实验室中,Eugene Wong 和 Michael Stonebraker 开始研究 INGRES(交互式图形检索系统)。
最初,研究人员筹集资金为伯克利小组建立地理数据库系统。受到 Edgar Codd 1970 年关于关系模型的开创性工作以及 IBM 刚刚发布的有关 SystemR 的白皮书的启发,SystemR 是 SQL 的第一个实现以及基于关系数据模型构建的实验数据库系统 ,两位研究人员决定用这笔钱来资助他们的“关系数据库”项目。
为了持续支持 INGRES 项目发展的更好,两人获得了来自国家科学基金会和三个军事机构的资助,分别是美国空军科学研究办公室、陆军研究办公室和海军电子系统司令部。军方对开发此类系统非常有兴趣,加上冷战的融合和管理信息的计算机技术的出现,可能影响系统对访问控制、保护、安全、所有权和数据库的关注“行政人员。”
后来,INGRES 满足了建立在Codd (1970)提出的数据关系模型上之数据库系统的3个基本要求:
1)信息由数据值(而不是用户可见的“连接”)表示
2)使用一种高级声明性语言,用户可以使用它来查询数据而无需指定算法
3)关系模型需要更加用户友好,并且能够应对不可避免的变化。
该模型与之前的导航型数据库模型截然相反。导航数据库模型有很大程度的数据依赖性,只要数据结构发生变化,应用程序代码就需要更改。另一方面,关系数据库系统有维护键、索引和其它用于处理用户查询的“辅助工具”。例如,使用表示“螺栓的最低价格是多少?”的 SELECT 语句,而用户不必包含全部信息。这些“辅助工具”的信息纳入系统和请求中,当系统更改数据表示或访问辅助工具时,现有应用程序代码不用修改并中断 。
导航型数据库与关系型数据库的区别
下面的图 1 和图 2,是对导航数据库和关系数据库进行直观比较。导航数据库程序维护正在处理的任何记录序列中的当前位置,因此“连接”是可见的,而关系数据库将这些连接抽象为3个键的关系。
导航数据库来源(https://people.eecs.berkeley.edu/~brewer/cs262/SystemR.pdf)
关系型数据库来源(https://people.eecs.berkeley.edu/~brewer/cs262/SystemR.pdf)INGRES 本身是用 C 语言开发的,它用 QUEL(查询语言)作为主要查询语言。
INGRES vs Oracle
那么,为什么 INGRES 或 QUEL 的名字不怎么家喻户晓呢?
到了1980 年代初,INGRES 和 Oracle RDBMS 具有同等的功能、性能、市场份额和定价,并驾齐驱,但最终 SQL(相对于 QUEL)被越来越多地采用,并作为首选查询语言,并且 Oracle 凶猛的营销能力赢得了市场份额。
1986年, INGRES 研究项目在 1985 年正式宣布结束。余下成员将项目改名为Postquel。
到了 1994 年Postquel 改名为Postgres95 ,它使用 SQL 语言的支持取代了原有QUEL查询,但它已经失去了市场主导地位 。
后 INGRES:Postgres、PostgreSQL
到 20 世纪 90 年代中期后,专有数据库时代出现,出现了 Oracle (Oracle DB)、IBM DB2 和 Microsoft SQL 等数据库系统。
而接着出现的开源数据库系统包括 MySQL、MariaDB 和 SQLite等。
1996 年,Postgres95 项目更改了名称PostgreSQL ,以反映其与原始 Postgres 项目的关系以及更新的 SQL 查询功能 。PostgreSQL 项目继续发布主要版本,所有版本均在免费开源许可证下提供,与上述开源数据库一样提供给用户与开发者。
性能稳定且功能齐全的RDMS
PostgreSQL没有和众多数据库系统,包括开源和闭源产品特别大的竞争,而是一直在沉淀和增强自己的产品,包括学习其它系统的特性。
经过20余年的积累,它已经具有包括不限于如下的技术特性和产品优势:
1.广泛的数据类型支持
PostgreSQL 支持多种数据类型,包括整数和字符串等基本类型,以及数组、JSON 和空间数据等复杂类型。
开发者能够以各种格式存储和操作数据,并在处理复杂数据集时提供更大的灵活性。例如,JSON 数据类型允许开发者存储和查询半结构化数据,例如文档或消息。
另一方面,空间数据类型使开发者能够存储和查询地理数据,例如点、线和多边形。这意味着开发者可以使用PostgreSQL来存储和操作不同类型和格式的数据,而无需对数据进行转换或规范化,或者针对不同的数据类型使用不同的数据库。
2.对SQL和NoSQL的强大支持
PostgreSQL 为 SQL提供强大的支持。它还支持索引、全文搜索和基于文档的查询等 NoSQL 功能,使其成为需要处理结构化和非结构化数据的开发者的多功能选择。这意味着开发者可以使用 PostgreSQL 构建存储和查询关系数据和非关系数据的应用程序,使用相同的数据库引擎和一组一致的 SQL 和 NoSQL 查询语言。
这可以简化开发过程,减少学习曲线,提高代码的可维护性。
3.通过自定义函数和数据类型进行扩展
PostgreSQL 允许开发者通过自定义函数和数据类型扩展其功能。我们可以创建自定义函数来执行专门的任务,或者定义自己的数据类型来表示复杂的数据结构。
这可以帮助我们优化性能并提高数据库的灵活性。例如,开发者可以使用自定义函数来实现业务逻辑、数据转换或验证规则。我们还可以使用自定义数据类型来表示特定领域的数据,例如金融交易、地理位置或社交图谱。这可以帮助开发者根据应用程序的需求定制数据库,并创建可以简化开发过程的抽象和可重用组件。
4.可扩展性和高性能
PostgreSQL 以其可扩展性和性能而闻名,使其成为大数据集和高并发应用程序的流行选择。它提供了一系列性能调整选项,例如索引和查询优化,以及并行查询执行和数据分区,以帮助开发者提高应用程序的速度和效率。
例如,开发者可以使用索引来加快常见查询的执行速度,或者使用并行查询将工作负载分布到多个CPU核心或机器上。我们还可以使用数据分区将大型数据集分布在多个表或数据库中,以提高数据的可扩展性和可管理性。
这可以帮助开发者构建能够处理大量数据和繁重工作负载的应用程序,而不会影响性能或用户体验。
5.高可用性和灾难恢复
PostgreSQL 提供了一系列功能来帮助开发者确保其应用程序的可用性和可靠性。它支持同步和异步复制,允许开发者创建数据的冗余副本以进行备份和灾难恢复。
这意味着开发者可以使用 PostgreSQL 创建一个供应用程序使用的主数据库,以及一个或多个用作备份的备用数据库。主数据库和备用数据库可以位于同一服务器、不同服务器或不同地区。
同步复制保证数据同时写入主备数据库,提供最高级别的数据一致性和保护。另一方面,异步复制允许主数据库在备用数据库暂时不可用的情况下继续写入数据,以提供最高级别的数据可用性和性能。这可以帮助开发者构建能够承受故障或中断的应用程序,并从灾难或中断中快速恢复。
PG 还提供自动故障转移和恢复功能,帮助开发者确保其应用程序在发生故障或中断时仍具备可用性。这意味着数据库引擎可以检测到主数据库何时不可用时,可以自动切换到备用数据库之一,而无需人工干预。
这有助于避免停机、数据丢失或用户不便,并保持应用程序运行并可供用户访问。数据库引擎还可以监控备用数据库的可用性和运行状况,并可以根据配置的优先级和策略自动切换到最佳备用数据库。这有助于确保应用程序始终使用最佳和最新的数据,并避免使用陈旧或损坏的数据。
PG提供时间点恢复功能,可帮助开发者在发生数据损坏或人为错误时将数据恢复到特定时间点。这意味着开发者可以定期创建数据快照或备份,并在必要时使用它们将数据恢复到特定时间点。
这有助于避免数据丢失、数据损坏或数据不一致,并确保数据始终准确和一致。可以在线执行时间点恢复,而不会中断正在进行的操作或用户对数据的访问。这可以帮助开发者从灾难或中断中快速恢复,并保持数据的可用性与完整性。
6.安全性和合规性
PostgreSQL 提供了一系列安全功能来帮助开发者保护他们的数据和应用程序免遭未经授权的访问或篡改。它支持身份验证和授权两种授权,可以控制谁可以访问数据库以及他们可以执行哪些操作。它还提供静态和传输中的加密,以保护数据不被拦截或窃取。它还提供日志记录和审计功能,帮助开发者监控和跟踪用户和应用程序的活动。这意味着开发者可以使用 PostgreSQL 来满足其应用程序和行业的安全性等合规性要求。例如,在医疗保健或金融行业工作的开发者可以使用 PostgreSQL 来遵守 HIPAA 或 PCI-DSS 等法规。
7.灵活的部署选项
PostgreSQL 可以部署在多种平台,包括 Linux、Windows 和 macOS。它可以在本地、私有云或公共云中运行。这种灵活性允许开发者选择最适合其需求和限制的部署选项。例如,想要在本地部署应用程序的开发者可以在本地服务器或服务器集群上安装 PostgreSQL。想要在云中部署应用程序的开发者可以使用托管 PostgreSQL 服务,例如 Amazon RDS、Azure Database for PostgreSQL 或 Google Cloud SQL for PostgreSQL等。
8.强大的社区支持
PostgreSQL 是一个开源项目,有一个强大而活跃的贡献者社区。开发者可以从社区的集体知识和经验以及构建在数据库之上的各种第三方工具和库中受益。例如,开发者可以使用流行的 PostgreSQL 库(例如用于 Python 的 Psycopg2、用于 Java 的 JDBC 或用于 .NET 的 Npgsql)将其应用程序连接到数据库并使用高级编程语言与其进行交互。还可以使用流行的 PostgreSQL 工具(例如 pgAdmin 或 PgBench)来管理、监控或基准测试其数据库。这可以帮助开发者利用社区的资源和专业知识,构建高效、可靠和可维护的应用程序。
9.全面的文档
PostgreSQL 拥有大量的开发文档,包括详细的手册和用户指南。开发者可以轻松了解数据库的特性和功能,并找到常见问题的答案。该文档可在线获取,并分为涵盖不同主题的部分,例如管理、编程、安全性、性能和迁移。开发者可以使用该文档来了解如何安装、配置和使用 PostgreSQL,以及查找常见问题和问题的解决方案。这可以帮助开发者快速上手,并解决开发过程中可能遇到的问题和挑战。
10.企业级功能
PostgreSQL提供了一系列企业级功能,例如多版本并发控制、在线备份和恢复以及时间点恢复。这使其成为需要高可用性、可扩展性、安全性和可靠性的关键任务应用程序的合适选择。
例如,开发者可以使用多版本并发控制来提供并发事务的隔离性和一致性,而无需牺牲性能。他们还可以使用在线备份和恢复来创建数据库的热备份,而无需中断正在进行的操作。他们还可以使用时间点恢复将数据库恢复到特定时间点,以防数据损坏或人为错误。
以上种种特性,可以帮助开发者构建能够处理用户和业务需求的应用程序,并确保数据的可用性和完整性。
PostgreSQL与它的新机遇
如今,开发者越来越多使用 PostgreSQL 来处理可扩展的工作负载。
Amazon RDS 首席产品经理兼技术主管兼 Amazon Web Services Postgres 项目核心团队成员 Katz 表示,如今PostgreSQL的用途已广泛应用于多个行业的应用程序和工作负载。
在刚刚的欧洲开源峰会上,Katz 谈到 PostgreSQL 时表示:“在它刚出现的时候,它还相当小众。你知道,还有其它关系数据库系统,既有开源的,也有商业的。”
Katz 一生中一半以上的时间都在研究 Postgres。他的第一次参与是编写 SQL 并参加用户组和活动,他负责网站发布管理并帮助组织活动。
“当我第一次参与这个项目时,我是一名应用程序开发人员,我只是编写 SQL,”Katz 说。“我想,‘哦,这太酷了,人们参与 Postgres,因为他们编写 SQL。’”嗯,人们参与 Postgres,因为他们喜欢数据库内部结构。
有很多才华横溢的开发者致力在Postgres上。我觉得最有帮助的是我从事非开发工作。我有组织活动的经验,我曾经在大学里组织过创业活动,我试图将这一点带入开源社区。我帮助组织了纽约市当地的用户小组,最终我们开始围绕该小组组织年度活动。这就是我进入社区的起点。因为你知道,虽然 Postgres 社区的许多成员都在邮件列表上运作,但在活动中进行了大量的头脑风暴和建立联系,这是无可替代的。”
Katz 还举了一个例子,他的一位客户在 Postgres 数据库中竟存储了超过 40 TB 的 JSON 文档。
值得一提的是,最近推出的PostgreSQL 16包括来自备用服务器的逻辑复制,这项技术将有助于提高可扩展性。
Katz 说:“如果你能够将该工作转移到通常不太繁忙的备用服务器上,那么就可以将一些流量从主服务器上移开,并且将能够进一步的负载扩展你的主服务器。”
这证明,Postgres 社区的细致和设计所花费的时间是非常值得的,它带来了更稳定和可靠的功能。
“如果你看看为 Postgres 做出贡献的所有不同组织和个人,你就会知道,虽然这可能不是他们的擅长之处,但他们积极参与设计和审查,并努力将其投入到项目中去。”
Katz 表示,直接 I/O (Direct I/O)是Postgres长期开发的一项功能,开发了数年时间。这也是一个复杂的问题。PostgreSQL 使用 Linux 使用异步方式将数据写入磁盘。根据 Open Groups 的说法,fysnc响应请求将fildes命名的打开文件描述符的所有数据 传输到与 fildes描述的文件关联的存储设备。传输的性质是由实现时定义的,在系统完成该操作或检测到错误之前,fsync() 函数不会立即返回调用处。
当性能权衡成为问题时,比如使用 fsync 层时,PostgreSQL 和文件系统之间有一个额外的转换层需要工作。而使用直接 IO 可能意味着更少的跳转数、减少延迟,它有着一个改进的磁盘写入技术。
AWS 在 PostgreSQL 基础上构建了Amazon RDS,使开发者能够更轻松地开发应用程序,而不用再执行部署、备份和监控等操作任务。Amazon RDS 支持多个 PostgreSQL 版本,如 13、14、15 和 16。
“托管服务中有许多不同的功能可以帮助支持常见的业务运营,一些关于很高的可用性、持续的自动备份、监控以及使日常管理会变得更简单。凭借我的应用程序开发的深厚背景,大量的运营工作由RDS托管服务处理即可。”
结语
PostgreSQL 是一个强大且多功能的数据库管理系统,不管是单机部署还是云端托管,都为开发者提供了广泛的高级功能。
在这篇文章中,我们探讨了每个开发者都应该了解的 PostgreSQL 的起源和总结的全面特性(包括最新推出),开发者可以用它构建可扩展、高性能且安全的应用程序,以满足用户和业务的需求。PostgreSQL 是一个知名的开源数据库项目,拥有强大的贡献者社区和广泛的文档,是每位想要构建现代级可靠应用程序之开发者的上佳选择。
作者:洛逸
参考:
https://medium.com/launch-school/a-brief-history-of-postgresql-36d8d392c611
https://www.postgresql-blog.com/the-top-10-features-of-postgresql-every-developer-should-know/
本文为 @ 场长 创作并授权21CTO发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。