为了账号安全,请及时绑定邮箱和手机立即绑定

用 PostgreSQL 简化技术栈

摘要

在追求创新的路上,我们引入了复杂的技术栈,但实现彻底的简洁仍然是有可能的。

一种有效的策略是使用PostgreSQL来简化你的技术堆栈,加快开发速度,降低风险,并提供更多功能。PostgreSQL能替代多种技术,如Kafka、RabbitMQ、MongoDB和Redis,支持数百万用户。

这种方法简化了开发过程,使应用程序更易于扩展和运维。更少的组件意味着开发人员可以专注于为客户提供更多价值,有可能在不增加成本的情况下提高50%的功能输出。这也降低了开发人员的认知负担,帮助他们更好地理解系统并避免感到不自量力。

基于Postgres而非Redis来做缓存
Postgres 中的 UNLOGGED 表和 JSON 数据类型

在 PostgreSQL 中使用缓存涉及创建未提交的表,并以 JSON 格式存储数据。具体来说:

未记录表

  • 性能:未记录表(UNLOGGED)的设计目的是为了提高性能。它们不会将数据写入预写日志文件(WAL),这使得它们比普通表更快,但耐用性较差。这对于缓存数据非常理想,因为这些数据可以重新生成。
  • 耐用性:由于这些表跳过了WAL,它们提供的耐用性较低。如果服务器崩溃,这些表中的数据将丢失。对于这种临时性的缓存数据来说,这种权衡是可以接受的。

JSON 数据类型

  • 灵活性: 将数据存储为JSON允许灵活的数据结构设计。这对于缓存不同数据结构而不更改表结构很有帮助。
  • 例如,查询性能: PostgreSQL的JSONB类型针对读写操作进行了优化处理,可以高效地查询和索引JSON数据。

存储过程

  • 自动化和维护:存储过程可以自动化管理缓存的数据。可以编写存储过程来处理数据过期,确保缓存保持时效性。
  • 集成:使用存储过程可以将缓存逻辑直接集成到数据库层,集中和简化应用架构。

过期数据

  • TTL 实现:就像 Redis 一样,你可以通过存储过程在 PostgreSQL 中实现 TTL 机制,自动清理过时的缓存。
  • 自定义过期规则:PostgreSQL 支持根据应用需求自定义复杂的过期规则,提供灵活性。
Redis 对比

这里是一份PostgreSQL和Redis用于缓存的比较:

    +------------------+---------------------------------------------+-------------------------------------------+
    |     特性      |     PostgreSQL (未提交表及 JSON)     |                   Redis                   |
    +------------------+---------------------------------------------+-------------------------------------------+
    | 速度          | 快(由于未提交表)                 | 非常快(内存存储)                         |
    | 持久性        | 低(崩溃时数据丢失)               | 低(除非使用 AOF/RDB,否则崩溃时会丢失数据)  |
    | 灵活性        | 高(支持 JSON 数据)               | 高(支持多种数据类型)                  |
    | 复杂查询      | 支持复杂查询(SQL)               | 支持部分复杂查询                      |
    | 设置复杂性    | 较高(需要 SQL 和存储过程)       | 较低(简单配置)                      |
    | 内存使用      | 较低(基于磁盘的存储)             | 较高(内存存储)                        |
    | 可扩展性      | 良好(能够随硬件扩展)             | 卓越(设计用于分布式缓存)            |
    | 数据过期      | 通过存储过程实现自定义逻辑         | 内置 TTL 支持                          |
    +------------------+---------------------------------------------+-------------------------------------------+
这对我有什么好处?

使用 PostgreSQL 的 UNLOGGED 表和 JSON 数据类型进行缓存可以简化您的系统架构,通过单一数据库系统来同时处理持久化和缓存数据。这种方法提供了良好的性能和灵活性,特别适合已经在使用 PostgreSQL 的应用程序。然而,对于超高速的内存缓存以及内置的 TTL(时间戳过期)等特性,Redis 仍然是更优的选择。决策应根据您的应用程序的具体需求,例如性能需求、基础设施复杂性和可扩展性等因素。

使用 Postgres 作为消息队列,并利用 SKIP LOCKED

在 PostgreSQL 中,可以使用跳过已锁定的行功能。

PostgreSQL的SKIP LOCKED功能可以用来实现消息队列或任务队列。它是如何工作的,以及为什么它有效:

忽略锁定

  • 功能描述:SKIP LOCKED 子句允许查询跳过当前被其他事务锁定的行。这在作业队列中特别有用,在这种情况下,多个工作者可以并行处理作业而不会互相干扰,从而避免争用并确保任务分配的有效性。
  • 并发处理:多个工作者可以查询同一张表上获取新任务,并安全地跳过正在被其他工作者处理的任务,从而避免争用并确保任务分配的有效性。

实现:

  • 消息队列:在此设置中,消息和任务项被插入到一个 PostgreSQL 表中。工作者从中选择并处理任务项,在任务项完成后将其标记为已完成状态。SKIP LOCKED 子句确保每个任务项只被处理一次。
  • Go 语言中的这个 River 库任务队列实现:Go 语言中的这个 River 库可以用于管理 PostgreSQL 的任务队列。它利用 SKIP LOCKED 来高效地获取和处理任务。

优点

  • 简洁性:使用PostgreSQL进行消息队列处理减少了对额外基础设施的需求,简化了部署和维护。
  • 原子性和一致性:PostgreSQL提供了强大的ACID保证,确保了可靠的任务执行。
  • 灵活性:您可以利用SQL进行复杂的查询和任务管理,从而实现更复杂的处理逻辑。

Kafka和RabbitMQ的比较

这里比较一下PostgreSQL的SKIP LOCKED选项与Kafka和RabbitMQ的使用。

    +------------------+----------------------------------------+--------------------------------------------------+----------------------------------------------------+
    |     功能        |        PostgreSQL (SKIP LOCKED)        |                      Kafka                       |                      RabbitMQ                      |
    +------------------+----------------------------------------+--------------------------------------------------+----------------------------------------------------+
    | 持久性          | 高(符合ACID规范)                    | 高(持久化日志)                                 | 高(持久化队列)                                   |
    | 扩展能力        | 中等(随硬件扩展)                    | 优秀(设计用于高吞吐量)                          | 良好(支持集群)                                   |
    | 复杂性          | 较低(单一系统,包含数据库和队列)    | 较高(需要单独设置)                              | 较高(需要单独设置)                                |
    | 延迟            | 中等(磁盘操作)                      | 低(优化用于高吞吐量)                            | 低(优化用于低延迟)                                |
    | 吞吐量          | 中等                                 | 高                                              | 较高                                              |
    | 管理            | 更简单(单一数据库)                  | 复杂(需要管理代理、主题)                       | 复杂(需要管理交换、队列)                         |
    | 消息排序        | 支持通过SQL查询进行排序              | 按分区排序支持                                    | 支持FIFO队列                                      |
    | 使用场景        | 简单队列、作业调度                    | 事件流处理及大规模消息处理                      | 可靠消息传递和复杂路由                              |
    +------------------+----------------------------------------+--------------------------------------------------+----------------------------------------------------+
我从中能获得什么好处?

使用 PostgreSQL 作为消息队列,带有 SKIP LOCKED 选项,对于那些需要简单且可靠的任务处理且不需要额外管理消息代理的应用程序来说是一个可行的选择。然而,对于需要高吞吐量、低延迟和复杂路由的应用程序,专业的系统如 Kafka 和 RabbitMQ 可能更加适合。选择取决于具体的应用程序需求,包括性能、扩展性和基础设施的复杂性。

使用 Postgres 作为数据仓库,搭配 Timescale
在 Postgres 中使用 TimescaleDB

TimescaleDB 是一个专门用于处理时间序列数据的 PostgreSQL 扩展,在数据仓库中非常有用。下面详细解释一下:

时间序列数据分析

  • 分区:TimescaleDB 自动按照时间区间将数据分割成块,从而提高了查询性能并简化了数据管理。
  • 压缩:内置的压缩功能节省了存储空间并提升了 I/O 效率。

可扩展性

  • 超表 : TimescaleDB 引入了所谓的超表,这种表看起来像单个表,但在内部进行了分区,从而实现更好的性能和可扩展性。
  • 集群支持 : 多节点支持允许你水平扩展,数据和查询可以在多个节点上分布。

与PostgreSQL集成:

  • SQL 兼容性:TimescaleDB 保持了完整的 SQL 支持,支持使用标准的 PostgreSQL 工具和扩展。
  • 生态系统:与 PostgreSQL 生态系统无缝集成,提供全面的数据仓库解决方案。

关于与其他分析型OLAP数据库的比较

这里是对Postgres与TimescaleDB以及ClickHouse和Greenplum的比较(Postgres、TimescaleDB、ClickHouse和Greenplum)。

    +-----------------------+------------------------------------------+-------------------------------------------+-------------------------------------------+
    |        特性        |        Postgres with TimescaleDB         |                ClickHouse                 |                 Greenplum                 |
    +-----------------------+------------------------------------------+-------------------------------------------+-------------------------------------------+
    | 时间序列数据处理      | 优秀(针对时间序列优化)                 | 有限                                   | 良好                                      |
    | SQL 支持             | 全面 SQL 支持                           | 类 SQL,但功能有限                       | 全面 SQL 支持                            |
    | 扩展性               | 良好(支持多节点)                      | 优秀(大规模并行处理)                   | 优秀(MPP 架构)                         |
    | 数据压缩             | 内置压缩                                | 内置压缩                                | 内置压缩                                 |
    | 查询性能             | 高(针对时间序列查询优化)              | 高(列式存储,MPP)                      | 高(MPP,针对分析优化)                  |
    | 数据分区             | 自动按时间分区                          | 手动分区                                | 自动分区                                 |
    | 易用性               | 易于使用,得益于 PostgreSQL 生态系统      | 中等(需要学习新语法)                  | 中等(需要一定的设置和维护工作)        |
    | 社区和支持           | 强大(PostgreSQL 社区)                | 正在发展(活跃社区)                    | 强大(企业支持)                         |
    | 集成性               | 无缝集成 PostgreSQL 工具               | 可以与多种工具集成                      | 可以与多种工具集成                      |
    +-----------------------+------------------------------------------+-------------------------------------------+-------------------------------------------+
这对我能有什么好处?

使用 PostgreSQL 结合 pg_analytics 和 Apache Datafusion 可提供强大的组合,用于内存 OLAP 处理,充分利用 PostgreSQL 的全部功能,同时提供高性能的分布式查询执行。这种配置非常适合需要强大分析能力但又不需要单独 OLAP 数据库系统的应用程序。然而,对于极高性能需求或特殊应用场景,ClickHouse 和 Greenplum 可能是更好的选择。选择应根据您的性能需求、可扩展性以及与现有系统的集成要求来决定。

如何在 Postgres 中用 JSONB 存储 JSON 数据

关于在PostgreSQL中使用JSONB功能

JSONB 数据

  • 灵活性特点:JSONB(二进制JSON)这种格式存储JSON数据,并支持高效的索引和查询操作。
  • 性能优势:它提供快速的读写性能,以及强大的索引功能。

索引与查询

  • 索引 : PostgreSQL 支持多种索引类型,如 GIN 及 B 树,用于 JSONB 数据,从而提高搜索性能。
  • 查询 : PostgreSQL 可以使用 SQL 对 JSONB 数据进行复杂的查询,提供有效搜索及操作 JSON 文档的能力。

集成

  • SQL 兼容性 :JSONB 与 PostgreSQL 的 SQL 环境完美结合,利用现有的工具和插件。
  • 事务支持 :确保操作 JSONB 数据满足 ACID 要求。
MongoDB对比

这里有一份使用PostgreSQL的JSONB和MongoDB存储和管理JSON文档的详细比较:

    +-----------------------+----------------------------------+--------------------------------------------------+
    |        特性          |        PostgreSQL (JSONB)        |                     MongoDB                      |
    +-----------------------+----------------------------------+--------------------------------------------------+
    | 数据格式             | 二进制 JSON (JSONB)              | BSON(二进制 JSON)                               |
    | SQL 支持情况         | 完整的 SQL 支持                  | 无 SQL 支持(使用 MongoDB 查询语言)             |
    | 索引                 | 支持 GIN 索引、B-树索引及其他    | 支持多种索引类型                                 |
    | 查询速度             | 高(通过索引优化)               | 高(针对文档查询优化)                            |
    | 架构灵活性           | 高(无模式、灵活)               | 高(无模式、灵活)                                |
    | 事务                 | 符合 ACID 事务                   | 多文档 ACID 事务支持                              |
    | 可扩展性             | 良好(随着硬件扩展)              | 优秀(为水平扩展而建)                            |
    | 复制                 | 支持(内置工具)                 | 支持(内置工具)                                  |
    | 社区及支持情况       | 强大(PostgreSQL 社区)         | 强大(活跃社区和企业支持)                        |
    | 数据聚合能力         | 强大的基于 SQL 的聚合功能         | 强大的聚合框架                                   |
    +-----------------------+----------------------------------+--------------------------------------------------+
这对我有什么好处?

使用 PostgreSQL 和 JSONB 存储、搜索和索引 JSON 文档为需要灵活模式设计和强 ACID 一致性的应用程序提供了稳健的解决方案。结合了 PostgreSQL 强大的 SQL 能力和高效的 JSONB 索引与查询功能,使其成为一个多功能的工具。然而,MongoDB 提供了专门的文档导向功能和更好的横向扩展性,因此更适合需要大规模分布式数据处理的应用程序。选择 PostgreSQL 和 JSONB 或 MongoDB 应基于具体的需求,包括查询复杂度、可扩展性和事务的一致性。

使用 pg_cron 让 Postgres 担任定时任务的角色
在 PostgreSQL 中使用 pg_cron 任务调度

pg_cron(一个PostgreSQL定时任务工具):

  • 调度任务:pg_cron 是 PostgreSQL 的一个扩展,允许安排 SQL 查询在特定时间执行,类似于 Linux 中的 cron 任务。
  • 集成:任务可以直接在 PostgreSQL 环境中定义和执行,通过 SQL 执行各种操作,例如数据更新、维护任务,或触发发送电子邮件等外部操作。

消息队列整合

  • 添加事件到队列:pg_cron 可用于安排将条目添加到消息队列。这可以与 PostgreSQL 的 LISTEN/NOTIFY 通知系统结合使用,以触发实时动作。

zh:优点

  • 简洁性:在数据库中集中任务调度,减少对外部定时任务的依赖。
  • 事务一致性:确保任务遵循ACID原则执行,保持数据的一致性。
与其它批处理系统对比

下面是一个使用PostgreSQL和pg_cron与Spring Batch和Linux cron做比较的例子:

    +-----------------------+------------------------------------------------+------------------------------------------+----------------------------------------+
    |        特性          |            PostgreSQL with pg_cron             |               Spring Batch               |               Linux cron               |
    +-----------------------+------------------------------------------------+------------------------------------------+----------------------------------------+
    | 调度                 | 基于 SQL 的调度集成                           | 批处理框架                             | 基于时间的任务调度                     |
    | 易用性               | 易于使用(SQL 基础,简单设置)                | 中等(需要 Java 环境设置)             | 易于使用(语法简单,广为人知)       |
    | 扩展性               | 良好(随着 PostgreSQL 的扩展而扩展)          | 优秀(与 Java 应用扩展)                | 中等(受限于系统资源)               |
    | 事务支持             | 完全符合 ACID 规范                           | 支持事务                               | 不支持事务                           |
    | 复杂性               | 低(简单的 SQL 查询)                        | 高(需要编码和配置)                   | 低(简单的脚本运行)                 |
    | 依赖管理             | 集成在数据库内                              | Java 管理外部依赖项                    | 没有依赖管理                         |
    | 错误处理             | 强大(数据库级别处理)                       | 强大(框架级别的错误处理)              | 基本(日志,退出码)                |
    | 工作类型             | SQL 查询,数据库任务,外部触发器              | 复杂的批处理任务,ETL 作业             | 脚本执行,命令行任务                 |
    | 通知                 | 内置(LISTEN/NOTIFY,触发器)                | 自定义实现                              | 邮件通知功能                         |
    +-----------------------+------------------------------------------------+------------------------------------------+----------------------------------------+
这对我会有什么好处?

