mac*_*ost 3 postgresql knex.js
TLDR:如果我想在Postgres表中保存整数数组,那么使用数组列(integer[])与使用JSON列是否有任何利弊(例如,哪一个比另一个表现更好)?
背景故事:
我正在使用PostgreSQL数据库和Node/Knex来管理它.Knex没有任何直接定义PostgreSQL integer[]列类型的方法,所以有人提出了一个Knex错误要求它...但是其中一个Knex开发者关闭了该票证,基本上说没有必要支持PostgreSQL数组列类型当任何人都可以使用JSON列类型时.
我的问题是,使用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;
Run Code Online (Sandbox Code Playgroud)
收益:
array_size | jsonb_size | json_size
-----------+------------+----------
2024 | 6008 | 2396
Run Code Online (Sandbox Code Playgroud)
(我很惊讶JSON值比JSONB小得多,但这是一个不同的主题)
如果你总是将数组用作单个值,那么在查询性能方面并不重要但是如果你确实需要查看数组并搜索特定的值,那么使用本机数组会更有效率.
与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;
Run Code Online (Sandbox Code Playgroud)
如果数组包含一个特定值,则可以轻松查询该数组.这也适用于JSON数组.那些是表达array_single和json_single.使用本机阵列,您也可以使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |