【发布时间】:2021-12-06 17:58:41
【问题描述】:
我的问题主要与数据库存储/空间优化有关。我的数据库中有一个表 以下列:
-
id:主键整数
-
array_col:唯一文本[]
这个表是 - 迄今为止 - 数据库中最大的(就存储空间而言)并且包含大约 约 2 亿条记录。 array_col 有一些特征让我怀疑我 我没有以空间最佳的方式存储它。它们如下:
-
大多数字符串的长度都很合适(平均为 25 个字符)
-
文本数组的长度是可变的(通常每个数组有 100+ 个字符串)
-
各个字符串会在记录中以适当的频率重复。一般 给定的字符串将出现在数千条其他记录中。 (数组顺序趋于相似 也跨记录)
id array_col 1 […,"20 torque clutch settings",…] 2 […,"20 torque clutch settings",…] 3 […,"20 torque clutch settings",…] … … 上表显示了跨记录重复的值。
我不想规范化这个表,因为将文本数组视为一个原子单元是最 对我的应用程序很有用,它也使查询变得更加简单。我也关心的排序 数组中的字符串也是如此。
我可以想到两种方法来解决这个问题:
-
创建查找表以避免重复字符串。这里的假设是 INT[] 可能是 比 TEXT[] 更节省空间。
表 1
id array_col 1 […,47,…] 2 […,47,…] 3 […,47,…] … … 表 2
id name … … 47 "20 torque clutch settings" … … 问题: 据我所知,PostgreSQL 不支持外键数组。我也不确定触发器或存储过程会是什么样子。数据库一致性可能也会成为我更关心的问题。
-
ZSON ?,我没有使用此扩展程序的经验,但听起来它可以做一些事情 在创建常用字符串的查找表方面类似。据我了解,我会 需要将数组列转换为某种 JSON 字符串。
{"array_col":[…,“20 torque clutch settings”,…]}GitHub - postgrespro/zson: ZSON is a PostgreSQL extension for transparent JSONB compression
任何有关如何解决此问题的建议将不胜感激。做任何上述选择 在数据库设计方面似乎是合理的还是更好的长期方法?我目前正在使用 PostgreSQL 14 用于此。
【问题讨论】:
标签: sql postgresql database-design