使用 PostgreSQL 和 pg_cron 进行任务调度和批处理管理提供了一种高效且集成的解决方案,为以数据库为中心的应用程序提供了一种流畅和集成的方式。它确保了事务完整性,并利用了 PostgreSQL 的任务调度功能。然而,对于更复杂的批处理和 ETL 任务,框架如 Spring Batch 这样的框架提供了更高级的功能和可扩展性。对于基本的时间基作业调度,Linux cron 依然是一种简单有效的解决方案,适用于相对简单的需求。选择取决于任务的复杂程度、事务完整性需求以及现有基础设施。

使用 Postgres 进行地理空间数据查询
使用PostGIS和PostgreSQL

PostGIS 扩展模块 :

  • 地理空间数据类型:PostGIS 为 PostgreSQL 添加了对地理对象的支持,使数据库能够存储、查询和处理空间数据类型。
  • 函数和索引:它提供了一整套完整的函数,用于空间查询和构建空间索引(例如,使用 GIST 的 R-树),来提升性能。

技能 :

  • 支持复杂查询:支持复杂的地理空间查询,包括距离计算、面积计算和空间关系(例如,相交、包含)。
  • 符合标准:遵循开放地理空间联盟(OGC)的标准,确保与其他地理空间系统的兼容性。
与其它地理空间系统的比较

这里是比较使用PostgreSQL和PostGIS(一个地理空间数据库扩展)与使用Maptitude、ArcGIS和Mapline的对比:

    +-----------------------+------------------------------------------+----------------------------------------+------------------------------------------+--------------------------------------+
    |        特性        |         PostgreSQL with PostGIS          |               Maptitude                |                  ArcGIS                  |               Mapline                |
    +-----------------------+------------------------------------------+----------------------------------------+------------------------------------------+--------------------------------------+
    | 数据类型            | 支持复杂的地理空间数据类型               | 主要是矢量和栅格数据                   | 全面(矢量、栅格等)                    | 基本的地理空间数据                    |
    | 查询语言            | 支持带地理空间扩展的SQL                  | 基于GUI的分析,有限的脚本支持           | 全面的脚本支持(Python等)              | 有限的查询功能                       |
    | 扩展性              | 高(随着PostgreSQL扩展)                 | 中等(取决于系统资源)                  | 高(企业级扩展性)                     | 中等(云端扩展性)                   |
    | 易用性              | 中等(需要SQL知识)                     | 简单(用户友好的界面)                  | 中等到高(高级功能支持)                | 简单(用户友好的界面)               |
    | 成本                | 免费(开源)                            | 商用(需要购买)                       | 商用(需要购买)                        | 订阅制                               |
    | 集成                | 无缝集成PostgreSQL和其他工具            | 单独的软件                             | 与ESRI产品广泛的集成                    | 与多种数据源集成                      |
    | 功能性              | 高级的空间功能和分析                    | 基本的空间分析                         | 高级的空间分析和建模                   | 基本的空间分析                       |
    | 社区和支持          | 强大的开源社区                          | 良好的客户支持                         | 优秀的客户服务和社区                    | 良好的客户支持                       |
    +-----------------------+------------------------------------------+----------------------------------------+------------------------------------------+--------------------------------------+
这对我会有什么好处呢?

使用 PostgreSQL 和 PostGIS 进行地理空间查询提供了一个强大、可扩展且成本效益高的解决方案,用于管理并分析空间数据。它特别适合需要高级的空间查询和与现有 PostgreSQL 数据库集成的应用。然而,对于专门的地理空间分析和友好的用户界面,商业系统如 Maptitude、ArcGIS 和 Mapline 可能提供更定制化的功能和更好的用户体验。选择取决于具体的功能需求、成本和易用性。

性质用Postgres做全文检索
PostgreSQL的全文检索

TSVector 和 TSQuery

(注:TSVector 和 TSQuery 是技术术语,通常用于描述文本搜索和处理中的向量和查询操作。)

  • 数据类型:PostgreSQL 使用 tsvector 和 tsquery 数据类型来存储和检索全文数据。
  • 索引:可以使用 GIN(通用倒排索引)和 GIST(通用搜索树索引)来提升搜索性能。

全文搜索功能

