如何在 PostgreSQL 中存储多元组数组

j.d*_*doe 1 postgresql parsing database-design tuples multidimensional-array

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

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

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

Erw*_*ter 6

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

CREATE TYPE dd AS (a float8, b float8);
Run Code Online (Sandbox Code Playgroud)

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

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)'));
Run Code Online (Sandbox Code Playgroud)

有关的:

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

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

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

无论如何,实际的 Postgres 数组都更干净,因为 Postgres 不允许存储非法字符串。