postgresql - Postgres : Are There Downsides to Using a JSON Column vs. 一个整数 [] 列?

标签 postgresql knex.js


TLDR:如果我想在 Postgres 表中保存整数数组,使用数组列 (integer[]) 与使用数组列有什么优缺点?使用 JSON 列(例如,一个比另一个表现更好)?

背景故事:

我正在使用 PostgreSQL 数据库和 Node/Knex 来管理它。 Knex 没有任何方法可以直接定义 PostgreSQL integer[] 列类型,因此有人提交了一个 Knex 错误要求它......但是 Knex 开发人员之一关闭了票证,基本上是说当任何人都可以使用 JSON 列类型时,就不需要支持 PostgreSQL 数组列类型。

我的问题是,使用 JSON 列类型来保存简单的整数数组有什么缺点(如果有的话)?使用真正的数组列是否有任何好处(例如提高性能),或者仅将我的数组存储在 JSON 列中是否同样好?

编辑:明确地说,我要寻找的答案是以下之一:

A) 对 PostgreSQL 中 JSON 列和 integer[] 列如何工作的解释,包括一个如何优于另一个或两者如何(至少大致)相等。

B) 没有解释,但至少引用了一些基准,表明一种列类型或另一种表现更好(或两者相等)

最佳答案

int[] 在它需要的存储方面要高效得多。考虑以下查询,它返回具有 500 个元素的数组的大小

select pg_column_size(array_agg(i)) as array_size, 
       pg_column_size(jsonb_agg(i)) as jsonb_size,
       pg_column_size(json_agg(i)) as json_size
from  generate_series(1,500) i;

返回:

array_size | jsonb_size | json_size
-----------+------------+----------
      2024 |       6008 |      2396

(我很惊讶 JSON 值比 JSONB 小很多,但那是另一个话题)


如果您总是将数组用作单个值,那么它在查询性能方面并不重要但是如果您确实需要查看数组并搜索特定值,使用 native 数组会更有效。

native arrays 有更多的函数和运算符可用比 JSON 数组更多。您可以轻松地在 JSON 数组中搜索单个值,但搜索多个值需要解决方法。

以下查询证明:

with array_test (id, int_array, json_array) as (
  values
    (1, array[1,2,3], '[1,2,3]'::jsonb)
)
select id, 
       int_array @> array[1] as array_single,
       json_array @> '1' json_single,
       int_array @> array[1,2] as array_all,
       json_array ?& array['1','2'] as json_all,
       int_array && array[1,2] as array_any,
       json_array ?| array['1','2'] as json_any
from array_test;

如果数组包含一个特定值,您可以轻松查询它。这也适用于 JSON 数组。这些是表达式 array_singlejson_single。对于 native 数组,您也可以改用 1 = any(int_array)

但是检查数组是否包含列表中的所有值,或者列表中的任何值不适用于 JSON 数组。

上面的测试查询返回:

id | array_single | json_single | array_all | json_all | array_any | json_any
---+--------------+-------------+-----------+----------+-----------+---------
 1 | true         | true        | true      | false    | true      | false   

关于postgresql - Postgres : Are There Downsides to Using a JSON Column vs. 一个整数 [] 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592794/

相关文章:

postgresql - AWS ElasticBeanstalk amazon linux pg_config 与 psycopg2 错误

sql - 清除具有特殊字符和字母的电话号码

mysql - 如何在 knex.js 中运行带有输出返回的 mysql 存储过程

sql - 在连接表中的 SQL 中为每个 id 返回一个结果

javascript - Knex 从多个表中选择

javascript - 将 knex 的查询结果传递给变量

javascript - Promise Chain Breaks w/.all()

sql - postgres 分页的唯一排序顺序

postgresql - 将 dblink 生成的记录推出调用存储过程

postgresql - 从继承的表中获取每一行的表名