写点什么

PostgREST:来自 GitHub 的 PostgreSQL API

  • 2015-07-27
  • 本文字数:1684 字

    阅读完需:约 6 分钟

1986 年,美国伯克利大学开始了由 DARPA NSF 等赞助的 POSTGRES 数据库项目的研究。该项目后来成功应用到财务数据分析系统、小行星跟踪数据库等多个领域。1994 年,Postgres95 继承了 POSTGREST 代码,并成为开源项目,供全世界用户免费使用。1996,该项目正式更名为 PostgreSQL 。目前,PostgreSQL 已经成为最先进的开源数据库系统,提供多版本并行控制,支持子查询 / 事物 / 用户自定义函数和类型等几乎所有 SQL 构件,并且可以获得 C/C++/Java/phthon 等很多语言的绑定。作为开源项目,PostgreSQL 的开发团队主要为志愿者。为了更好的促进 PostgreSQL 的发展和应用, GitHub 近期公开了为现有的 PostgreSQL 数据库提供 RESTful API 服务的 PostgREST API 。接下来,本文就对 PostgREST API 进行简要介绍。

首先,表征状态传输(REpresentational State Transfer,REST)描述了一个架构样式的网络系统,包含了一组架构约束条件和原则。作为RESTful API,PostgREST 则是满足了REST 要求的约束条件和原则。相比于一个新的API,它提供了一个更加简洁、更加与相关标准兼容和更快速的API。

目前,PostgREST 项目的源代码二进制文件都已经托管在GitHub 中。用户可以直接通过postgrest 命令,并配合db-port 等参数进行执行。在实际的使用中,参数列表还可以包含secure 选项,用于把所有的请求重定向到HTTPS 中。此外, herokuapp 网站还提供了演示案例。这些案例模拟 postman 等 HTTP 客户端向 demo 服务器发送请求。其中,演示数据库的结构由 begriffs/postgrest-example 定义。

在性能方面,PostgREST 表现优越。在 Heroku 中每秒至多 2000 个请求的情况下进行测试,PostgREST 保证了亚秒级的反应时间。这主要得益于三个方面:服务器由使用 Warp HTTP 服务器的 Haskell 所编写;把在 SQL 中进行串行化 JSON 反应、数据验证、身份忍者、数行和收回进行结合、在单个命令行中进行 Data post 等计算尽可能的放到数据库中;通过重新使用准备的声明、保持 db 连接池、使用 Postgres 二进制协议以及保持无状态以允许水平扩展等利用 Hasql 库实现数据库的高效使用。

在安全方面,PostgREST 处理身份认证,并把认证放置到数据库中定义的人员信息中,以保证只有一个单独的信任源。当与数据库进行交互时,服务器会使用当前认证的用户身份,并把连接持续期间能做的事情局限为当前用户的权限内。未来,PostgreSQL 9.5 将会支持行级别安全(row-level security)。同时,还没有被实现的安全机制也能够利用trigger 和security-barrier view 进行仿真。由于数据库的访问都因为使用 leakproof 函数而局限在一定的模板内,触发器并不会损害行级别的安全。

在版本(versioning)方面,PostgREST 通过 HTTP 内容协商支持多版本共存。来自某个版本的请求会被翻译成为数据库中表格内容的交换。而 PostgreSQL 策略搜索路径允许来自之前版本的表格在后续版本中进行完全重用。文档方面,PostgREST 并没有采用传统的用户自行编写和维护文档的方式。它采用 HTTP 让 API 解释自己的可供性(affordance)。所有的 PostgREST 路径都会对 OPTIONS 进行反应,解释他们所支持的内容以及 JSON 负载的数据格式。

最后,在数据完整性方面,postgrest 并不依靠 Object Relational Mapper 和自定义的命令代码。该系统需要用户把声明式约束直接放到数据库中。这样,没有任何应用可以对数据造成破坏。此外,PostgREST 还在 HTTP 接口设置了安全守卫(safeguard),从而避免强制 idempotent PUT 请求等情况的出现。

未来,PostgREST 会继续进行更新。其未来的特性包括:利用 socket 和 Postgres pubsub 来观察路径的变化、制定每个 view 的 HTTP 缓冲、从 Postgres 状态收集器中推断出好的默认抓取策略、产生测试客户端的 mock 数据、每个用户维护单独的连接池以避免‘set/reset role’导致的性能下降、利用链路头描述更多的关系等。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-07-27 08:486169
用户头像

发布了 268 篇内容, 共 128.3 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

如何优化多表查询情况下的查询性能问题

迹_Jason

数据库设计 架构设计 查询优化 数据优化

正则表达式知识总结

iHTC

正则表达式

第四周 系统架构学习总结

蓝黑

极客大学架构师训练营

一个草根的日常杂碎(10月11日)

刘新吾

随笔杂谈 生活记录 社会百态

Guava-技术专题-Cache用法介绍

码界西柚

区块链需与5G等技术打好“组合拳”

CECBC

区块链 5G

容器技术之发展简史

阿里云基础软件团队

云原生

SpringBoot-技术专题-多环境下maven打包

码界西柚

JDK14性能管理工具:jmap和jhat使用介绍

程序那些事

内存泄露 JDK14 jmap jhat

CECBC区块链专委会副主任吴桐主讲全国社保基金数字货币讲座

CECBC

区块链 数字货币

当我们在谈论跨平台的时候 ——— 我们在说什么

iHTC

跨平台

面经手册 · 第13篇《除了JDK、CGLIB,还有3种类代理方式?面试又卡住!》

小傅哥

Java 字节码编程 asm 动态代理 cglib

你不知道的java对象序列化的秘密

程序那些事

Java java序列化 序列化的秘密

华为程序员发现孩子不是自己的,怒提离婚!女方不要孩子!绿他的竟然是个酒吧混混!

程序员生活志

华为 程序员

一个草根的日常杂碎(10月9日)

刘新吾

随笔杂谈 生活记录 社会百态

每个数据科学家都应该知道的5个概念

计算机与AI

学习 数据科学

为什么学Go(二)

soolaugust

Go 语言

Java-技术专题-Pattern类与Matcher类详解

码界西柚

通俗易懂和你聊聊寄存器那些事(精美图文)

苹果看辽宁体育

后端 计算机 汇编

一个草根的日常杂碎(10月10日)

刘新吾

随笔杂谈 生活记录 社会百态

优质数据库管理工具盘点,看看这三个软件的区别

BinTools图尔兹

数据库 sql 云原生 工具 编辑器

【高并发】面试官:讲讲高并发场景下如何优化加锁方式?

冰河

性能优化 高并发 线程安全 同步 加锁

融合与共生之下,区块链都能“+”什么?

CECBC

区块链 大数据

JVM系列笔记 - 寄存器

朱华

JVM

Apple Developer 开发者账号申请&实名认证【2020】

iHTC

Apple Developer iOS Developer 苹果实名认证

第四周总结

_

极客大学架构师训练营 第四周总结

我们可以把Adapter精简到什么地步

mengxn

RecyclerView BetterAdapter Adapter

商业模式和盈利模式的思考

iHTC

商业模式 盈利模式 地摊经济

iOS Handle Refunds 处理退款 --- WWDC20(Session 10661)

iHTC

WWDC2020 wwdc iap 苹果退款 iOS退款

随想

Nydia

极客时间 - 架构师一期 - 第四周作业

_

第四周作业 架构师一期

PostgREST:来自GitHub的PostgreSQL API_GitHub_张天雷_InfoQ精选文章