在PostgreSQL中表示稀疏数据矩阵的最佳方法是什么?我看到的两种明显的方法是:

  1. 将数据存储在一个表中,每个可能的功能(可能有数百万个)都有一个单独的列,但未使用的功能的默认值为NULL.这在概念上非常简单,但我知道在大多数RDMS实现中,这通常非常低效,因为空值通常会占用some个空间.然而,我读了一篇文章(不幸的是找不到它的链接),声称PG不占用空值的数据,这使它更适合存储稀疏数据.

  2. 创建单独的"行"和"列"表,以及一个中间表来链接它们,并将列的值存储在该行.我相信这是更传统的RDMS解决方案,但与之相关的复杂性和开销更大.

我还找到了PostgreDynamic,它声称可以更好地支持稀疏数据,但我不想为了这个功能而将整个数据库服务器切换到PG fork.

还有其他解决方案吗?我应该用哪一个?

推荐答案

我想到了一些解决方案,

1) 将要素分成通常一起设置的组, for each 组创建一个与主数据具有一对一外键关系的表,在查询时只对需要的表进行联接

2) 使用EAV反模式,使用主表中的外键字段、字段名和值列创建"功能"表,并将功能存储为该表中的行,而不是主表中的属性

3) 与PostgreDynamic的做法类似,为主表中的每个"列"创建一个表(它们为这些表使用单独的命名空间),并创建函数来简化(以及高效地索引)访问和更新这些表中的数据

4) 使用XML或VARCHAR在主数据中创建一列,并在其中存储一些表示数据的 struct 化文本格式,使用函数索引在数据上创建索引,编写函数来更新数据(如果使用该格式,则使用XML函数)

5) 使用contrib/hstore模块创建一个类型为hstore的列,该列可以保存键值对,并且可以索引和更新

6) 生活在许多空旷的田野里

Postgresql相关问答推荐

PostgreSQL权限如何工作?需要从表格中 Select 收件箱

如何高效地将行聚合到数组中,同时保留`NULL`来指示丢失的数据?

无法在PostgreSQL中创建方案和表

如何在 postgres where 子句中使用 or 对条件进行组合或分组

使用正则表达式计算 SQL 查询中 WHERE 过滤器的数量

表示 SQL 表的 Go struct

Postgis 不只使用索引扫描

如何在 psycopg2 中使用服务器端游标

Rails 4查询由单个属性唯一

?(问号)运算符在 Rails 中查询 Postgresql JSONB 类型

Postgresql SERIAL 的工作方式是否不同?

在这个 Dockerfile 中创建的 Postgres 用户名/密码在哪里?

在 PostgreSQL 中显示正在运行的查询的全文

为什么 rake db:migrate 有时会在 structure.sql 中添加尾随空格?

如何缩小 pg_toast 表?

PostgreSQL 表变量

PostgreSQL 条件 where 子句

如何将 PostgreSQL 查询输出导出到 csv 文件

如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?