PostgreSQL 数据库

本文介绍了PostgreSQL数据库,强调其在存储和处理JSON数据方面的优势。内容包括PostgreSQL的基础知识,如何创建和插入JSON数据,查询JSON数据的运算符,JSON与JSONB的区别以及在工程项目中的选择,以及如何使用jsonb创建索引。最后提到了使用psycopg2模块连接Python进行数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL 数据库

一 :简介

PostgreSQL是关系数据库,支持json。语法和mysql类似。事实上,PostgreSQL,MongoDB(NoSQL),mysql均支持json,但从丰富度、速度等等各方面而言,PostgreSQL > MongoDB > >mysql(个人认为)。
因此在存储NoSQL类型数据时,以json方式存储时,PostgreSQL为最优。

二:PostgreSQL基础

(一):创建表

CREATE TABLE orders (
 ID serial NOT NULL PRIMARY KEY,
 info json NOT NULL
);

注意这里我们要存储的是json类型数据,因此每次插入时插入的都是各种json数据。而关系型数据库需要有唯一性约束,因此需要另外一个唯一性数据,此处为id,作为主键。 serial 表示插入数据时,不需要指定ID段的值,即只需要指定info段的json数据值即可,ID段的值会自动从一递增。此时,ID值每行都不相同,满足唯一性约束。

(二):插入json数据
插入前,首先得保证插入数据为正确的json格式。
插入一条数据:

INSERT INTO orders (info)
VALUES
 (
 '{ "customer": "sjk66", "items": {"product": "Beer","qty": 6}}'
 );

也可以一次性插入多条数据:

INSERT INTO orders (info)
VALUES
 (
 '{ "customer": "Lily Bush", "items": {"product": "Diaper","qty": 24}}'
 ),
 (
 '{ "customer": "Josh William", "items": {"product": "Toy Car","qty": 1}}'
 ),
 (
 '{ "customer": "Mary Clark", "items": {"product": "Toy Train","qty": 2}}'
 );

(三):查询json数据
PostgreSQL 提供了两个原生运算符来查询 JSON 数据:

  • -> 运算符通过键来返回 JSON 对象
  • ->> 运算符将 JSON 对象返回为文本
  • #> 运算符通过路径返回文本

(四):json 和 jsonb的区别和选择
两者从用户操作的角度来说没有区别,区别主要是存储和读取的系统处理(预处理)和耗时方面有区别。json写入快,读取慢,jsonb写入慢,读取快。
具体来说的话,
Json 数据类型:

  • json 数据类型储存输入文本的精确拷贝,处理函数在每次执行的时候,都必须对这些文本重新进行分析。
  • json 数据类型会保留文本中与 Json 语义完全无关的空白字符,各个键在 Json 对象内的排列顺序以及具有相同键的值。

Jsonb 数据类型:

  • Jsonb 数据类型以无压缩(decomposed)二进制格式来储存数据,因为格式转换带来的花销,这种类型在处理输入的时候速度会稍微慢一些,但是因为这种类型的数据并不需要重新进行分析,所以这种数据的处理速度会明显地快很多。
  • jsonb 支持索引特性,这是一个明显的优点。
  • jsonb 不会保留任何无关的空白,不会保留对象键的排列顺序,也不会保留任何重复的对象键。如果输入里面指定了重复的键,那么只有最后一个值会被保留。
  • jsonb 类型可以检测一个 jsonb 值是否包含了另一个 jsonb 值,而 json 类型并不具备这样的特性。
  • jsonb 会拒绝那些超出 PostgreSQL 数字类型范围的数字,而 json 则不会这样做。

jsonb支持更多的操作符@>,?等,具体可以在https://www.postgresql.org/docs/9.4/functions-json.html查看,
另外还有一些json和jsonb处理函数也可以在上述网站查看。

所以,从工程项目的角度,建议josnb。

(五):josnb的索引
jsonb类型的列上可以直接建索引,支持BTree索引和GIN索引(通用倒排索引)。其中,GIN索引可以高效的从JSONB内部的key/value对中搜索数据,因此JSONB类型上常用GIN索引。
JSONB上创建GIN索引的方式有两种:

  • (1)使用默认的jsonb_ops操作符创建。

  • (2)使用jsonb_path_ops操作符创建。

    两者的区别是:

  • (1)jsonb_ops的GIN索引中,JSONB数据中的每个key和value都是作为一个单独的索引项。

  • (2)jsonb_path_ops只为每一个value创建一个索引项。

    例如,一个项{“foo”:{“bar”:“baz”}},jsonb_ops会分别为“foo”,“bar”,"baz"创建索引项,共创建了三个。jsonb_path_ops则是把“foo”,“bar”,"baz"组合成一个hash值作为索引项。因此,通常jsonb_path_ops的索引较小。

因此,jsonb_path_ops类型的索引比jsonb_ops的小,但查询速度比jsonb_ops慢,为性能考虑,一般考虑jsonb_ops。

三:PostgreSQL与python的连接——psycopg2

PostgreSQL可以使用psycopg2模块与Python集成。
具体操作可以百度,基本上python连接mysql的操作类似,此处不再过多解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值