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