功能如下:

  • 搜索功能:PostgreSQL支持复杂的搜索查询,并对搜索结果进行加权和排名。
  • 词典支持:支持词干处理、停止词和同义词词典,从而提高搜索准确性。
与其它全文搜索引擎的比较

这里有一个关于使用PostgreSQL进行全文检索与Elastic、Solr、Lucene和Sphinx的详细对比:如下

    +-----------------------+------------------------------------+-----------------------------------------------+-----------------------------------------------+-------------------------------------------+-------------------------------------------------+
    |        功能          |             PostgreSQL             |                 ElasticSearch                 |                  Apache Solr                  |               Apache Lucene               |                     Sphinx                      |
    +-----------------------+------------------------------------+-----------------------------------------------+-----------------------------------------------+-------------------------------------------+-------------------------------------------------+
    | 索引                 | GIN, GIST                          | 倒排索引                                    | 倒排索引                                    | 倒排索引                                | 倒排索引                                      |
    | 查询语言             | SQL                                | DSL(领域特定语言)                          | DSL,Solr特有的语法                           | 基于Java的API                             | SphinxQL,SphinxAPI                           |
    | 扩展性               | 可与PostgreSQL扩展良好             | 优秀(分布式架构)                           | 优秀(分布式架构)                           | 优秀(高度可扩展)                          | 良好(扩展性好)                              |
    | 易用性               | 中等(需要SQL知识)                | 简单到中等(需要学习)                       | 简单到中等(需要学习)                       | 中等(需要一定的编程知识)                  | 中等(类似SQL的语法)                        |
    | 成本                 | 免费(开源)                       | 开源(有付费选项)                          | 开源(有付费支持)                          | 开源                                        | 开源                                          |
    | 集成                 | 无缝集成到PostgreSQL               | 可与多种工具集成                           | 可与多种工具集成                           | 作为库,用于其他系统                           | 可与多种工具集成                             |
    | 搜索功能             | 从基础到高级                        | 高级(全文搜索,分析)                      | 高级(全文搜索,分析)                      | 高级(核心库,灵活)                     | 高级(全文搜索,实时索引)                  |
    | 性能                 | 良好(适合多种使用场景)           | 高(优化搜索)                              | 高(优化搜索)                              | 高(优化搜索)                            | 高(优化搜索)                              |
    | 社区与支持           | 强大(PostgreSQL社区)             | 强大(活跃社区,企业支持)                  | 强大(活跃社区,企业支持)                  | 强大(作为核心库被广泛应用)             | 中等(活跃社区)                             |
    +-----------------------+------------------------------------+-----------------------------------------------+-----------------------------------------------+-------------------------------------------+-------------------------------------------------+
对我有什么好处?

使用 PostgreSQL 进行全文搜索对已经使用 PostgreSQL 的应用程序来说是一个强大而集成的解决方案,利用 SQL 的强大功能并确保数据一致性。然而,专用的搜索引擎如 ElasticSearch、Solr、Lucene 和 Sphinx 提供了专门的功能、先进的搜索能力以及在大规模分布式环境中更好的扩展性。选择取决于搜索需求的复杂程度、数据规模以及与现有系统的集成需求。

使用Postgres为API生成JSON数据
《用 PostgreSQL 生成 JSON 数据》

JSON 函数:

  • json_build_object : 在 SQL 查询中直接构建 JSON 对象。
  • json_agg : 将 SQL 查询结果汇总成一个 JSON 数组。

zh:好处

  • 消除中间件需求:在PostgreSQL中直接生成JSON可以消除服务器端代码格式化数据以供API使用的需要。
  • 性能:减少延迟,通过最小化数据库和应用层之间的数据传输和处理。
  • 简化系统架构:通过将数据转换逻辑集中到数据库内部来简化架构,使得开发更加便捷。
与Firebase和其他后端服务的比较:

