首页 > 解决方案 > 如何在 PostgreSQL 中存储多个元组数组

问题描述

我有一个看起来像这样的数组[[(Double,Double)]]。它是一个多维元组数组。

这是我永远不会查询的数据,因为它不需要查询。只有在客户端这样才有意义。我正在考虑将整个内容存储为字符串,然后将其解析回多数组。

考虑到我最多可以有 20 个数组和 4 个最大内部数组,每个数组都有一个 2 Double 的元组,这会是一个好方法吗?解析会非常昂贵吗?
我将如何检查哪种方法更好,以及将其作为多维数组存储在 PostgreSQL 中是否是更好的方法?
我将如何存储它?

标签: postgresqlparsingmultidimensional-arraydatabase-designtuples

解决方案


要存储复合类型的数组(具有任何嵌套级别),您需要使用已注册的基类型。您可以有一个定义行类型的表,或者只是显式创建类型:

CREATE TYPE dd AS (a float8, b float8);

以下是构建您的二维数组的一些方法:

SELECT ARRAY [['(1.23,23.4)'::dd]]
     , (ARRAY [['(1.23,23.4)']])::dd[]
     , '{{"(1.23,23.4)"}}'::dd[]
     , ARRAY[ARRAY[dd '(1.23,23.4)']]
     , ARRAY(SELECT ARRAY (SELECT dd '(1.23,23.4)'));

有关的:

请注意,Postgres 数组类型dd[]可以存储具有任何嵌套级别的值。看:

这是否比仅存储字符串文字更有效text取决于您的用例的详细信息。

  • 数组类型占用 24 字节的开销加上元素值的通常存储大小。
  • float8(= double precision) 占用 8 个字节。文本字符串“1”在磁盘上占 2 个字节,在 RAM 中占 4 个字节。text“123.45678”在磁盘上占用 10 个字节,在 RAM 中占用 12 个字节。
  • Simpletext的读取和写入速度比相同大小的数组类型快一点。
  • text值被压缩(自动),这有利于存储大小(尤其是重复模式) - 但会增加压缩/解压缩成本。

在任何情况下,实际的 Postgres 数组都更干净,因为 Postgres 不允许存储非法字符串。


推荐阅读