pg 相对于其它关系型数据库的一大优势就在于成熟的复杂类型支持,包括数组、JSON 对象、HStore 等等。
pg 的数组功能非常强大,支持类型数组、多维数组、定长数组。
定义一个简单的数组列:
CREATE TABLE sample_table (
array_example integer[],
);
对应插入语句:
INSERT INTO sample_table VALUES (
'{10000, 10000, 10000, 10000}'
);
定长多维数组:
CREATE TABLE tictactoe (
squares integer[3][3]
);
对应的插入:
INSERT INTO tictactoe VALUES (
'{{1,2,3},{4,5,6},{7,8,9}}'
);
数组的查询几乎只能手动匹配,例如:
SELECT * FROM sample_table WHERE
array_example[1] = 10000 OR
array_example[2] = 10000 OR
array_example[3] = 10000 OR
array_example[4] = 10000;
pg 支持 JSON,具体来说是支持 json 和 jsonb 两种格式,两者的使用上几乎一样,区别在于存储形式和性能上。json 格式只是对输入文字进行简单的存储,每次查询都需要重新执行 JSON 解析。而 jsonb 存储的是解析后的二进制格式,因此存储时会稍稍慢于 json 格式,但是查询时要快速很多。默认情况下,jsonb 并不保护空格。
另外,存储 JSON 格式时还需要注意下 Unicode 的处理。
jsonb 格式的另一个优点在于支持 GIN 索引。
参考: