我有两个选择:
a) 将三个
smallint[]
(数组)属性添加到我的(主)表中,其中两个属性大部分时间为空/未使用,第三个属性将经常使用(从技术上讲,所有 3 个属性都可以在同一时间,但很少发生)。
b) 创建一个带有两个外键的新表:1 个 int-key (main) 和 1 个smallint-key 以及我需要的
smallint[]
数组。
我想在存储使用方面优化数据库,但在这方面几乎没有经验。
更容易实现的是空数组变体。快速测试空的smallint数组(相对于smallint数据类型)的大小让我不寒而栗:
根据 pgAdmin 4/postgres,它有 140 字节的差异(经验法则虚拟表测试结果),这意味着(如果为真)每个数据集/行有 280 字节的浪费。
这与 ChatGPT 声称的 24-32 字节相反。
即便如此,了解哪些选项可能比其他选项稍有优势可能会很有趣,但需要回答更重要的问题。
解决方案的属性版本中的部分或大部分数组将为空(或填充相同的值)这一事实表明数据库规范化受到侵犯。
因此只有一种合理的解决方案:选项b)
非常感谢@Tim Roberts 和@JohnH 为我指明了正确的方向(以及他们的反馈)。