在PostgreSQL中表示稀疏数据矩阵的最佳方法是什么?我看到的两种明显的方法是:
将数据存储在一个表中,每个可想到的功能(可能是数百万个)具有单独的列,但未使用的功能的默认值为NULL。从概念上讲这很简单,但是我知道在大多数RDMS实现中,这通常效率很低,因为NULL值通常会占用 一些 空间。但是,我读了一篇文章(不幸的是找不到它的链接),该文章声称PG不会占用NULL值的数据,这使其更适合存储稀疏数据。
创建单独的“行”和“列”表,以及一个中间表以链接它们并在该行存储该列的值。我相信这是更传统的RDMS解决方案,但是与此相关的复杂性和开销却更大。
我还找到了PostgreDynamic,声称可以更好地支持稀疏数据,但是我不想仅出于此功能将整个数据库服务器切换到PG分支。
还有其他解决方案吗?我应该使用哪一个?
我想到了一些解决方案,
1)将要素分为通常设置在一起的组,为每个组创建一个与主数据具有一对一外键关系的表,仅在查询时联接需要的表
2)使用EAV反模式,使用主表中的外键字段以及字段名和值列创建一个“功能”表,并将功能存储为该表中的行而不是主表中的属性桌子
3)与PostgreDynamic的操作类似,为主表中的每个“列”创建一个表(它们为这些表使用单独的命名空间),并创建函数来简化(以及有效地建立索引)访问和更新数据。那些桌子
4)使用XML或VARCHAR在主数据中创建一列,并在其中存储一些表示您数据的结构化文本格式,使用功能索引在数据上创建索引,编写函数以更新数据(或在您使用XML函数的情况下使用XML函数正在使用该格式)
5)使用contrib / hstore模块创建一个类型为hstore的列,该列可以保存键值对,并且可以进行索引和更新
6)住很多空旷的田野