Postgres: hstore与JSON大比拼

Postgres: hstore与json大比拼

和人们谈论Postgres发现了一个问题是hstore与json哪个更好。我该使用了哪个以及在哪种情况下使用。首先,如果你不熟悉,请查看关于它们的一些资料:

hstore on PostgresGuide

hstore in Postgres docs

hstore with Django

JSON datatype

JavaScript support in Postgres

如果你已经对它俩很了解了,但是还是迷惑该使用哪个,那我们深入讨论:

hstore

hstore 是键值对直接存储在你的数据中。它是我最爱的而且它已经存在了很长时间了。在处理数据模式(schema)时hstore可以给你很大弹性。如同你不用提前定义模式(models),但是它有两大局限:

1.它只处理文本。 

2. 它不支持全文档存储意味着你不能嵌套对象。

但是hstore主要特性包括可以在其上使用索引,众多操作符强有力支持,显而易见的,对数据的扩张性。一些基本的操作符包括:

返回列foo中关键字bar的值:


foo->"bar"
指定的列foo是否包含了关键字bar:


foo?"bar"
指定的列foo是否包含了键值对bar->baz:
foo@>"bar->baz"
也许hstore最有戏的部分是你可以在其上索引。Postgres特有的gin和gist允许你在hstore中索引所有的关键字和值。一个由Postgres专家Christophe Pettus的演讲指出了 hstore使用索引的一些性能详情,其中在某些情况下hstore使用git/gist在性能上完胜mongodb. 

Json

和hstore相比,JSON是全文档数据类型。另外它嵌套对象的特性可以帮助你支持很多不仅仅是文本,还可以读取数字的功能。如你使用json插入到postgres中它会自动保证它是合法的JSON格式,如果不是就会报错。JSON在Postgres 9.3会得到更好的支持,如一些自带的操作符,但是如果你现在需要更多的函数,你需要查看PLV8.

该使用哪个

在你的应用中哪个会是你实际想去使用的呢?如果你已经使用JSON以及简单的想存储在你的数据库中,那么JSON数据类型通常就是正确的选择。然而,如果你想在数据模型中寻找更大的弹性,那么hstore就是你所选之路。hstore会给你很多灵活性以及高性能的查询你的数据。当然在Postgres 9.3中会是全新的改变。

via hstore-vs-json


究竟什么才是最重要的问题?

Craig Kerstiens给出了两者类型的大概,我想给出一种快速粗糙的图来说明我会使用哪个在开发环境中。首先,hstore几乎在每种情况都比JSON性能上更优秀,但是性能只是当你开发系统所做那些烦人决策点之一如同彩虹中的一种颜色。

所以,我该怎么做?

  • 如果是以JSON格式从外部接受数据,想以分级格式存储它,它就会是一个性能问题因为它会花费一些时间来转换它为hstore格式。
  • 如果是从内部产生数据,而不是从它几乎完成的格式接受,并且分层不是很深,我会使用hstore,就为它更快的性能。
  • 如果保留值的类型是必需的,JSON就是不二选择,因为hstore存储所有的都是字符串格式。
  • 如果在键值对中全文档查询是必需的,当前hstore索引情况比JSON的更优秀。
  • 如果你仅仅查询前几条(1-3)记录,那么在关键字上使用b-tree索引比使用gist或者git索引更好; 在这个方面hstore没有比json更特别优点。

在我看来,随着JSON在PostgreSQL中支持越来越成熟,这种格局会有所改变,而且意义重大。但是这只是9.2情形。

via json-vs-hstore-which-will-get-you-into-a-cool-bar-in-the-mission

转载于:https://my.oschina.net/swuly302/blog/143746

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在执行 `docker tag postgres:latest myusername/postgres:latest` 命令时出现了 `Error response from daemon: No such image: postgres:latest` 的错误提示,可能是因为本地没有名为 `postgres:latest` 的镜像。在这种情况下,你需要先构建 `postgres` 镜像,然后再使用 `docker tag` 命令为其添加一个新标签。 请按照以下步骤操作: 1. 进入包含 `docker-compose.yml` 文件的目录。 2. 执行以下命令来构建 `postgres` 服务的镜像: ``` docker-compose build postgres ``` 该命令将会使用 `docker-compose.yml` 文件中定义的 `postgres` 服务的配置信息来构建镜像,并将其命名为 `postgres`。 3. 执行以下命令来查看构建的镜像: ``` docker images ``` 该命令将会列出本地所有的 Docker 镜像,你可以在其中找到刚刚构建的 `postgres` 镜像。 4. 执行以下命令来为 `postgres` 镜像添加一个新的标签: ``` docker tag postgres:latest myusername/postgres:latest ``` 该命令会将 `postgres:latest` 镜像的一个新标签 `myusername/postgres:latest`,以便将其推送到 Docker Hub 或其他镜像仓库中。 注意:在使用 `docker-compose build` 命令构建镜像时,Docker Compose 会根据 `docker-compose.yml` 文件中定义的服务配置信息来构建镜像。因此,如果你需要修改服务的配置信息,例如修改 `postgres` 服务的 Dockerfile 或其他构建参数,你需要在重新构建镜像前修改 `docker-compose.yml` 文件中相应的配置信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值