这里详细对比了PostgreSQL的JSON生成能力与其他后端服务,比如Firebase。

    +------------------------+--------------------------------------+-----------------------------------------+----------------------------------------------------+
    |        功能         |     PostgreSQL (JSON生成)     |                Firebase                 |               其他后端服务               |
    +------------------------+--------------------------------------+-----------------------------------------+----------------------------------------------------+
    | 数据变换    | 数据库内JSON生成          | JSON存储和检索              | 变化(通常需要服务器端代码)           |
    | 性能        | 高(减少数据传输量)         | 高(实时更新)                | 变化                                            |
    | 易用性      | 中等(需要掌握SQL)    | 简单(用户友好的界面)          | 变化(可能需要复杂设置)               |
    | 扩展性      | 良好(随PostgreSQL扩展而扩展)        | 优秀(为扩展而构建)       | 变化                                            |
    | 集成        | 在PostgreSQL生态系统中无缝集成 | 与Firebase服务容易集成       | 变化(集成复杂性取决于服务)         |
    | 成本        | 免费(开源)                   | 免费但有付费选项(免费层和付费选项)  | 变化(可能包含免费和付费层)           |
    | 实时功能    | 有限(需要触发器)          | 内置实时数据库             | 变化                                            |
    | 安全性      | 高(PostgreSQL安全功能)  | 高(Firebase安全规则)          | 变化(取决于具体实现)                 |
    +------------------------+--------------------------------------+-----------------------------------------+----------------------------------------------------+
这对我有什么好处?

使用 PostgreSQL 生成供 API 使用的 JSON 是一种强大的方法,适用于那些能够从减少复杂性并提高性能中受益的应用程序。它通过在数据库内部直接创建 API 可用的 JSON 数据,消除了额外的服务器端处理需求。然而,对于实时功能、无缝集成和友好的用户界面,像 Firebase 这样的后端服务可能更适合。选择取决于应用程序的具体需求,包括性能要求、实时数据处理能力、集成的简便程度。

Postgres 的审计(使用 pgaudit)
pgaudit 在 PostgreSQL 中的使用

pgaudit 扩展模块

  • 功能 : pgaudit(PostgreSQL 审计插件)提供了对数据库活动的详细日志记录,包括 SELECT、INSERT、UPDATE、DELETE 操作以及 DDL 命令。
  • 配置 : 允许对哪些事件被记录进行细致的控制,有助于监控和审计数据库活动,以确保符合合规性和安全要求。

zh:优点

  • 全面的日志记录:捕获各种数据库事件。
  • 合规性:通过提供详细的审计跟踪帮助满足监管要求。
  • 集成:在PostgreSQL环境中无缝运行。
与其它变更数据捕获方案的比较

这里是一份关于使用PostgreSQL配合pgaudit与Hibernate Envers和Debezium的详细对比:

    +-----------------------+---------------------------------------+---------------------------------------+---------------------------------------------+
    |        特性          |        PostgreSQL with pgaudit         |           Hibernate Envers            |                  Debezium                   |
    +-----------------------+---------------------------------------+---------------------------------------+---------------------------------------------+
    | 目的                 | 数据库活动审计                       | 实体变更版本化                        | 变更数据捕获 (CDC)                         |
    | 集成                 | 与 PostgreSQL 集成                   | 与 Hibernate ORM 集成                | 通过 Kafka 连接数据库                      |
    | 粒度                 | SQL 命令级日志记录                   | 实体级版本化                          | 数据库中的行级变更                        |
    | 设置复杂度           | 中等(需要 PostgreSQL 配置)        | 中等(需要 Hibernate 配置)         | 高(需要 Kafka 设置)                      |
    | 性能影响             | 中等(日志记录开销)                | 低至中等(取决于使用)                | 低至中等(取决于数据量)                  |
    | 使用案例             | 安全、合规、审计                     | 审计应用程序级更改                    | 数据集成、微服务                          |
    | 实时处理             | 有限(基于日志)                    | 否(无)                              | 是(实时 CDC)                            |
    | 历史数据             | 数据库活动的详细日志                 | 实体版本历史                          | 实时捕获数据变更                          |
    | 成本                 | 免费(开源)                         | 免费(开源,Hibernate 的一部分)    | 免费(开源,Kafka 生态系统中的一部分)     |
    | 社区和支持           | 强大(PostgreSQL 社区)             | 强大(Hibernate 社区)              | 强大(Debezium 和 Kafka 社区)           |
    +-----------------------+---------------------------------------+---------------------------------------+---------------------------------------------+
我能得到什么好处?

