Postgres中实现支持BSON数据格式的插件扩展


PostgresBSON :一个新的实验性扩展,为Postgres引入了BSON支持。BSON是起源于MongoDB的数据格式。

此 PostgreSQL 扩展实现了 BSON 数据类型,以及创建和检查 BSON 对象的函数,以实现表达和高性能查询。

BSON与内置的json/jsonb数据库有什么不同?

  • * BSON允许表示不属于JSON规范的数据类型(日期/时间,BinData等)。
  • * 与protobuf一样紧凑--更少的时间和资源花费在序列化/序列化上。
  • * 在扩展库中的更多信息 

BSON ( http://bsonspec.org/ ) 是一种类似于 JSON 的高性能、类型丰富的数据载体,但提供了许多有吸引力的功能,包括:

  • 日期时间、十进制(数字)和字节[] 是第一类类型。在纯 JSON 中,这些都必须表示为字符串,需要转换,可能会引入损耗,并损害本机操作(如>和 )<=。
  • 表现。在某些情况下,将二进制 BSON 移入和移出数据库几乎比使用本机快 10 倍jsonb,json因为它避免了字符串与字典之间的转换。
  • 往返能力。BSON 是二进制规范,而不是字符串。没有空格、引用规则等。进入 Postgres 的 BSON每次都会以完全相同的方式出现。
  • 标准 SDK 实现超过 20 种语言

下面是一个典型的处理链示例:Java 程序 -> 消息总线 -> python util -> 保存到数据库 -> 插入触发器唤醒其他 Java 程序:

  • Java 程序构建一个 org.bson.Document(它支持 java.util.Map 接口),例如:doc.put("name", "Steve"), doc.put("balance", new BigDecimal("143.99")) 等。
  • Java 程序使用 Java BSON SDK 将 org.bson.Document 编码为 BSON byte[]。
  • Java 程序将 byte[] 发布到 Kafka 主题。
  • python 监听器唤醒主题并接收 byte[]。
  • python 监听器使用 python BSON SDK 将 byte[] 解码为 dict,而不是字符串。它是一个完全重组的 dict 对象,带有子结构:datetime.datetime 用于日期字段,Decimal 用于便士精度字段等。监听器会打印一些内容,但不会改变 dict 中的任何内容。
  • python 监听器将 dict 编码为 byte[],并使用 psycopg2 模块将其 INSERT 到 Postgres 中的 BSON 列。
  • 另一个 Java 程序在 Postgres 插入触发时唤醒,并以 byte[] 的形式 SELECT BSON 列(例如,select bson_column::bytea where ...)
  • 这个byte[]与步骤 2 中创建的byte[]完全相同。

该扩展提供两种访问器套件:

1、类型安全的高性能访问器函数采用点路径表示法来访问字段,例如
select bson_get_datetime(bson_column, 'msg.header.event.ts') from table;

2、箭头和双箭头运算符类似于 JSON 类型中的运算符,例如
select (bson_column->'msg'->'header'->'event'->>'ts')::timestamp from table;