使用 PostgreSQL 配合 pgaudit 进行审计可以提供一个强大的解决方案,用于捕获详细的数据库活动日志,有助于满足合规和安全要求。这尤其适合需要进行全面数据库级别审计的环境。Hibernate Envers 适合应用程序级别的变更跟踪,而 Debezium 在实时变更数据捕获方面表现出色,适用于数据集成和微服务环境。选择取决于特定的审计和变更跟踪需求、性能考量以及集成需求。

使用GraphQL适配器与Postgres一起使用

GraphQL 适配器:

  • 功能 :GraphQL适配器允许PostgreSQL数据库直接服务GraphQL查询。它们将SQL操作映射到GraphQL操作,提供了一个灵活的API接口层。
  • 好处 :这种配置提供了一种统一且高效的查询关系型数据的方式,并具备GraphQL的灵活性和强大功能。

整合

  • 直接映射:适配器(adapters)可以将数据库表和关联直接映射到 GraphQL 类型和解析器上,从而在无需服务器端代码的情况下执行动态查询操作。
  • 易于使用:通过减少中间件和自定义解析器逻辑的需求,简化了 API 开发。因此,API 开发变得更加简单。
GraphQL其他插件对比

以下是PostgreSQL配合GraphQL适配器与Prisma ORM及Apollo GraphQL对比的详细分析:

    +------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+
    |        特性         |     PostgreSQL with GraphQL Adapter     |                Prisma ORM                 |              Apollo GraphQL               |
    +------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+
    | 数据库集成   | 直接集成PostgreSQL               | 支持多种数据库                        | 需要单独的数据源                         |
    | 易用性        | 高(SQL到GraphQL的直接映射)    | 高(基于模式的方法)                  | 中等(需要解析器函数)                    |
    | 性能         | 高(针对PostgreSQL进行了优化)  | 高(高效地生成查询)                  | 高(针对GraphQL查询进行了优化)         |
    | 灵活性       | 中等(依赖于PostgreSQL模式)    | 高(可自定义的模式和解析器)         | 高(可自定义的解析器)                  |
    | 模式管理     | 自动基于数据库模式               | 通过Prisma模式管理                   | 通过GraphQL模式管理                      |
    | 实时功能     | 有限(依赖于实现)           | 良好(支持实时更新)                | 卓越(支持订阅)                        |
    | 设置复杂度   | 低到中等(简单设置)          | 中等(需要Prisma设置)              | 中等至高(需要Apollo设置)               |
    | 社区和支持  | 强大(PostgreSQL社区)           | 正在增长(活跃社区)                  | 强大(活跃社区和支持)                  |
    | 成本        | 免费(开源)                   | 免费(开源,但提供高级功能选项)      | 免费(开源,但提供高级功能选项)         |
    +------------------------+-----------------------------------------+-------------------------------------------+-------------------------------------------+
这对我有什么好处?

使用 PostgreSQL 和 GraphQL 适配器来直接从 PostgreSQL 数据库提供 GraphQL API 是一个有效的解决方案。这种方法同时利用现有的数据库结构并简化了 API 的开发。Prisma ORM 和 Apollo GraphQL 提供了更多的灵活性和高级功能,使其适合需要大量定制和实时功能的复杂应用。选择取决于具体需求,例如易用性、性能、实时功能和集成复杂度。

总结:总的来说

使用 PostgreSQL 作为多种后端功能的一体化解决方案可以显著简化您的技术堆栈。通过利用 PostgreSQL 的功能,您可以用 PostgreSQL 替换 Kafka、RabbitMQ、MongoDB 和 Redis 等多种专用技术。这种整合可以简化开发流程,让开发变得更高效,减少操作复杂性,同时降低系统中活动部件的数量。因此,开发人员可以更专注于为客户创造价值,从而在不增加额外成本的情况下提高功能输出。

这种方法不仅加快了开发速度,减少了风险,还减轻了开发人员的认知负担,加深了对系统的理解,从而提高了生产力。通过强大的审计支持、全文搜索、地理空间查询、JSON生成等多项功能,PostgreSQL证明了它是一个功能强大且灵活的数据库管理系统。用PostgreSQL简化你的技术栈,你拥抱了简洁性,为更高效有效的软件开发铺平了道路。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消